자식 요소에 영향을주지 않고 배경 이미지의 불투명도 설정


214

자식 요소의 불투명도에 영향을주지 않고 배경 이미지의 불투명도를 설정할 수 있습니까?

바닥 글의 모든 링크에는 사용자 정의 글 머리 기호 (배경 이미지)가 필요하며 사용자 정의 글 머리 기호의 불투명도는 50 % 여야합니다.

HTML

<div id="footer">
    <ul>
        <li><a href="#">Link 1</a></li>
        <li><a href="#">Link 2</a></li>
        <li><a href="#">Link 3</a></li>
        <li><a href="#">Link 4</a></li>
        <li><a href="#">Link 5</a></li>
    </ul>
</div>  

CSS

#footer ul li {
    background: url(/images/arrow.png) no-repeat 0 50%;
}  

내가 시도한 것

목록 항목의 불투명도를 50 %로 설정하려고 시도했지만 링크 텍스트의 불투명도도 50 %입니다. 자식 요소의 불투명도를 재설정하는 방법이없는 것 같습니다.

#footer ul li {
    background: url(/images/arrow.png) no-repeat 0 50%;
    /* will also set the opacity of the link text */        
    opacity: 0.5;
}

또한 rgba를 사용해 보았지만 배경 이미지에는 영향을 미치지 않습니다.

#footer ul li {
    /* rgba doesn't apply to the background image */
    background: rgba(255, 255, 255, 0.5) url(/images/arrow.png) no-repeat 0 50%;
}


답변:


119

linear-gradient()와 함께 CSS 를 사용할 수 있습니다 rgba().

div {
  width: 300px;
  height: 200px;
  background: linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.5)), url("https://i.imgur.com/xnh5x47.jpg");
}
span {
  background: black;
  color: white;
}
<div><span>Hello world.</span></div>


이것이 최고의 솔루션입니다!
Dzenis H.

93

이미지를 이미지 편집기로 가져 와서 불투명도를 낮추고 .png로 저장 한 다음 대신 사용하십시오.


8
흠 ... 난 그냥 downvoted하지만이 허용 답변을 봐 : stackoverflow.com/a/6502295/131809 10 번 upvoted, 거의 동일합니다.
Alex

9
이 옵션은 좋은 옵션입니다. 왜 그렇게 많은 다운 보트가 있는지 모르겠습니다. 내가 이것을 두 번 공표 할 수 있다면 나는 할 것이다. 부분적으로 불투명 한 부모 요소의 자식 요소는 부분적으로 불투명 할 것입니다. 모든 "해결 방법"은 결국 수정해야하는 버그입니다.
RobW

6
@mystrdat 이미 이미지를 다운로드하고 있습니다. 추가 요청은 아닙니다.
brad

2
@mystrdat 그러나 그는 이미 화살표 이미지를 다운로드하고 있습니다. 이미지가 아닌 솔루션을 제공하지 않았으므로 이것이 내 요점입니다. 그는 이미 화살표 이미지를 다운로드하고 있으며 추가 요청이 아닌 필요에 따라 올 수 있습니다. 나는 당신이 어디에서 왔는지 이해하지 못합니다.
brad

1
@ brad 사과합니다. 다시 확인한 후에 질문을 잘못 읽었습니다.
mystrdat

42

이것은 모든 브라우저에서 작동합니다

div {
 -khtml-opacity:.50; 
 -moz-opacity:.50; 
 -ms-filter:"alpha(opacity=50)";
  filter:alpha(opacity=50);
  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
  opacity:.50; 
}

투명성이 전체 컨테이너 및 해당 하위 항목에 영향을 미치지 않게하려면이 해결 방법을 확인하십시오. 부모가 상대적으로 위치하는 자녀가 있어야합니다.

http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/ 에서 데모를 확인하십시오 .


바로 복사하여 붙여 넣을 때 작동하려면 위 코드의 따옴표를 "로 변경해야합니다.
nsantorello

6
이 답변은 여전히 ​​사람들이 "자식 요소가 부모 요소의 CSS 불투명도 값을 상속하지 않도록 만드는 방법"이라는 문제에 대한 최상의 해결책입니까? 나는 아이가 정말로 아이가되어야한다. 그리고 문서 흐름에서 ... 또한 이것을 위해 자바 스크립트 / 플래시를 가져오고 싶지 않다; 순수한 CSS를 선호하십시오.
govinda

불투명도가 100 % 인 하위 이미지가 포함 된 50 %의 불투명 한 부모 <li>이 있습니다. <li>를 설정하고 position:relative;img를 설정하면 img position:absolute;에서 상속 된 불투명도를 무시할 수 없으며 <li> 자체에 절대 위치 지정을 사용할 수 없습니다 (엉망입니다 .-). Javascript에서는을 시도 imgs[i].style.opacity = '1';했지만 상속 된 불투명도를 재정의하는 것도 작동하지 않습니다. 올바르게 이해하면 배경색뿐만 아니라 imgs 자체에도 영향을 미치기 때문에 rgba를 사용할 수 없습니다. 누구든지 나를 추천 해 줄까요?
govinda

26
이 전체 답변은 의미가 없습니다. 주어진 코드 는 작동 하지 않기 때문에 asker 가 원하지 않는 것 외에 설명이나 링크와 일치하지 않습니다. 왜 그렇게 많은 사람들이 그것을지지했는지 이해하는 데 어려움을 겪고 있습니다.
BoltClock

질문이 '요소에 50 % 투명도를 설정하는 방법'이라면 이것이 좋은 답이 될 것입니다.
lharby

29

이미지를 글 머리 기호로 사용하는 경우 : before pseudo 요소를 고려할 수 있습니다.

#footer ul li {
}

#footer ul li:before {
    content: url(/images/arrow.png);
    filter:alpha(opacity=50);
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
    opacity:.50;
}

3
필터는 IE 솔루션 일뿐입니다
Hussein

1
아마도 이것이 최선의 해결책이라고 생각합니다. 순수한 CSS 솔루션입니다. 를 사용하여 IE7 지원을 해킹하는 것도 가능하지만 *zoom: expression( … );( : 7 및 psudo 요소가 IE 7 용으로 해킹되기 전에 : after 및 :) 참조 IE7은 마침내 통과하고 있습니다.
thirdender


9
#footer ul li {
  position: relative;
  opacity: 0.99;
}

#footer ul li::before {
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: -1;
  background: url(/images/arrow.png) no-repeat 0 50%;
  opacity: 0.5;
}

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

이 기술의 데모 .


불투명도에 대해 1보다 작은 값을 설정해야하는 이유를 알고 있습니까? 크로스 브라우저 솔루션입니까?
zVictor

1
@zVictor 예, 이것은 w3c 표준 동작입니다. CSS z- 인덱스 이해 : 스택 컨텍스트를 참조하십시오 .
사용자

4

불행히도이 답변을 작성할 당시에는 직접 수행 할 수있는 방법 없습니다 . 다음을 수행해야합니다.

  1. 배경에 반투명 이미지를 사용하십시오 (훨씬 더 쉬움).
  2. 불투명 한 어린이 옆에 div와 같은 추가 요소를 추가하고 배경을 추가하고 반투명하게 한 다음 언급 한 어린이 뒤에 배치하십시오.

4

또 다른 옵션은 CSS 요소로 의사 요소를 원래 요소의 정확한 크기 바로 뒤에 삽입하여 찾고있는 불투명 한 배경 효과를 위조하는 것입니다. 때로는 의사 요소의 높이를 설정해야합니다.

div {
  width: 200px;
  height: 200px;
  display: block;
  position: relative;
}

div::after {
  content: "";
  background: url(image.jpg);
  opacity: 0.5;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  position: absolute;
  z-index: -1;   
}

3

IE7 / 8에서 작동하려면 "filter"속성에 double 대신 불투명도의 백분율 정수가 필요합니다.

filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);

추신 : 나는 이것을 편집으로 게시하기 위해 최소한 6 개의 변경된 문자가 필요하기 때문에 이것을 대답으로 게시합니다.


2

사물을 실제로 미세 조정하려면 브라우저 선택 래퍼에 적절한 선택 항목을 배치하는 것이 좋습니다. IE7 및 IE8을 "다른 사람들과 잘 플레이"할 수 없었을 때 이것이 나를 위해 일한 유일한 방법이었습니다.

/* color or background image for all browsers, of course */            
#myBackground {
    background-color:#666; 
}
/* target chrome & safari without disrupting IE7-8 */
@media screen and (-webkit-min-device-pixel-ratio:0) {
    #myBackground {
        -khtml-opacity:.50; 
        opacity:.50;
    }
}
/* target firefox without disrupting IE */
@-moz-document url-prefix() {
    #myBackground {
        -moz-opacity:.50;
        opacity:0.5;
    }
}
/* and IE last so it doesn't blow up */
#myBackground {
    opacity:.50;
    filter:alpha(opacity=50);
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
}

위의 코드에 중복이있을 수 있습니다. 누군가 더 정리하고 싶다면 자유롭게 느끼십시오!


3
단일 선택기 블록 내에서 브라우저 접두사를 사용하면 각 브라우저를 개별적으로 타겟팅 할 필요가 없습니다. 브라우저 접두사를 사용하면 브라우저는 적절한 CSS 속성 만 사용합니다. 시간이 지남에 따라 해당 속성의 구문이 표준화되면 브라우저 공급 업체는 접두사에 대한 지원을 중단하고 접두사없이 CSS 속성을 사용합니다 (예 : Firefox는 -moz-border-radiusFirefox 13에서 지원을 중단 하고 border-radius이제 표준 속성 만 찾습니다 ). IE7과 IE8은 다른 이야기이지만, 그것은 단지 IE입니다
-p

누가이 투표에 참여했는지, 왜 그런지 알고 싶습니다. 유익한 피드백없이 투표는 쓸모가 없습니다. 답변을 개선하고 싶습니다. 정보가 구식이기 때문에 날짜를 확인하십시오. :) 감사.
code-sushi

@ code-sushi : 귀하의 의견과 거의 동시에 공감이 발생한 경우, 제 3 자의 의견에 동의 한 다른 사람의 의견 일 수 있습니다 (의견 자체에 대한 의견). 나는 당신의 대답에 투표하지 않았지만 동의해야합니다-나는 덧붙이고 싶습니다. 1) KHTML은 -khtml-opacity미디어 쿼리를 이해하지 못하기 때문에 그것을 보지 못할 것입니다 .2) IE는 생각보다 안정적입니다. IE에 적용되는 규칙에 비 IE 접두사를 추가하기 때문에 "폭발하지"않습니다. 당신이 직면했을 때 문제는 다른 곳에서 왔을 것입니다.
BoltClock

내 원래의 대답은 거의 2 년 전의 것이 었으며, 올해와 같이 최근에 하락 투표가 발생했습니다. 나는 단지 궁금했다. IE의 의견에 관해서는 여전히 지원이 필요할 때 7에 해당합니다. 요즘 IE 7을 무시하는 것이 대부분의 경우 괜찮습니다. 의견 주셔서 감사합니다.
code-sushi

1

불릿 만 불릿으로 설정해야하는 경우 알파 채널을 이미지에 직접 설정하지 않겠습니까? 그건 그렇고 나는 전체 요소 (및 그 자식들)의 불투명도를 변경하지 않고 CSS를 통해 불투명도를 배경 이미지로 설정하는 방법이 없다고 생각합니다.


1

위에 추가하기 만하면됩니다. 알파 채널을 새로운 색상 속성과 함께 사용할 수 있습니다. rgba (0,0,0,0) 좋습니다. 검은 색이지만 불투명도가 0이므로 부모에게는 자식에 영향을 미치지 않습니다. 이것은 Chrome, FF, Safari 및 ...에서 작동합니다.

16 진수 색상을 RGBA로 변환


4
background-imageOP에서 요청한대로 작동하지 않습니다 .
Torsten Walter

1

이 문제에 대한 아주 좋고 간단한 자습서를 찾았습니다. 나는 그것이 잘 작동한다고 생각합니다 (IE를 지원하지만 클라이언트에게 다른 브라우저를 사용하도록 지시합니다).

RGBa 및 필터를 통해 자식 요소에 영향을주지 않는 CSS 배경 투명도

거기에서 그라디언트 지원 등을 추가 할 수 있습니다.


글쎄, 그것은 직접 작동하지 않습니다. div를 background-color : (255,255,255,0.5)의 부모 요소로 배치해야합니다 (예
Francisco

0
#footer ul li
     {
       position:relative;
       list-style:none;
     }
    #footer ul li:before
     {
       background-image: url(imagesFolder/bg_demo.png);
       background-repeat:no-repeat;
       content: "";
       top: 5px;
       left: -10px;
       bottom: 0;
       right: 0;
       position: absolute;
       z-index: -1;
       opacity: 0.5;
    }

이 코드를 사용해보십시오. 나는 그것이 효과가 있다고 생각합니다. 데모를 방문 할 수 있습니다

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