Đặt độ mờ của hình nền mà không ảnh hưởng đến các yếu tố con


214

Có thể đặt độ mờ của ảnh nền mà không ảnh hưởng đến độ mờ của các phần tử con không?

Thí dụ

Tất cả các liên kết trong phần chân trang cần một viên đạn tùy chỉnh (ảnh nền) và độ mờ đục của viên đạn tùy chỉnh phải là 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%;
}  

Những gì tôi đã thử

Tôi đã thử đặt độ mờ của các mục danh sách thành 50%, nhưng sau đó độ mờ của văn bản liên kết cũng là 50% - và dường như không có cách nào để đặt lại độ mờ của các phần tử con:

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

Tôi cũng đã thử sử dụng rgba, nhưng điều đó không có bất kỳ ảnh hưởng nào đến hình nền:

#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%;
}


Câu trả lời:


119

Bạn có thể sử dụng CSS linear-gradient()với 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>


Đây là giải pháp tốt nhất!
Dzenis H.

93

Đưa hình ảnh của bạn vào trình chỉnh sửa hình ảnh, giảm độ mờ, lưu nó dưới dạng .png và sử dụng thay thế.


8
Hmm ... tôi chỉ bị hạ cấp, nhưng hãy xem câu trả lời được chấp nhận này: stackoverflow.com/a/6502295/131809 được nâng cấp 10 lần và khá giống nhau.
Alex

9
Đây là một lựa chọn tốt, không có lý do tại sao rất nhiều downvote. Nếu tôi có thể nâng cao điều này hai lần tôi sẽ làm. Một phần tử con của một phần tử cha mờ một phần sẽ bị mờ một phần, và nên được. Tất cả "cách giải quyết" là các lỗi cuối cùng sẽ được sửa.
RobW

6
@mystrdat Bạn đã tải xuống hình ảnh, đây không phải là một yêu cầu bổ sung.
brad

2
@mystrdat Nhưng anh ấy đã tải xuống hình ảnh mũi tên. Bạn đã không cung cấp một giải pháp phi hình ảnh, vì vậy đó là quan điểm của tôi. Anh ấy đã tải xuống hình ảnh mũi tên, nó cũng có thể đến khi cần thiết, đó sẽ không phải là một yêu cầu thêm. Tôi không hiểu bạn đến từ đâu.
brad

1
@brad Tôi xin lỗi, hóa ra tôi đã đọc sai câu hỏi bây giờ tôi đã kiểm tra lại.
mystrdat

41

Điều này sẽ làm việc với mọi trình duyệt

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; 
}

Nếu bạn không muốn sự minh bạch ảnh hưởng đến toàn bộ container và con của nó, hãy kiểm tra cách giải quyết này. Bạn phải có một đứa trẻ có vị trí tuyệt đối với cha mẹ tương đối có vị trí.

Kiểm tra bản demo tại http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/


Tôi nghĩ rằng bạn cần thay đổi dấu ngoặc kép trong đoạn mã trên thành "để nó hoạt động khi được sao chép thẳng.
nsantorello

6
câu trả lời này có còn là giải pháp tốt nhất mà mọi người đã tìm ra cho vấn đề: "làm thế nào để làm cho một phần tử con không kế thừa giá trị độ mờ CSS của phần tử cha mẹ" không? Tôi cần đứa trẻ thực sự là một đứa trẻ .. và trong dòng tài liệu ... và cũng không muốn đưa vào javascript / flash cho việc này; thích CSS thuần túy.
govinda

Tôi có 50% phụ huynh mờ <li> chứa hình ảnh con mà tôi muốn mờ 100%. Đặt <li> thành position:relative;và img position:absolute;không cho phép tôi ghi đè độ mờ được kế thừa trên img và tôi không thể sử dụng định vị tuyệt đối cho chính <li> (đó là một mớ hỗn độn ;-). Trong Javascript tôi đã thử imgs[i].style.opacity = '1';, nhưng nó cũng không hoạt động để ghi đè độ mờ được kế thừa. Nếu tôi hiểu chính xác, tôi cũng không thể sử dụng rgba vì tôi cần ảnh hưởng đến bản thân, không chỉ là màu nền. Bất cứ ai có một đề nghị cho tôi?
govinda

26
Toàn bộ câu trả lời này không có ý nghĩa. Mã đã cho, trên hết là chính xác những gì người hỏi không muốn làmnó không hoạt động , không khớp với mô tả hoặc liên kết. Tôi đang có một thời gian rất khó hiểu tại sao rất nhiều người đã ủng hộ nó.
BoltClock

Nếu câu hỏi là 'Cách đặt độ trong suốt 50% cho một yếu tố', đây sẽ là một câu trả lời hay.
lharby

29

Nếu bạn đang sử dụng hình ảnh như một viên đạn, bạn có thể xem xét: trước phần tử giả.

#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
Bộ lọc chỉ là một giải pháp IE
Hussein

1
Tôi nghĩ rằng đây có lẽ là giải pháp tốt nhất. Nó là một giải pháp CSS thuần túy. Cũng có thể hack hỗ trợ IE7 bằng cách sử dụng *zoom: expression( … );(xem : after và: trước css giả phần tử hack cho IE 7 ), nhưng IE7 cuối cùng đã trở thành passé.
thứ ba


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;
}

Hack với độ mờ .99 (dưới 1) tạo bối cảnh chỉ mục z để bạn không thể lo lắng về các giá trị chỉ mục z toàn cầu. (Hãy thử xóa nó và xem điều gì xảy ra trong bản demo tiếp theo nơi trình bao bọc cha mẹ có chỉ số z dương.)
Nếu phần tử của bạn đã có chỉ mục z, thì bạn không cần hack này.

Bản demo của kỹ thuật này .


Bạn có biết tại sao chúng ta cần đặt giá trị nhỏ hơn 1 cho độ mờ không? Nó có phải là một giải pháp đa trình duyệt?
zVictor

1
@zVictor vâng, đây là hành vi được chuẩn hóa w3c. Xem Hiểu CSS-index: Bối cảnh xếp chồng .
người dùng

4

Thật không may, tại thời điểm viết câu trả lời này, không có cách nào trực tiếp để làm điều này. Bạn cần phải:

  1. sử dụng hình ảnh bán trong suốt cho nền (dễ dàng hơn nhiều).
  2. thêm một yếu tố phụ (như div) bên cạnh trẻ em mà bạn muốn mờ đục, thêm nền cho nó và sau khi làm cho nó trong suốt, đặt nó phía sau trẻ em được đề cập.

4

Một tùy chọn khác là cách tiếp cận Thủ thuật CSS trong việc chèn một phần tử giả kích thước chính xác của phần tử gốc ngay phía sau nó để làm giả hiệu ứng nền mờ mà chúng ta đang tìm kiếm. Đôi khi bạn sẽ cần đặt chiều cao cho phần tử giả.

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

Thuộc tính "bộ lọc", cần một số nguyên cho tỷ lệ phần trăm thay vì gấp đôi, để hoạt động cho IE7 / 8.

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

PS: Tôi đăng bài này như một câu trả lời, vì SO, cần ít nhất 6 ký tự thay đổi để chỉnh sửa.


2

Để thực sự tinh chỉnh mọi thứ, tôi khuyên bạn nên đặt các lựa chọn phù hợp trong trình bao bọc nhắm mục tiêu trình duyệt. Đây là điều duy nhất hiệu quả với tôi khi tôi không thể khiến IE7 và IE8 "chơi đẹp với người khác" (vì tôi hiện đang làm việc cho một công ty phần mềm tiếp tục hỗ trợ họ).

/* 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);
}

Tôi có thể có các khoản dự phòng trong đoạn mã trên - nếu bất cứ ai muốn làm sạch nó hơn nữa, hãy thoải mái!


3
Không cần thiết phải nhắm mục tiêu riêng từng trình duyệt, chỉ cần sử dụng tiền tố trình duyệt bên trong một khối chọn duy nhất. Với tiền tố trình duyệt, trình duyệt sẽ chỉ sử dụng thuộc tính CSS thích hợp. Khi thời gian trôi qua và cú pháp cho thuộc tính đó được chuẩn hóa, các nhà cung cấp trình duyệt sẽ bỏ hỗ trợ cho các tiền tố và sử dụng thuộc tính CSS mà không cần bất kỳ tiền tố nào (ví dụ: Firefox đã bỏ hỗ trợ -moz-border-radiustrong Firefox 13 và border-radiusbây giờ chỉ tìm thuộc tính tiêu chuẩn ). IE7 và IE8 là một câu chuyện khác nhau, nhưng đó chỉ là IE :-p
thứ ba

Tôi muốn biết ai đã bỏ phiếu này và tại sao, làm ơn. Việc bỏ phiếu là vô ích nếu không có thông tin phản hồi. Tôi muốn có thể cải thiện câu trả lời của tôi. Nếu đó chỉ là vì thông tin đã lỗi thời, vui lòng kiểm tra ngày. :) Cảm ơn.
mã-sushi

@ code-sushi: Nếu downvote xảy ra cùng lúc với nhận xét của bạn, hãy xem xét rằng đó có thể là từ một người khác tình cờ đồng ý với nhận xét của người thứ ba (chú ý các upvote trên chính nhận xét đó). Tôi đã không bỏ phiếu cho câu trả lời của bạn nhưng tôi phải đồng ý - Tôi muốn thêm rằng 1) KHTML sẽ không bao giờ thấy -khtml-opacityvì nó không hiểu truy vấn phương tiện, khiến nó vô dụng 2) IE ổn định hơn bạn nghĩ; nó sẽ không "nổ tung" chỉ vì bạn thêm tiền tố không phải IE vào quy tắc áp dụng cho IE. Vấn đề, tại thời điểm bạn phải đối mặt với nó, phải đến từ nơi khác.
BoltClock

Câu trả lời ban đầu của tôi là từ gần 2 năm trước và cuộc bỏ phiếu xảy ra gần đây, như năm nay. Tôi chỉ là tò mò thôi. Đối với các bình luận IE họ liên quan đến 7 khi điều đó vẫn cần hỗ trợ; Tôi khá chắc chắn rằng bây giờ trong hầu hết các trường hợp đều bỏ qua IE 7. Cảm ơn phản hồi của bạn.
mã-sushi

1

Nếu bạn phải đặt độ mờ chỉ cho dấu đầu dòng, tại sao bạn không đặt kênh alpha trực tiếp vào hình ảnh? Bằng cách này, tôi không nghĩ rằng có một cách để đặt độ mờ thành hình nền thông qua css mà không thay đổi độ mờ của toàn bộ thành phần (và cả con của nó nữa).


1

Chỉ cần thêm vào ở trên..bạn có thể sử dụng kênh alpha với các thuộc tính màu mới, vd. rgba (0,0,0,0) ok vì vậy đây là màu đen nhưng với độ mờ bằng 0 nên với tư cách là cha mẹ, nó sẽ không ảnh hưởng đến đứa trẻ. Điều này chỉ hoạt động trên Chrome, FF, Safari và .... Tôi mỏng O.

chuyển đổi màu hex của bạn sang RGBA


4
Điều này sẽ không hoạt động với background-imageyêu cầu của OP.
Torsten Walter

1

Tôi tìm thấy một hướng dẫn khá tốt và đơn giản về vấn đề này. Tôi nghĩ rằng nó hoạt động rất tốt (và mặc dù nó hỗ trợ IE, tôi chỉ nói với khách hàng của mình sử dụng các trình duyệt khác):

Độ trong suốt của nền CSS mà không ảnh hưởng đến các phần tử con, thông qua RGBa và các bộ lọc

Từ đó bạn có thể thêm hỗ trợ gradient, v.v.


Chà, nó sẽ không hoạt động trực tiếp. Bạn sẽ cần đặt một phần tử div là aparent với màu nền: (ví dụ: 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;
    }

Bạn có thể thử mã này. Tôi nghĩ rằng nó sẽ được làm việc. Bạn có thể truy cập bản demo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.