Чи можу я встановити непрозорість лише для фонового зображення div?


86

Скажімо, маю

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

Я хочу поставити a background-imageі надати йому значення opacityof 0.5- але я хочу, щоб написаний мною текст мав повну прозорість ( 1).

Якби я писав CSS так

.myDiv { opacity:0.5 }

все буде з низькою непрозорістю - і я цього не хочу.

Тож моє запитання - як я можу отримати фонове зображення з низькою непрозорістю із текстом із повною непрозорістю?


stackoverflow.com/questions/6624457/... Зверніть увагу, що там у мене є коментар (під відповідь Філа), який показує спосіб зробити це з прозорістю css, якщо це найкращий спосіб. ( jsfiddle.net/4tTNZ )
Joonas

Ця відповідь набагато коротша, і я вважаю, що вона точно така ж.
JohnAllen

Відповіді:


102

Ні, цього не можна зробити, оскільки це 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 псевдоелемент

Інший фокус полягає у використанні псевдоелементів CSS 2.1 :beforeабо CSS 3 ::before. :beforeпсевдоелемент підтримується в IE з версії 8, тоді як ::beforeпсевдоелемент взагалі не підтримується. Сподіваємось, це буде виправлено у версії 10.

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

155

Отже, є інший спосіб:

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
Можливо, ви можете додати коментар або невелике оновлення до свого питання, повідомивши, що це тепер новий хороший спосіб це зробити. До нових
зустрічей

@jj_: Насправді це рішення не робить зображення прозорим. Він лише додає білий шар із 50% прозорістю поверх нього. Отже, це не правильна відповідь на запитання.
mekwall

7
Я думаю, що ми можемо домовитись, що він досягає наміру питання, так що так, це вірна відповідь на питання.
Девід Кларк

так .. ця відповідь в
основному

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

html

<div> put your div content</div>

0

Це можна зробити, використовуючи інший клас div для тексту Привіт там ...

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

Тепер ви можете застосувати стилі до

тег. інакше для класу bg. Я впевнений, що це працює нормально


0

Я реалізував рішення Маркуса Еквола, але зміг видалити кілька речей, щоб зробити його простішим, і воно все ще працює. Можливо версія 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-index (можливо, це поводиться сьогодні по-різному і може також залежати від браузера). Але довіряти браузеру, щоб він поводився належним чином, як правило, погана ідея.
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 хвилин проти стільки часу на це ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.