ฉันสามารถตั้งค่าความทึบเฉพาะให้กับภาพพื้นหลังของ div ได้หรือไม่


89

สมมติว่าฉันมี

<div class="myDiv">Hi there</div>

ฉันต้องการที่จะนำbackground-imageและให้มันopacityของ0.5- แต่ฉันต้องการว่าข้อความที่ผมได้เขียนจะมีความทึบแสงเต็มรูปแบบ ( 1)

ถ้าจะเขียน CSS แบบนี้

.myDiv { opacity:0.5 }

ทุกอย่างจะมีความทึบต่ำ - และฉันไม่ต้องการอย่างนั้น

คำถามของฉันคือ - ฉันจะรับภาพพื้นหลังที่มีความทึบต่ำพร้อมข้อความทึบแสงได้อย่างไร?


stackoverflow.com/questions/6624457/…โปรดทราบว่าฉันมีความคิดเห็นที่นั่น (ภายใต้คำตอบของ Phil) แสดงวิธีดำเนินการด้วยความทึบของ css หากเป็นวิธีที่ต้องการ ( jsfiddle.net/4tTNZ )
Joonas

นี้คำตอบมากขึ้นรวบรัดและผมเชื่อว่าจะตรงเดียวกัน
JohnAllen

คำตอบ:


104

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

รอง

เพิ่มdivองค์ประกอบอื่นในคอนเทนเนอร์เพื่อยึดพื้นหลัง นี่เป็นวิธีที่เป็นมิตรกับข้ามเบราว์เซอร์มากที่สุดและจะใช้ได้แม้กระทั่งบน IE6

HTML

<div class="myDiv">
    <div class="bg"></div>
    Hi there
</div>

CSS

.myDiv {
    position: relative;
    z-index: 1;
}

.myDiv .bg {
    position: absolute;
    z-index: -1;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: url(test.jpg) center center;
    opacity: .4;
    width: 100%;
    height: 100%;
}

ดูกรณีทดสอบใน jsFiddle

: before และ :: before pseudo-element

เคล็ดลับอีกประการหนึ่งคือการใช้องค์ประกอบหลอกCSS 2.1 :beforeหรือ CSS 3 pseudo-element ได้รับการสนับสนุนใน IE ตั้งแต่เวอร์ชัน 8 ในขณะที่ไม่รองรับ pseudo-element เลย หวังว่าจะได้รับการแก้ไขในเวอร์ชัน 10::before:before::before

HTML

<div class="myDiv">
    Hi there
</div>

CSS

.myDiv {
    position: relative;
    z-index: 1;
}

.myDiv:before {
    content: "";
    position: absolute;
    z-index: -1;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: url(test.jpg) center center;
    opacity: .4;
}

หมายเหตุเพิ่มเติม

เนื่องจากพฤติกรรมของz-indexคุณจะต้องตั้งค่าดัชนี z สำหรับคอนเทนเนอร์รวมทั้งค่าลบz-indexสำหรับภาพพื้นหลัง

กรณีทดสอบ

ดูกรณีทดสอบใน jsFiddle:


2
ฉันหวาดระแวงสุด ๆ เมื่อต้องใช้ค่าลบกับดัชนี z .. แต่ฉันไม่สามารถโต้แย้งกับผลลัพธ์ได้ Howevveer ฉันจะเพิ่มwidth: 100%; height: 100%;เพื่อ.bgให้ ie6 สามารถแพร่กระจาย bg ภายใน div หลัก jsfiddle.net/sbGb4/2
Joonas

ฉันคิดว่ามีเคล็ดลับ css3 ที่ฉันหายไป - แต่ก็ยอดเยี่ยมเช่นกัน!
Alon

@Lollero จุดดี! z-indexเป็นความเจ็บปวด แต่ควรปลอดภัยตราบใดที่คุณให้ดัชนีเชิงบวกแก่ผู้ปกครอง
mekwall

@Alon หากคุณตรวจสอบความคิดเห็นที่ฉันเขียนไว้ใต้โพสต์คำถามของคุณ ฉันมีลิงค์ไปยังคำถามอื่นที่มีตัวเลือกอื่น ๆ มากมายรวมถึง rgba ซึ่งเป็นตัวเลือก css3 นี่เป็นเคล็ดลับที่ดีสำหรับผู้สูงวัยเช่น .. css-tricks.com/2151-rgba-browser-support
Joonas

@Alon ฉันเพิ่มวิธีอื่นโดยใช้::beforeองค์ประกอบหลอก นี่คือสิ่งที่คุณกำลังมองหาใช่ไหม
mekwall

160

นี่เป็นวิธีอื่น:

background-image: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.5)), url("your_image.png");

3
@jj_ สนับสนุนเพราะในช่วงเวลาที่มี จำกัด linear-gradientมาก คำตอบที่ได้รับการยอมรับฉันเขียนเกิน 4 ปีแล้ว;)
mekwall

3
บางทีคุณอาจเพิ่มความคิดเห็นหรืออัปเดตคำถามเล็กน้อยเพื่อแจ้งว่าตอนนี้เป็นวิธีใหม่ที่ดีในการทำ พบกันใหม่ในอีก 4 ปี;)
jj_

@jj_: จริงๆแล้ววิธีนี้ไม่ได้ทำให้ภาพโปร่งใส เพิ่มเลเยอร์สีขาวที่มีความโปร่งใส 50% เท่านั้น ดังนั้นจึงไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามนี้
mekwall

8
ฉันคิดว่าเราสามารถยอมรับได้ว่าบรรลุจุดประสงค์ของคำถามดังนั้นใช่มันเป็นคำตอบที่ถูกต้องสำหรับคำถาม
David Clarke

ใช่ .. คำตอบนี้ค่อนข้างง่ายที่สุด .. การวางตำแหน่งอย่างอื่นจะกลายเป็นเรื่องยุ่งเหยิง
Harkirat Saluja


0

สามารถทำได้โดยใช้คลาส div ที่แตกต่างกันสำหรับข้อความ Hi There ...

<div class="myDiv">
    <div class="bg">
   <p> Hi there</p>
</div>
</div>

ตอนนี้คุณสามารถใช้สไตล์กับไฟล์

แท็ก มิฉะนั้นสำหรับคลาส bg ฉันแน่ใจว่ามันใช้งานได้ดี


0

ฉันใช้โซลูชันของ Marcus Ekwallแต่สามารถลบบางอย่างเพื่อให้ง่ายขึ้นและยังใช้งานได้ อาจจะเป็นเวอร์ชัน 2017 ของ html / css?

html:

<div id="content">
  <div id='bg'></div>
  <h2>What is Lorem Ipsum?</h2>
  <p><strong>Lorem Ipsum</strong> is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen
    book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with
    desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p>
</div>

css:

#content {
  text-align: left;
  width: 75%;
  margin: auto;
  position: relative;
}

#bg {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: url('https://static.pexels.com/photos/6644/sea-water-ocean-waves.jpg') center center;
  opacity: .4;
  width: 100%;
  height: 100%;
}

https://jsfiddle.net/abalter/3te9fjL5/


1
สิ่งนี้ทำเช่นเดียวกับ "div รอง" ในคำตอบของฉันโดยมีข้อแตกต่างเพียงอย่างเดียวคือคุณละเว้นดัชนี z (เป็นไปได้ว่าสิ่งนี้จะทำงานแตกต่างกันในวันนี้และอาจขึ้นอยู่กับเบราว์เซอร์ด้วย) แต่การไว้วางใจให้เบราว์เซอร์ทำงานตามที่คาดไว้มักเป็นความคิดที่ไม่ดี
mekwall

0

สวัสดีทุกคนที่ฉันทำสิ่งนี้และได้ผลดี

	var canvas, ctx;

		function init() {
			canvas = document.getElementById('color');
			ctx = canvas.getContext('2d');

			ctx.save();
			ctx.fillStyle = '#bfbfbf'; //  #00843D   // 118846
			ctx.fillRect(0, 0, 490, 490);
			ctx.restore();
		}
section{
		height: 400px;
		background: url(https://images.pexels.com/photos/265087/pexels-photo-265087.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb);
		background-repeat: no-repeat;
		background-position: center;
		background-size: cover;
		position: relative;
	
}

canvas {
	width: 100%;
	height: 400px;
	opacity: 0.9;

}

#text {
	position: absolute;
	top: 10%;
	left: 0;
	width: 100%;
	text-align: center;
}


.middle{
	text-align: center;
	
}

section small{
	background-color: #262626;
	padding: 12px;
	color: whitesmoke;
  letter-spacing: 1.5px;

}

section i{
  color: white;
  background-color: grey;
}

section h1{
  opacity: 0.8;
}
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Metrics</title>
	<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">  
</head>  
  
<body onload="init();">
<section>
<canvas id="color"></canvas>

<div class="w3-container middle" id="text">
<i class="material-icons w3-highway-blue" style="font-size:60px;">assessment</i>
<h1>Medimos las acciones de tus ventas y disenamos en la WEB tu Marca.</h1>
<small>Metrics &amp; WEB</small>
</div>
</section> 


0
<!DOCTYPE html>
<html>
<head></head>
<body>
<div style=" background-color: #00000088"> Hi there </div>
<!-- #00 would be r, 00 would be g, 00 would be b, 88 would be a. -->
</body>
</html>

การรวมชุดตัวเลข 4 ชุดจะทำให้เป็น rgba ไม่ใช่ cmyk แต่จะใช้วิธีใดก็ได้ (rgba = 00000088, cmyk = 0%, 0%, 0%, 50%)


-1

ไม่มีวิธีแก้ปัญหาใดที่ใช้ได้ผลสำหรับฉัน หากทุกอย่างล้มเหลวให้นำภาพไปยัง Photoshop และใช้เอฟเฟกต์บางอย่าง 5 นาทีเมื่อเทียบกับเวลานี้ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.