본문 바로가기
프론트엔드 HTML CSS JAVASCRIPT

[HTML, CSS] opacity로 요소, 배경화면 투명하게(흐리게)하는 방법, 자식 요소에 같이 적용되는 문제

by jaewooojung 2019. 8. 14.

HTML CSS


HTML 요소의 배경화면 투명하게 만드는 방법

CSS의 opacity를 활용하여 HTML 요소를 투명하게 만드는 방법, 특히 자식 요소는 제외하고 배경화면만 투명하게 만드는 방법에 대해서 살펴보겠습니다.

 

div와 그 자식 요소 h1입니다.

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="reset.css" />
    <style>
      .container {
        width: 100%;
        height: 100%;
        text-align: center;
        background: url("./images/sunrise.jpg");
      }
      .title {
        font-size: 100px;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <h1 class="title">Hello</h1>
    </div>
  </body>
</html>

div와 h1

 

배경화면을 흐리게 하기 위해 opacity를 적용하겠습니다.
opacity는 0~1 사이의 값으로 설정할 수 있습니다.

기본값은 1이고 0으로 갈수록 투명해집니다.

.container {
  width: 100%;
  height: 100%;
  text-align: center;
  background: url("./images/sunrise.jpg");
  opacity: 0.5;
}

opacity 적용

 

opacity를 0.5로 적용했습니다.

 

단순히 투명도를 조절할 때에는 이처럼 간단히 해결할 수 있습니다.

그런데 위 사진은 자식요소(h1)의 텍스트를 포함하고 있는데, 자세히 보시면 이 텍스트까지 함께 흐려졌습니다. 

 

이처럼 자식요소를 가진 배경화면을 opacity로 흐리게 할 때에는 자식요소들도 모두 투명해지기 때문에 다른 방법을 사용해야 합니다.

 

가상 요소(::after) 사용

자식요소를 제외하고 배경화면만 투명하게 만들기 위해서는 배경화면의 가상요소를 생성한 후 그 가상요소에 배경 이미지와 투명도를 지정해 주면 됩니다.

.container {
  width: 100%;
  height: 100%;
  text-align: center;
}
.container::after {
  width: 100%;
  height: 100%;
  content: "";
  background: url("./images/sunrise.jpg");
}

 

container에서 opacity를 지우고, background 속성을 가상요소로 옮겨주었습니다.


가상요소의 크기는 100%로 설정함으로써 원본(container)과 동일하게 맞춰주었고 이 요소는 배경이미지로 채워질 것이므로 content는 빈 문자열("")로 설정하였습니다.

다음으로 container와 그 가상요소의 position을 설정합니다.

.container {
  width: 100%;
  height: 100%;
  text-align: center;
  position: relative;
}
.container::after {
  width: 100%;
  height: 100%;
  content: "";
  background: url("./images/sunrise.jpg");
  position: absolute;
  top: 0;
  left: 0;
}

가상요소가 원본의 전체를 차지하도록 position, top, left 속성을 지정해 주었습니다.

 

현재 상태입니다.

가상요소 생성 직후

 

화면에 보이는 이미지는 가상요소(container::after)의 배경 이미지입니다.
현재 자식 요소(h1)는 이 가상요소에 가려져 보이지 않습니다.

z-index 설정으로 가상요소를 원본(container)의 뒤로 밀어줍니다.

"뒤로 밀어준다"는 것은 z 축(우리 눈으로부터 화면까지의 직선 방향의 축)을 기준으로 더 화면 쪽으로 밀어준다는 의미입니다.

.container {
  width: 100%;
  height: 100%;
  text-align: center;
  position: relative;
  z-index: 1;
}
.container::after {
  width: 100%;
  height: 100%;
  content: "";
  background: url("./images/sunrise.jpg");
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
}

가상요소를 원본의 뒤로 밀어줌

 

가상요소가 뒤쪽으로 밀리면서 원본과 원본의 자식 요소(h1)가 화면에 나타났습니다.
("나타났다"라고 표현했지만 원본의 background 속성은 지웠기 때문에 여기서의 원본은 눈에 보이지 않습니다.)

 

마지막으로 가상요소의 opacity를 설정합니다.

.container {
  width: 100%;
  height: 100%;
  text-align: center;
  position: relative;
  z-index: 1;
}
.container::after {
  width: 100%;
  height: 100%;
  content: "";
  background: url("./images/sunrise.jpg");
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
  opacity: 0.5;
}

가상요소에 opacity 적용

 

원본과 자식 요소는 그대로인 채 가상 요소의 opacity만 적용되었습니다.

 

정리하면

  1. div의 가상요소를 생성한다.
  2. background 속성을 통해 가상요소에 배경이미지를 설정한다.
  3. 가상요소를 뒤쪽으로 밀어준다.
  4. 원본과 그 자식요소가 화면에 나타난다.
  5. 가상요소에 opacity를 적용하면 원본과 자식을 제외한 배경이미지만 흐려진다.


        
답변을 생성하고 있어요.