ภาพซ้อนทับโปร่งใสสีดำที่วางเมาส์เหนือรูปภาพด้วย CSS เท่านั้น


101

ฉันกำลังพยายามเพิ่มภาพซ้อนทับสีดำใสให้กับรูปภาพเมื่อใดก็ตามที่เมาส์วางเมาส์เหนือรูปภาพที่มีเพียง CSS เป็นไปได้หรือไม่ ฉันลองสิ่งนี้:

http://jsfiddle.net/Zf5am/565/

แต่ฉันไม่สามารถเอา div มาแสดงได้

<div class="image">
    <img src="http://www.newyorker.com/online/blogs/photobooth/NASAEarth-01.jpg" alt="" />
    <div class="overlay" />
</div> 

.image {
  position: relative;
  border: 1px solid black;
  width: 200px;
  height: 200px;
}
.image img {
  max-width: 100%;
  max-height: 100%;
}
.overlay {
  position: absolute;
  top: 0;
  left: 0;
  display: none;
  background-color: red;
  z-index: 200;
}
.overlay:hover {
  display: block;
}

คุณหมายถึงวาง: วางเมาส์บน div รูปภาพไม่ใช่ div การวางซ้อนหรือ
andi

1
หมายเหตุ: ทำไมคุณถึงใส่ดัชนี Z ที่สูงเช่นนี้ในการซ้อนทับ? ดัชนี Z ไม่ใช่ทั่วโลก ไม่จำเป็นต้อง 'แฮ็ก' ค่าที่สูงหรือต่ำเพื่อให้ใช้งานได้
Jimmy Breck-McKye

1
นี่คือสิ่งที่ช่วยฉันแก้ปัญหานี้ได้ในที่สุด: jsfiddle.net/4Dfpmไม่จำเป็นต้องวางซ้อนทับ รูปภาพมีความทึบน้อยลงเมื่อวางเมาส์เหนือ div ด้านล่างควรมีพื้นหลังเป็นสีดำ voila
Kai Noack

คำตอบ:


214

ฉันขอแนะนำให้ใช้องค์ประกอบหลอกแทนองค์ประกอบภาพซ้อนทับ เนื่องจากไม่สามารถเพิ่มองค์ประกอบหลอกในองค์ประกอบที่ปิดล้อมได้imgคุณยังคงต้องรวมimgองค์ประกอบไว้

ตัวอย่างสดที่นี่ -ตัวอย่างพร้อมข้อความ

<div class="image">
    <img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>

สำหรับ CSS ให้ตั้งค่ามิติที่เป็นทางเลือกบน.imageองค์ประกอบและวางตำแหน่ง หากคุณกำลังเล็งสำหรับภาพที่ตอบสนองเพียงละเว้นขนาดนี้และจะยังคงทำงาน(ตัวอย่าง) มันเป็นเพียงที่น่าสังเกตว่าขนาดจะต้องอยู่ในองค์ประกอบหลักเมื่อเทียบกับimgองค์ประกอบตัวเองดู

.image {
    position: relative;
    width: 400px;
    height: 400px;
}

กำหนดให้imgองค์ประกอบลูกมีความกว้างของพาเรนต์100%และเพิ่มvertical-align:topเพื่อแก้ไขปัญหาการจัดแนวพื้นฐานเริ่มต้น

.image img {
    width: 100%;
    vertical-align: top;
}

สำหรับองค์ประกอบหลอกให้ตั้งค่าเนื้อหาและวางตำแหน่งให้สัมพันธ์กับ.imageองค์ประกอบอย่างแน่นอน ความกว้าง / ความสูง100%จะช่วยให้มั่นใจได้ว่าสิ่งนี้ใช้ได้กับimgขนาดที่แตกต่างกัน หากคุณต้องการเปลี่ยนองค์ประกอบให้ตั้งค่าความทึบ0และเพิ่มคุณสมบัติ / ค่าการเปลี่ยนแปลง

.image:after {
    content: '\A';
    position: absolute;
    width: 100%; height:100%;
    top:0; left:0;
    background:rgba(0,0,0,0.6);
    opacity: 0;
    transition: all 1s;
    -webkit-transition: all 1s;
}

ใช้ความทึบของ1เมื่อวางเมาส์เหนือองค์ประกอบหลอกเพื่ออำนวยความสะดวกในการเปลี่ยน:

.image:hover:after {
    opacity: 1;
}

สิ้นสุดผลลัพธ์ที่นี่


หากคุณต้องการเพิ่มข้อความเมื่อวางเมาส์เหนือ:

สำหรับวิธีการที่ง่ายที่สุดเพียงเพิ่มข้อความเป็นค่าองค์ประกอบหลอกcontent:

ตัวอย่างที่นี่

.image:after {
    content: 'Here is some text..';
    color: #fff;

    /* Other styling.. */
}

สิ่งนี้ควรใช้ได้ในกรณีส่วนใหญ่ อย่างไรก็ตามหากคุณมีimgองค์ประกอบมากกว่าหนึ่งรายการคุณอาจไม่ต้องการให้ข้อความเดียวกันปรากฏบนโฮเวอร์ คุณจึงสามารถตั้งค่าข้อความในdata-*แอตทริบิวต์ดังนั้นจึงมีข้อความที่ไม่ซ้ำกันสำหรับทุกimgองค์ประกอบ

ตัวอย่างที่นี่

.image:after {
    content: attr(data-content);
    color: #fff;
}

ด้วยcontentค่าattr(data-content)องค์ประกอบหลอกจะเพิ่มข้อความจากแอตทริบิวต์.imageขององค์ประกอบdata-content:

<div data-content="Text added on hover" class="image">
    <img src="http://i.stack.imgur.com/Sjsbh.jpg" alt="" />
</div>

คุณสามารถเพิ่มสไตล์และทำสิ่งต่อไปนี้:

ตัวอย่างที่นี่

ในตัวอย่างข้างต้น:afterองค์ประกอบหลอกทำหน้าที่เป็นภาพซ้อนทับสีดำในขณะที่:beforeองค์ประกอบหลอกคือคำอธิบายภาพ / ข้อความ เนื่องจากองค์ประกอบต่างๆไม่ขึ้นต่อกันคุณจึงสามารถใช้การจัดแต่งทรงผมแยกกันเพื่อให้ได้ตำแหน่งที่เหมาะสมยิ่งขึ้น

.image:after, .image:before {
    position: absolute;
    opacity: 0;
    transition: all 0.5s;
    -webkit-transition: all 0.5s;
}
.image:after {
    content: '\A';
    width: 100%; height:100%;
    top: 0; left:0;
    background:rgba(0,0,0,0.6);
}
.image:before {
    content: attr(data-content);
    width: 100%;
    color: #fff;
    z-index: 1;
    bottom: 0;
    padding: 4px 10px;
    text-align: center;
    background: #f00;
    box-sizing: border-box;
    -moz-box-sizing:border-box;
}
.image:hover:after, .image:hover:before {
    opacity: 1;
}

1
ขอบคุณ Josh ฉันชอบเวอร์ชั่นนี้ที่สุด คุณจะทำอย่างไรถ้าคุณต้องการแสดงข้อความสีขาวที่ด้านบนของความดำโปร่งแสงนั้น? คุณจะเพิ่ม div อื่นและใช้ความทึบแยกกันหรือไม่?
RobVious

ใช่เฉพาะในการวางเมาส์เท่านั้น
RobVious

1
ขอบคุณนี่เป็นทางออกที่ดีกว่าที่ฉันเคยลองมาก่อน
wingskush

ฉันจะตั้งคำบรรยายให้อยู่ตรงกลางภาพได้อย่างไร? top:30%ใช้งานได้ดูซอของฉันแต่สำหรับเลย์เอาต์ที่ตอบสนองมันจะเป็นการดีที่จะตั้งค่าให้อยู่ตรงกลางที่แน่นอน BTW: ขอบคุณสำหรับแอพที่ดีนี้
p2 หรือ

3
@poor นี่คือวิธีการตอบสนองอย่างหนึ่ง(ตัวอย่างที่อัปเดต) .. ซึ่งใช้top: 50%/ transform: translateY(-50%)สำหรับการจัดกึ่งกลางแนวตั้ง เป็นแนวทางหนึ่งที่กล่าวถึงในคำตอบอื่น ๆ หากเป็นของฉัน - stackoverflow.com/questions/5703552/…
Josh Crozier

45

1
ตั้งแต่รุ่นของ FF35, FF ไม่นอกจากนี้ยังสนับสนุนฟิลเตอร์: jsfiddle.net/Zf5am/1766
จาค็อบฟานลิงเงน

เพื่อน!! ทางออกที่น่ากลัว !!
Alvaro Joao

11

คุณอยู่ใกล้ สิ่งนี้จะได้ผล:

.image { position: relative; border: 1px solid black; width: 200px; height: 200px; }
.image img { max-width: 100%; max-height: 100%; }
.overlay { position: absolute; top: 0; left: 0; right:0; bottom:0; display: none; background-color: rgba(0,0,0,0.5); }
.image:hover .overlay { display: block; }

คุณจำเป็นต้องวาง:hoverบนภาพและทำการ.overlayปกภาพทั้งหมดโดยการเพิ่มและright:0;bottom:0

jsfiddle: http://jsfiddle.net/Zf5am/569/


ฉันขอแนะนำให้ใช้ภาพเคลื่อนไหว CSS3 เพื่อการเปลี่ยนแปลงที่ราบรื่นขึ้นเล็กน้อยสำหรับเบราว์เซอร์ที่เข้ากันได้ (ผู้ใช้ IE จะต้องทนทุกข์ทรมาน)
Jimmy Breck-McKye

7

นี่เป็นวิธีที่ดีในการใช้: หลังจากบน div รูปภาพแทนการซ้อนทับพิเศษ: http://jsfiddle.net/Zf5am/576/

<div class="image">
    <img src="http://www.newyorker.com/online/blogs/photobooth/NASAEarth-01.jpg" alt="" />
</div>

.image {position:relative; border:1px solid black; width:200px; height:200px;}
.image img {max-width:100%; max-height:100%;}
.image:hover:after {content:""; position:absolute; top:0; left:0; bottom:0; right:0; background-color: rgba(0,0,0,0.3);}

2

.overlayไม่มีความสูงหรือความกว้างและไม่มีเนื้อหาและคุณไม่สามารถวางเมาส์เหนือdisplay:noneได้

ฉันให้ div ขนาดและตำแหน่งเดียวกันแทน.imageและเปลี่ยนRGBAค่าเมื่อวางเมาส์เหนือ

http://jsfiddle.net/Zf5am/566/

.image { position: absolute; border: 1px solid black; width: 200px; height: 200px; z-index:1;}
.image img { max-width: 100%; max-height: 100%; }
.overlay { position: absolute; top: 0; left: 0; background:rgba(255,0,0,0); z-index: 200; width:200px; height:200px; }
.overlay:hover { background:rgba(255,0,0,.7); }

1

ดูสิ่งที่ฉันทำที่นี่: http://jsfiddle.net/dyarbrough93/c8wEC/

ก่อนอื่นคุณไม่เคยตั้งค่าขนาดของภาพซ้อนทับหมายความว่ามันจะไม่ปรากฏขึ้นตั้งแต่แรก ประการที่สองขอแนะนำให้เปลี่ยนดัชนี z ของภาพซ้อนทับเมื่อคุณวางเมาส์เหนือรูปภาพ เปลี่ยนความทึบ / สีของภาพซ้อนทับให้เหมาะกับความต้องการของคุณ

.image { position: relative; width: 200px; height: 200px;}
.image img { max-width: 100%; max-height: 100%; }
.overlay { position: absolute; top: 0; left: 0; background-color: gray; z-index: -10; width: 200px; height: 200px; opacity: 0.5}
.image:hover .overlay { z-index: 10}

1

คุณสามารถทำได้โดยเล่นกับความทึบของภาพและตั้งค่าสีพื้นหลังของภาพเป็นสีดำ การทำให้ภาพโปร่งใสจะปรากฏเป็นสีเข้มขึ้น

<div class="image">
    <img src="http://www.newyorker.com/online/blogs/photobooth/NASAEarth-01.jpg" alt="" />
</div> 

CSS:

.image { position: relative; border: 1px solid black; width: 200px; height: 200px; background: black; }
.image img { max-width: 100%; max-height: 100%; }
.image img:hover { opacity: .5 }

คุณอาจต้องตั้งค่าความทึบเฉพาะของเบราว์เซอร์ด้วยเพื่อให้สามารถใช้งานได้ในเบราว์เซอร์อื่นด้วย


0

ฉันจะให้ความสูงต่ำสุดและความกว้างต่ำสุดแก่ div โอเวอร์เลย์ของคุณตามขนาดของรูปภาพและเปลี่ยนสีพื้นหลังเมื่อวางเมาส์เหนือ

.overlay { position: absolute; top: 0; left: 0;  z-index: 200; min-height:200px; min-width:200px; background-color: none;}
.overlay:hover { background-color: red;}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.