CSS 배경 이미지 불투명도?


82

CSS를 사용하여 텍스트 또는 이미지에 투명한 배경을 제공하는 방법과 관련이 있습니까? ,하지만 약간 다릅니다.

색상뿐만 아니라 배경 이미지 의 알파 값을 변경할 수 있는지 알고 싶습니다 . 분명히 다른 알파 값으로 이미지를 저장할 수 있지만 알파를 동적으로 조정할 수 있기를 원합니다.

지금까지 내가 가진 최고는 :

<div style="position: relative;">
    <div style="position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px;
                      background-image: url(...); opacity: 0.5;"></div>
    <div style="position: relative; z-index: 1;">
        <!-- Rest of content here -->
    </div>
</div>

작동하지만 부피가 크고 추악하며 더 복잡한 레이아웃에서 일을 엉망으로 만듭니다.


1
배경 이미지 뒤에 무엇이 있습니까? 단색 또는 다른 이미지?
Eric

@Eric : 나는 이것과 관련된 특정 사례를 언급하는 것이 아니라 문제에 대한 일반적인 해결책을 찾으려고 노력하고 있습니다.
Niet the Dark Absol 2011-07-31

1
@Kolink : 배경 이미지를 페이드해야하는 시나리오를 생각하고 있습니다.
에릭

글쎄요, 저는 온라인 브라우저 게임을 개발하고 있으며,이 가변 불투명도 배경 이미지를 필요로하는 애니메이션에서 제가하고 싶은 몇 가지 작업이 있습니다.
Niet the Dark Absol 2011-07-31

답변:


17

배경이 반복 될 필요가없는 경우 불투명도가 다른 모든 이미지를 하나 (서로 옆)에 넣은 다음 background-position.

또는 대상 브라우저가 여러 배경 (Firefox 3.6+, Safari 1.0+, Chrome 1.3+, Opera 10.5+, Internet Explorer 9+)을 지원 하는 경우 동일한 부분적으로 투명한 배경 이미지를 두 번 이상 선언 할 수 있습니다 . 이러한 여러 이미지의 불투명도가 합산 될수록 더 많은 배경을 정의 할 수 있습니다.

이 투명 필름을 결합하는 과정을 알파 블렌딩 이라고 하며 (@IainFraser에게 감사드립니다) :

αᵣ = α₁ + α₂(1-α₁)여기서, α0과 1 사이의 범위이다.


10
다중 배경 기술에 대한 한 가지주의 사항은 불투명도가 합산되지 않고 증가한다는 것입니다. 50 % 불투명도 이미지 두 개를 오버레이하면 75 % 불투명도 이미지 하나가됩니다. 다른 하나를 추가하면 불투명도가 87.5 %, 다른 하나는 93.75 %로 이동합니다. 수학적으로 총 불투명도에 접근하지만 실제로는 100 %에 도달하지 않습니다. 그러나 실제로 반올림 덕분에 50 % 불투명도 이미지를 100 %로 만들려면 9 개의 스택이 필요합니다.
Iain Fraser

3
수학적으로 기울어 진 사람들을 위해 스택에 다른 반투명 이미지를 추가하면 전체 불투명도에 어떤 영향을 미치는지 계산하는 방법이 있습니다. stacked_opacity = current_opacity+((1-current_opacity)*single_opacity) 따라서 현재 불투명도가 0.25이면 다른 이미지를 추가하면 0.4375가됩니다. 0.25+((1-0.25)*0.25) = 0.4375 다른 하나를 추가하면 0.578125가됩니다. 0.4375+((1-0.4375)*0.25) = 0.578125
Iain Fraser

46

CSS 생성 콘텐츠로 희미한 배경을 할 수 있습니다.

http://jsfiddle.net/gaby/WktFm/508/의 데모

HTML

<div class="container">
        contents
</div>

CSS

.container{
    position: relative;
    z-index:1;
    overflow:hidden; /*if you want to crop the image*/
}
.container:before{
    z-index:-1;
    position:absolute;
    left:0;
    top:0;
    content: url('path/to/image.ext');
    opacity:0.4;
}

그러나 생성 된 콘텐츠를 수정할 수 없으므로 불투명도를 수정할 수 없습니다.

그래도 클래스 및 CSS 이벤트로 조작 할 수 있습니다 ( 하지만 필요에 맞는지 확실하지 않음 ).

예를 들면

.container:hover:before{
    opacity:1;
}

최신 정보

CSS 전환을 사용하여 불투명도를 애니메이션 할 수 있습니다 ( 다시 클래스를 통해 ).

http://jsfiddle.net/gaby/WktFm/507/의 데모

첨가

-webkit-transition: opacity 1s linear;
-o-transition: opacity 1s linear;
-moz-transition: opacity 1s linear;
transition: opacity 1s linear;

받는 사람 .container:before규칙 1 초에 1 불투명도 애니메이션을 만들 것입니다.

적합성

  • FF 5 ( 4 개도 가능 하지만 설치되어 있지 않습니다. )
  • IE 9 실패 ..
  • Webkit 기반 브라우저는 실패합니다 ( Chrome은 이제 v26을 지원합니다-이전 버전도 지원하지만 현재 빌드로 확인 했음 ).하지만 그들은 인식하고 작업 중입니다 ( https://bugs.webkit.org/show_bug.cgi?id= 23209 )

.. 그래서 지금은 최신 FF 만 지원합니다 .. 하지만 좋은 생각 이네요. :)


1
FF5에서 나에게 꽤 멋져 보인다. 의사 요소에 url속성 이 있다는 것을 완전히 잊고 사용하여 시도했지만 backgroundZ- 색인 문제 (아래 콘텐츠)를 해결할 수 없습니다.
Wesley Murch 2011

답변은 감사하지만 Firefox가 다른 것들과 얼마나 잘 작동하는지 고려할 때 (모든 곳에서 메모리 누수, JS의 끔찍한 지연, IE6만큼 느리고 IE7보다 확실히 느립니다 ...) 더 많은 크로스 브라우저를 찾고 있습니다. 해결책.
Niet the Dark Absol 2011

@WesleyMurch, 나는 전혀 다른 주제에 CSS를 봐, JQuery와 질문이 당신을 요청할 수 있습니다 stackoverflow.com/questions/14137378/...
Istiaque 아메드

24
.class {
    /* Fallback for web browsers that doesn't support RGBa */
    background: rgb(0, 0, 0);
    /* RGBa with 0.6 opacity */
    background: rgba(0, 0, 0, 0.6);
}

복사 출처 : http://robertnyman.com/2010/01/11/css-background-transparency-without-affecting-child-elements-through-rgba-and-filters/


9
내가 충분히 명확하지 않았을 수도 있습니다. 배경 이미지를 부분적으로 투명하게 만들고 싶습니다 .
Niet the Dark Absol 2013

@NiettheDarkAbsol 당신은 "해결 방법"을 원하지 않는다는 것이 분명했지만 예제를 제공했고 대답은 "NO YOU CA N'T"입니다. 따라서이 예제는 이미지 뒤에 단색 배경이있는 시나리오 (주지는 않지만 거부하는 경우)에서 작동합니다. rgba가 뒷면 색상과 일치하도록 이미지 위에 다른 배경을 추가하십시오. "효과"는 이미지가 투명 해 보이는 것입니다. 이 질문은 "아니오, 할 수 없습니다"로 해결되었으므로 행복하게 답변을 받거나 다른 질문을 열어야합니다.
sergio

3
@sergio이 답변은 배경색을 부분적으로 투명하게 만드는 방법을 알려줍니다 . 내가 말했듯이 배경 이미지 에 대한 질문을 제외하면 훌륭 합니다 .
Niet the Dark Absol 2014

13

이 트릭을 시도하십시오 .. (삽입) 옵션과 함께 CSS 그림자를 사용하고 예를 들어 깊은 200px를 만드십시오.

암호:

box-shadow: inset 0px 0px 277px 3px #4c3f37;

.

또한 모든 브라우저 :

-moz-box-shadow: inset 0px 0px 47px 3px #4c3f37;
-webkit-box-shadow: inset 0px 0px 47px 3px #4c3f37;
box-shadow: inset 0px 0px 277px 3px #4c3f37;

상자를 채우려면 숫자를 늘립니다. :)

즐겨!


1
이것은 OP가 원하는 것에 대해 작동하지 않지만 내 요구 사항을 완벽하게 채 웁니다.
RozzA

@rozzA OP는 배경에 다른 이미지가 있다고 말하지 않았습니다. 사실 그는 배경의 불투명도를 변경할 수 있는지 여부 만 알고 싶었고 "아니요"라고 대답했습니다. 이것은 좋은 접근 방식이지만 rgba 투명도로 새로운 배경을 추가하는 것과 다르지 않습니다.
sergio

6

투명한 배경을 원하는 요소 안에 두 번째 요소를 넣을 수 있습니다.

<div class="container">
    <div class="container-background"></div>
    <div class="content">
         Yay, happy content!
    </div>
</div>

그런 다음 '.container-background'를 절대적으로 상위 요소를 덮도록 배치합니다. 이 시점에서 '.container'내부 콘텐츠의 불투명도에 영향을주지 않고 불투명도를 조정할 수 있습니다.

.container {
    position: relative;
}
.container .container-background {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: url(background.png);
    opacity: 0.5;
}
.container .content {
    position: relative;
    z-index: 1;
}

이것은 내가 질문에서 사용한 "핵"과 정확히 같지 않습니까?
Niet the Dark Absol 2013

1
흠 ... 제 생각 엔 당신에게 효과가없는 게 뭔지 이해가 안 돼요 나는이 방법을 사용하고 잘 작동합니다.
Alex K

1
그것은 당신의 해킹과 똑같습니다. 그러나 당신은 예제와 당신의 코멘트를 꺼려하기 때문에 "@Eric : 나는 이것에 대해 어떤 특정한 경우를 언급하는 것이 아닙니다. 문제에 대한 일반적인 해결책을 찾으려고합니다."당신은 원하는 것은 해킹이나 특정 시나리오에서 작동 할 수있는 해결 방법이 아니라 (당신이 제공하고 있지만) 가능한지 아닌지에 대한 평범한 대답입니다. 따라서 정답은 "아니요, 현재 CSS 사양으로는 불가능합니다."입니다. 문제는 레이아웃 결과가 "복잡"한 것 같습니다. 이 대답은 당신을 위해 그것을 복잡하게 만듭니다.
sergio 2014

나는 OP 예제와 똑같이 의미했습니다.
sergio

4

이 시도

<div style="background: linear-gradient( rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) ), url(/image.png);background-repeat: no-repeat; background-position: center;"> </div>


배경 위치를 변경하더라도 선형 그래디언트가 위치에 남아있는 것을보고 싶습니다.
klewis

1

CSS를 통해 이미지를 편집 할 수 없습니다. 내가 생각할 수있는 유일한 해결책은 이미지를 편집하고 불투명도를 변경하거나 필요한 모든 불투명도로 다른 이미지를 만드는 것입니다.


OP가 "대안"을 제공했다는 사실을 잊은 경우, 이것은 더 정직한 대답입니다. 그러나 그가 나중에 "예제를 제공하고 싶지 않다"(대안을 제공하기 위해)라고 언급 한 것을 고려하십시오. 그래서 그가 대답을 원한다고 생각하면 여기에 있습니다 :)
sergio

1
#id {
  position: relative;
  opacity: 0.99;
}

#id::before {
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: -1;
  background: url('image.png');
  opacity: 0.3;
}

불투명도 0.99 (1 미만)로 해킹하면 Z- 인덱스 컨텍스트가 생성되므로 글로벌 Z- 인덱스 값에 대해 걱정할 필요가 없습니다. (이를 제거하고 상위 래퍼에 양의 Z- 인덱스가있는 다음 데모에서 어떤 일이 발생하는지 확인하십시오.)
요소에 이미 Z- 인덱스가 있으면이 해킹이 필요하지 않습니다.

데모 .


@ bjb568 네, 그게 내 첫 생각이었습니다. 그러나 실제로는 반투명 배경으로 작동하지 않고 대신 반투명 전경으로 작동합니다. 블록 안에 이미지를 추가하거나 텍스트 색상을 배경색 (흰색)으로 변경해보세요.
사용자

@ bjb568 예, 귀하의 예에서 내부 이미지 위에 있어야 할 배경을 볼 수 있습니다. "배경"요소의 불투명도를 높이십시오. 그러면 내부 이미지가 어떻게 희미 해지는 지 알 수 있습니다.
사용자

@ bjb568 추가 해야하는지 궁금한 적이 no-repeat있습니까? 요소가 bg 이미지 크기와 동일한 고정 크기이고 배경이있는 부모 요소가 없기 때문에 버전이 괜찮다고 생각합니다 (background-color이면 충분 함).
사용자

@ bjb568 철저한 예를 들었습니다. 중복성이 있다고 생각되면 먼저 시작 하여 무엇이든 제거하십시오. 각 매개 변수에 위치가 있음을 알 수 있습니다. 다른 기술을 찾았다 고 생각되면 다른 답변 으로 게시하십시오 .
사용자

나는 궁금했다. 이상한 해킹 없이도 할 수 있습니다. No-repeat는 ... 반복되지 않습니다. 알았어 괜찮아. 그럼 또 다른 대답.
bjb568 2014

1

다음은 CSS로 그라디언트 및 불투명도를 설정하는 또 다른 방법입니다. 그래도 매개 변수로 arround를 재생해야합니다.

background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, transparent)),url("gears.jpg"); /* Chrome,Safari4+ */
background-image: -webkit-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* Chrome10+,Safari5.1+ */
background-image:    -moz-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* FF3.6+ */
background-image:     -ms-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* IE10+ */
background-image:      -o-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* Opera 11.10+ */
background-image:         linear-gradient(to bottom, transparent, transparent),url("gears.jpg"); /* W3C */

-1
body {
  ' css code that goes in your body'
}

body::after {
  background: url(yourfilename.jpg);
  content: "";
  opacity: 0.6;
  position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  z-index: -1;   
  width:auto;
  height: 100%;
  }

그래서 당신이 찾고있는 그 몸 :: 후에 말하십시오. 이렇게하면 신체의 코드가 변경되지 않거나 필요한 경우 변경할 수있는 배경 만 변경됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.