ตั้งค่าความทึบของภาพพื้นหลังโดยไม่กระทบกับองค์ประกอบลูก


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


ที่เกี่ยวข้องstackoverflow.com/q/806000/759452
Adrien เป็น

คำตอบ:


119

คุณสามารถใช้ CSS กับlinear-gradient()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
อืม ... ฉันเพิ่งโพสต์ลงไป แต่ดูคำตอบที่ได้รับการยอมรับนี้: stackoverflow.com/a/6502295/131809เพิ่มขึ้น 10 ครั้งและเหมือนกันมาก
อเล็กซ์

9
นี่เป็นตัวเลือกที่ดีไม่รู้ว่าทำไม downvotes มากมาย ถ้าฉันสามารถโหวตได้สองครั้งฉันก็ทำได้ องค์ประกอบลูกขององค์ประกอบหลักทึบแสงบางส่วนกำลังจะทึบแสงบางส่วนและควรเป็น "การแก้ไขปัญหา" ทั้งหมดเป็นข้อบกพร่องที่ควรได้รับการแก้ไขในที่สุด
RobW

6
@mystrdat คุณกำลังดาวน์โหลดรูปภาพนี่ไม่ใช่คำขอพิเศษ
แบรด

2
@ mystrdat แต่เขากำลังดาวน์โหลดภาพลูกศรอยู่แล้ว คุณยังไม่ได้ให้โซลูชันที่ไม่ใช่ภาพดังนั้นนั่นคือประเด็นของฉัน เขากำลังดาวน์โหลดรูปภาพลูกศรอยู่แล้วและอาจมาได้ตามต้องการซึ่งอาจไม่ใช่คำขอพิเศษ ฉันไม่เข้าใจว่าคุณมาจากไหน
แบรด

1
@ แบรดฉันขอโทษกลายเป็นว่าฉันได้อ่านคำถามผิดตอนนี้ที่ฉันตรวจสอบอีกครั้ง
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 ขององค์ประกอบแม่" ฉันต้องการให้เด็กเป็นเด็กจริงๆ .. และในโฟลว์เอกสาร ... และยังไม่ต้องการนำ javascript / flash มาใช้ในสิ่งนี้ ชอบ CSS บริสุทธิ์
govinda

ฉันมีภาพเด็กที่เป็นพ่อแม่ <li> ของทึบแสง 50% ซึ่งฉันต้องการทึบแสง 100% การตั้งค่า <li> ถึงposition:relative;และ img เป็นposition:absolute;ไม่อนุญาตให้ฉันแทนที่ความทึบที่สืบทอดมาของ img และฉันไม่สามารถใช้การกำหนดตำแหน่งที่แน่นอนสำหรับ <li> ของตัวเอง ใน Javascript ฉันพยายามimgs[i].style.opacity = '1';แต่ก็ไม่ได้ทำงานเพื่อแทนที่ความทึบที่สืบทอดมา ถ้าฉันเข้าใจถูกต้องฉันก็ไม่สามารถใช้ rgba ได้เพราะฉันต้องส่งผลกระทบต่อตัวเองไม่ใช่แค่สีพื้นหลัง ใครมีคำแนะนำสำหรับฉัน
govinda

26
คำตอบทั้งหมดนี้ไม่สมเหตุสมผล รหัสที่ได้รับนั้นเป็นสิ่งที่ผู้ถามไม่ต้องการทำเพราะมันไม่ทำงานไม่ตรงกับคำอธิบายหรือลิงค์ ฉันมีช่วงเวลาที่ยากมากที่จะเข้าใจว่าเพราะเหตุใดผู้คนมากมายจึงถอนรากถอนโคน
BoltClock

หากคำถามคือ 'วิธีการตั้งค่าความโปร่งใส 50% ในองค์ประกอบ' นี่จะเป็นคำตอบที่ดี
lharby

29

หากคุณใช้ภาพเป็นสัญลักษณ์แสดงหัวข้อคุณอาจพิจารณา: ก่อนองค์ประกอบหลอก

#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
ฮุสเซน

1
ฉันคิดว่านี่น่าจะเป็นทางออกที่ดีที่สุด มันเป็นโซลูชัน CSS ที่บริสุทธิ์ นอกจากนี้ยังเป็นไปได้ที่จะแฮ็คการสนับสนุน IE7 โดยใช้*zoom: expression( … );(ดู: หลังและ: ก่อนที่องค์ประกอบ CSS หลอกหลอกสำหรับ IE 7 ) แต่ในที่สุด IE7 ก็กลายเป็นกุญแจ
บุคคลที่สาม


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 ทั่วโลก (ลองลบมันออกและดูว่าเกิดอะไรขึ้นในการสาธิตครั้งต่อไปโดยที่ wrapper หลักมีดัชนี z เป็นบวก)
หากองค์ประกอบของคุณมีดัชนี z อยู่แล้วคุณไม่ต้องการแฮ็คนี้

ตัวอย่างของเทคนิคนี้


คุณรู้ไหมว่าทำไมเราต้องตั้งค่าความทึบน้อยกว่า 1 ค่า? มันเป็นโซลูชั่นข้ามเบราว์เซอร์?
zVictor

1
@zVictor ใช่นี่เป็นพฤติกรรมมาตรฐาน w3c ดูที่การทำความเข้าใจกับ CSS z-index: บริบทการสแต็
ผู้ใช้

4

น่าเสียดายที่ในขณะที่เขียนคำตอบนี้ไม่มีวิธีการทำเช่นนี้ คุณต้อง:

  1. ใช้ภาพกึ่งโปร่งใสสำหรับพื้นหลัง (ง่ายกว่ามาก)
  2. เพิ่มองค์ประกอบพิเศษ (เช่น div) ถัดจากเด็กที่คุณต้องการทึบแสงเพิ่มพื้นหลังและหลังจากทำให้กึ่งโปร่งใสวางไว้ด้านหลังเด็กที่กล่าวถึง

4

ตัวเลือกอื่นคือCSS Tricksวิธีการแทรกองค์ประกอบปลอมขนาดที่แน่นอนขององค์ประกอบเดิมด้านหลังเพื่อปลอมผลพื้นหลังทึบที่เรากำลังมองหา บางครั้งคุณจะต้องตั้งค่าความสูงสำหรับองค์ประกอบหลอก

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: progid:DXImageTransform.Microsoft.Alpha(opacity=50);

PS: ฉันโพสต์สิ่งนี้เป็นคำตอบเนื่องจาก SO ต้องการอักขระที่เปลี่ยนแปลงอย่างน้อย 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-radiusใน Firefox 13 และเพียงมองหาborder-radiusคุณสมบัติมาตรฐานตอนนี้) IE7 และ IE8 เป็นเรื่องราวที่แตกต่างกัน แต่นั่นเป็นเพียง IE :-p
Thirdender

ฉันต้องการทราบว่าใครโหวตสิ่งนี้และทำไมโปรด การโหวตไม่มีประโยชน์หากไม่มีข้อเสนอแนะ ฉันต้องการที่จะปรับปรุงคำตอบของฉัน หากเป็นเพราะข้อมูลล้าสมัยโปรดตรวจสอบวันที่ :) ขอบคุณ
code-sushi

@ code-sushi: หาก downvote เกิดขึ้นในช่วงเวลาเดียวกันกับความคิดเห็นของคุณให้พิจารณาว่ามันอาจมาจากคนอื่นที่เห็นด้วยกับความคิดเห็นของคนที่สาม (สังเกตเห็น upvotes ในความคิดเห็นของตัวเอง) ฉันไม่ได้ออกเสียงลงคะแนนในคำตอบของคุณ แต่ฉันต้องยอมรับ - ฉันต้องการเพิ่มว่า 1) KHTML จะไม่เห็น-khtml-opacityเพราะไม่เข้าใจคำค้นหาสื่อทำให้ไร้ประโยชน์ 2) IE มีเสถียรภาพมากกว่าที่คุณคิด มันจะไม่ "ระเบิด" เพียงเพราะคุณเพิ่มคำนำหน้าไม่ใช่ IE กับกฎที่ใช้กับ IE ปัญหาในเวลาที่คุณเผชิญมันต้องมาจากที่อื่น
BoltClock

คำตอบเดิมของฉันมาจากเกือบ 2 ปีที่แล้วและเมื่อไม่นานมานี้ก็มีการลงคะแนนเสียงเหมือนปีนี้ ผมก็แค่อยากรู้. สำหรับความคิดเห็นของ IE พวกเขาเกี่ยวข้องกับ 7 เมื่อยังต้องการการสนับสนุน ฉันค่อนข้างแน่ใจว่าตอนนี้ในกรณีส่วนใหญ่จะไม่สนใจ IE 7 ในทุกวันนี้ ขอบคุณสำหรับความคิดเห็นของคุณ
code-sushi

1

หากคุณต้องตั้งค่าความทึบให้กับสัญลักษณ์แสดงหัวข้อย่อยทำไมคุณไม่ตั้งช่องอัลฟาลงในภาพโดยตรง โดยวิธีการที่ฉันไม่คิดว่ามีวิธีการตั้งค่าความทึบเป็นภาพพื้นหลังผ่าน CSS โดยไม่เปลี่ยนความทึบขององค์ประกอบทั้งหมด (และเด็ก ๆ ด้วย)


1

เพียงเพิ่มลงไปข้างบน .. คุณสามารถใช้ช่องอัลฟากับคุณสมบัติสีใหม่เช่น rgba (0,0,0,0) โอเคดังนั้นนี่คือสีดำ แต่มีความทึบศูนย์ดังนั้นในฐานะผู้ปกครองมันจะไม่ส่งผลกระทบต่อเด็ก ใช้งานได้กับ Chrome, FF, Safari และ .... ฉันผอมมาก O

แปลงสีฐานสิบหกของคุณเป็น RGBA


4
สิ่งนี้จะไม่ทำงานกับสิ่งbackground-imageที่ร้องขอโดย OP
Torsten Walter

1

ฉันพบการสอนที่ดีและเรียบง่ายเกี่ยวกับปัญหานี้ ฉันคิดว่ามันใช้งานได้ดี (และแม้ว่าจะรองรับ IE ฉันแค่บอกให้ลูกค้าของฉันใช้เบราว์เซอร์อื่น):

ความโปร่งใสของพื้นหลัง CSS โดยไม่กระทบต่อองค์ประกอบลูกผ่าน RGBa และตัวกรอง

จากตรงนั้นคุณสามารถเพิ่มการรองรับการไล่ระดับสีเป็นต้น


มันไม่ทำงานโดยตรง คุณจะต้องใส่ div เป็นองค์ประกอบ aparent ด้วย 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.