Полупрозрачный цветной слой поверх фонового изображения?


213

У меня есть DIV, и я хотел бы использовать шаблон в качестве фона. Этот шаблон серый. Поэтому, чтобы сделать его немного приятнее, я бы хотел нанести легкий прозрачный цветной «слой» поверх. Ниже я попробовал, но это не сработало. Есть ли способ нанести цветной слой поверх фонового изображения?

Вот мой CSS:

background: url('../img/bg/diagonalnoise.png');
background-color: rgba(248, 247, 216, 0.7);

Ответы:


217

Вот:

.background {
    background:url('../img/bg/diagonalnoise.png');
    position: relative;
}

.layer {
    background-color: rgba(248, 247, 216, 0.7);
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

HTML для этого:

<div class="background">
    <div class="layer">
    </div>
</div>

Конечно, вам нужно определить ширину и высоту для .backgroundкласса, если внутри него нет других элементов


11
нет абсолютной причины для относительного и абсолютного позиционирования.
Свен Бидер

2
Ах да, конечно, я вроде был в модальном всплывающем окне, не знаю почему. Ваш ответ, конечно, чище и проще.
Йоханнес Клаус

@ JohannesKlauß, почему его ответ стал чище и проще? это не работает, по крайней мере, для моего случая.
Danny22

2
Я думаю, что это чище. Box-shadow имеет проблемы, если контент не длиннее, чем BG и т. Д.
Jack

1
Идеальное решение!
Рой Шоа

302

Я знаю, что это действительно старая тема, но она отображается вверху в Google, так что вот еще один вариант.

Это чистый CSS и не требует дополнительного HTML.

box-shadow: inset 0 0 0 1000px rgba(0,0,0,.2);

Существует удивительное количество применений функции box-shadow.


3
Очень хорошо! Это хорошая идея с точки зрения производительности? Не смотрел на представление box-shadow
Мигель Стивенс

18
Хороший взлом, но большой убийца производительности. Это замедлит каждое мобильное устройство. Тень блока вызывает проблемы с производительностью на мобильных устройствах. Лучше избегать этого, особенно если есть другой путь.
Гексодус

4
Вы гений сэр!
Мика

7
Просто обновление пару лет спустя: я в настоящее время использую этот метод по всему kotulas.com, и я не заметил значительного замедления. Это может стать проблемой, если вы используете его на сотнях элементов, но даже на странице с 150+ изображениями это не проблема для меня. (И это на рабочем компьютере.) Естественно, вы захотите проверить его заранее, чтобы убедиться, что он подходит именно вам. А что касается совместимости со старым браузером, поскольку запасной вариант заключается в том, что пользователь не видит эффекта наведения мыши (без других проблем), я согласен с этим.
BevansDesign

8
Я лично использую это так: box-shadow: inset 0 0 0 100vmax rgba(0, 0, 0, .2).
Нейротрансмиттер

135

Из CSS-хитрости ... есть один шаг, чтобы сделать это без z-индексации и добавления псевдоэлементов - требуется линейный градиент, который, я думаю, означает, что вам нужна поддержка CSS3

.tinted-image {
  background-image: 
    /* top, transparent red */
    linear-gradient(
      rgba(255, 0, 0, 0.45), 
      rgba(255, 0, 0, 0.45)
    ),
    /* your image */
    url(image.jpg);
}

Это сработало замечательно, но вы не можете анимировать градиенты, однако, если вы хотите передать цвет, не думайте, что это возможно с помощью любого метода.
Sricks

1
У меня был background-size:cover;и background-position:center center;установлен этот элемент. Это, кажется, отменяет этот эффект.
Утешение

Отлично работает с фоновым размером: обложка; после. По хрому хотя бы.
Давидбоначера

Определенно самый удобный способ подкрасить фоновые рисунки и изображения, но будьте осторожны, чтобы проверить это с помощью Chrome и других, особенно если он применяется к тегу body, Chrome будет прокручиваться с тонной задержкой. FF прекрасно с этим справляется.
Хастиг Зусамменстеллен

4
Я один достаточно взрослый, чтобы получить справку о Томе?
Аврам

46

Вы также можете использовать линейный градиент и изображение: http://codepen.io/anon/pen/RPweox

.background{
  background: linear-gradient(rgba(0,0,0,.5), rgba(0,0,0,.5)),
    url('http://www.imageurl.com');
}

Это потому, что функция линейного градиента создает изображение, которое добавляется в фоновый стек. https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient


Хороший хак для добавления в панель инструментов!
Адам Йост

26

Попробуй это. Работает для меня.

.background {
    background-image: url(images/images.jpg);
    display: block;
    position: relative;
}

.background::after {
    content: "";
    background: rgba(45, 88, 35, 0.7);
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1;
}

.background > * {
    z-index: 10;
}

2
Это действительно отличный ответ, который не требует дополнительных элементов HTML. Спасибо!
patr1ck

26

Затем вам нужен элемент обертки с изображением bg и в нем элемент содержимого с цветом bg:

<div id="Wrapper">
  <div id="Content">
    <!-- content here -->
  </div>
</div>

и CSS:

#Wrapper{
    background:url(../img/bg/diagonalnoise.png); 
    width:300px; 
    height:300px;
}

#Content{
    background-color:rgba(248,247,216,0.7); 
    width:100%; 
    height:100%;
}

16

Я использовал это как способ применения цветовых оттенков, так и градиентов к изображениям, чтобы упростить стиль динамического наложения текста для удобочитаемости, когда вы не можете управлять цветовыми профилями изображения. Вам не нужно беспокоиться о z-index.

HTML

<div class="background-image"></div>

SASS

.background-image {
  background: url('../img/bg/diagonalnoise.png') repeat;
  &:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(248, 247, 216, 0.7);
  }
}

CSS

.background-image {
  background: url('../img/bg/diagonalnoise.png') repeat;
}

.background-image:before {
    content: '';
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    background: rgba(248, 247, 216, 0.7);
  }

Надеюсь, поможет


Это работает, но вам нужно изменить второй «left: 0;» к «дну: 0;»
Мэтью Хадсон

1
Это должен быть принятый ответ, поскольку он позволяет избежать создания ненужных элементов. Просто убедитесь, что ваше .background-изображение divимеет хотя бы позицию: относительный
mjsarfatti

6

Смотрите мой ответ на https://stackoverflow.com/a/18471979/193494 для всестороннего обзора возможных решений:

  1. используя несколько фонов с линейным градиентом,
  2. несколько фонов с сгенерированным PNG, или
  3. стилизация an: после псевдоэлемента, чтобы действовать как вторичный фоновый слой.

4
Пожалуйста, не размещайте ссылки в качестве ответов. Поместите соответствующий код сюда, но дополнительно укажите ссылку на источник, с которого вы его скопировали.
Blazemonger

4

Почему так сложно? Ваше решение было почти правильным, за исключением того, что способ сделать шаблон прозрачным, а фон - сплошным . PNG может содержать прозрачные пленки. Поэтому используйте Photoshop, чтобы сделать рисунок прозрачным, установив слой на 70% и сохранив изображение. Тогда вам нужен только один селектор. Работает кросс-браузер.

CSS:

.background {
   background: url('../img/bg/diagonalnoise.png');/* transparent png image*/
   background-color: rgb(248, 247, 216);
}

HTML:

<div class="background">
   ...
</div> 

Это основные. Пример использования следует , где я переключился от backgroundдо , background-imageно оба свойства работает одинаково.

body { margin: 0; }
div {
   height: 110px !important;
   padding: 1em;
   text-transform: uppercase;
   font-family: Arial, Helvetica, sans-serif;
   font-weight: 600;
   color: white;
   text-shadow: 0 0 2px #333;
}
.background {
   background-image: url('https://www.transparenttextures.com/patterns/arabesque.png');/* transparent png image */
   }
.col-one {
  background-color: rgb(255, 255, 0);
}
.col-two {
  background-color: rgb(0, 255, 255);
}
.col-three {
  background-color: rgb(0, 255, 0);
}
<div class="background col-one">
 1. Background
</div> 
<div class="background col-two">
 2. Background
</div> 
<div class="background col-three">
 3. Background
</div> 

ПОЖАЛУЙСТА, ПОДОЖДИТЕ МИНУТУ! Это займет некоторое время, чтобы загрузить внешние шаблоны.

Этот сайт кажется довольно медленным ...


Можете ли вы применить фоновый цвет с, например, :hoverи это будет накладываться поверх фонового изображения?
Сэр

это займет больше времени, чтобы загрузить Photoshop и сделать это, а не добавить несколько строк кода.
nihiser

Я попробовал это, но обнаружил, что прозрачный png был довольно большим (~ 500 КБ) в размере файла, что может быть недостатком этого подхода
madz

@madz Я говорил о создании шаблона - который не должен приводить к большому файлу. Я добавил пример, используя изображение размером 110x110px размером всего 5 КБ. Если вам действительно нужно увеличенное изображение, попробуйте использовать tinypng.com для его сжатия.
Гексодус

2

Вы можете использовать полупрозрачный пиксель, который вы можете сгенерировать, например, здесь , даже в base64. Вот пример с белым 50%:

background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgDTD2qgAAAAASUVORK5CYII=),
url(../img/leftpanel/intro1.png);
background-size: cover, cover;
  • без загрузки

  • без лишних HTML

  • я думаю, загрузка должна быть быстрее, чем box-shadow или линейный градиент


2

Вот более простой трюк только с css.

<div class="background"> </div>
    <style>
    .background {
      position:relative;
      height:50px;
      background-color: rgba(248, 247, 216, 0.7);
      background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAJElEQVQYV2NctWrVfwYkEBYWxojMZ6SDAmT7QGx0K1EcRBsFAADeG/3M/HteAAAAAElFTkSuQmCC); 
    }

    .background:after {
        content:" ";
        background-color:inherit;
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%; 
    }

    </style>


1

Еще один с SVG в качестве встроенного оверлейного изображения (примечание: если вы используете #внутри svg-кода, вы должны urlencode это!):

background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1 1"><path fill="rgba(255, 255, 255, 0.4)" d="M0 0h1v1H0z"/></svg>')
                no-repeat center center/cover, 
            url('overlayed-image.jpg') no-repeat center center/cover;

0

Я просто использовал свойство css background-image на целевом фоне div.
Обратите внимание, что background-image принимает только градиентные цветовые функции.
Поэтому я использовал линейный градиент, добавляя один и тот же нужный цвет наложения дважды (используйте последнее значение rgba для управления непрозрачностью цвета).

Кроме того, найдены эти два полезных ресурса для:

  1. Добавьте текст (или div с любым другим контентом) поверх фонового изображения: изображение героя
  2. Размытие только фонового изображения, без размытия div сверху: размытое фоновое изображение

HTML

<div class="header_div">
</div>

<div class="header_text">
  <h1>Header Text</h1>
</div>

CSS

.header_div {
  position: relative;
  text-align: cover;
  min-height: 90vh;
  margin-top: 5vh;
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  width: 100vw;
  background-image: linear-gradient(rgba(38, 32, 96, 0.2), rgba(38, 32, 96, 0.4)), url("images\\header img2.jpg");
  filter: blur(2px);
}

.header_text {
  position: absolute;
  top: 50%;
  right: 50%;
  transform: translate(50%, -50%);
}

0

Вы также можете добавить непрозрачность к своему цвету наложения.

Вместо того чтобы делать

background: url('../img/bg/diagonalnoise.png');
background-color: rgba(248, 247, 216, 0.7);

Ты можешь сделать:

background: url('../img/bg/diagonalnoise.png');

Затем создайте новый стиль для цвета непрозрачности:

.colorStyle{
    background-color: rgba(248, 247, 216, 0.7);
    opacity: 0.8;
}

Измените непрозрачность на любое число ниже 1. Затем вы сделаете этот цветовой стиль того же размера, что и ваше изображение. Он должен работать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.