Как подкрасить фоновое изображение с помощью CSS?

У меня есть фоновое изображение, настроенное через CSS.

html {
background-image: url('../img/cello.jpg');
background-attachment: fixed;
background-size: 100%;
}

Я планирую использовать разные фоновые изображения для разных страниц веб-сайта: важно, чтобы текст поверх них был разборчивым. Прямо сейчас у меня есть полупрозрачный черный фон для поля #main content посередине, чтобы обеспечить удобочитаемость:

#main {
background: rgba(0, 0, 0, 0.5);
}

Что я действительно хочу сделать, так это иметь такой полупрозрачный фон по всему фоновому изображению, потому что черный ящик выглядит немного неуклюжим. Я пытался создать <div id=#tint>, который включает в себя весь HTML-документ и передать rgba(0, 0, 0, 0.5) для #tint, но это вообще не работает — я либо ничего не могу изменить, либо могу получить весь фон становится простым серым, фоновое изображение вообще не видно. Это просто невозможно?


person user1623053    schedule 24.08.2012    source источник


Ответы (5)


Я думаю, вам нужно создать элемент наложения (потенциально div) с искомым полупрозрачным фоном. Что-то типа:

.overlay {
    z-index: 1;
    height: 100%;
    width: 100%;
    position: fixed;
    overflow: auto;
    top: 0px;
    left: 0px;
    background: rgba(0, 0, 0, 0.7); /*can be anything, of course*/
}

И, конечно же, небольшая демонстрация: маленькая ссылка.

person Chris    schedule 24.08.2012
comment
ОК, это было полезно, спасибо - однако, хотя мое фоновое изображение теперь успешно затемнено, теперь мой блок/столбец содержимого в центре не виден... Ну, это не столько блок/столбец, сколько он есть. просто давая <body> маржу в размере 10% 30%. Теперь этот контент исчез. У меня недостаточно опыта в веб-дизайне, чтобы понять, почему. - person user1623053; 24.08.2012
comment
@user1623053 user1623053 Вам нужно вложить весь свой контент в оверлей div -- относитесь к нему так, как если бы он был body. Редактировать: Ну, это плохая идея - давать поля body. Вместо этого используйте другой элемент и дайте ему те же поля. - person Chris; 24.08.2012
comment
Хорошо, весь мой контент вложен в оверлейный div, и я переместил поля в специальный div только для них. Оба этих div вложены внутри тела, но вне всего остального. Теперь у меня отлично работает оверлейный оттенок, но у моего контента нет полей... - person user1623053; 24.08.2012
comment
@user1623053 user1623053 Не могли бы вы поделиться демонстрацией или ссылкой на ваш сайт, если он работает? - person Chris; 24.08.2012
comment
Хорошо, я только что вставил всю страницу в Jsfiddle: jsfiddle.net/TqNqT/15 - person user1623053; 24.08.2012
comment
@ user1623053 Вы пытаетесь добиться этого? (Вы можете просмотреть исходный код здесь: маленькая ссылка). - person Chris; 24.08.2012
comment
Да, я пытаюсь добиться этого, но с оттенком, покрывающим всю страницу. В этой демонстрации (и я пытался использовать ее на своем компьютере, результат тот же) оттенок покрывает только те части, которые видны без прокрутки. - person user1623053; 24.08.2012
comment
@ user1623053 Извините, пожалуйста, обновите свой CSS, чтобы он соответствовал моему отредактированному ответу. По сути, просто измените тонировку div с position: absolute; на position: fixed; и добавьте overflow: auto;. Рабочая демонстрация: маленькая ссылка (еще одна ссылка на исходный код). (Если это то, чего вы пытаетесь достичь, не забудьте отметить этот ответ как принятый и проголосовать за него, чтобы вопрос больше не был открытым!) - person Chris; 24.08.2012
comment
Блестяще спасибо! (Недостаточно репутации, чтобы проголосовать, но я поставил галочку) - person user1623053; 24.08.2012

Используйте background-blend-mode для простого оттенка

Вы можете использовать свойство css background-blend-mode:

.background-tint {
  background-color: rgba(200,100,0,.5); /* Tint color */
  background-blend-mode: multiply;
}

Поместите его на любой элемент с фоновым изображением, и все готово.

Это свойство хорошо поддерживается в современных браузерах, НЕ включая IE 11. Для неподдерживающих браузеров вы можете использовать полифилл.

Рабочая демонстрация


Другие варианты

Используйте filter для сложного оттенка

Вы можете использовать свойство css filter:

.background-tint {
  filter: sepia(100%) saturate(200%) brightness(70%) hue-rotate(330deg);
}

Поместите его на любой элемент с фоновым изображением, и все готово. Чтобы изменить цвет, измените значение hue-rotate.

Это свойство хорошо поддерживается в современных браузерах НЕ, включая IE 11.

Рабочая демонстрация

Используйте плоский линейный градиент и множественное наложение фона

.background-tint {
  background-image: 
    linear-gradient( rgba(0,0,0,.5), rgba(0,0,0,.5) ),
    url('http://placehold.it/420')
}

Я думаю, что это наиболее широко используемый метод, но у него есть недостаток: он жестко запрограммирован, т. е. вы не можете просто взять класс, прикрепить его к элементу и сделать оттенок.

Вы можете превратить это в миксин less или sass, что-то вроде:

less

.background-tint(@tint-color, @image-url) {
  background-image: 
    linear-gradient( @tint-color, @tint-color ),
    url( @image-url )
}

sass

@mixin background-tint($tint_color, $image_url) {
  background-image: 
    linear-gradient( $tint_color, $tint_color ),
    url( $image_url )
}

Рабочая демонстрация

Используйте прозрачный фон

.background-tint { position: relative; }

.background-tint::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,.5);
}

Преимущество этого метода заключается в том, что он работает в большинстве браузеров, и это просто хороший класс, который вы добавляете к любому элементу. Недостатком является то, что если у вас есть что-то еще внутри этого элемента, вам придется обернуть его в div с каким-то позиционированием position: relative, которое будет работать лучше всего.

Пример:

<div class="background-tint">
  <div class="u-relative">Some text here</div>
</div>
.u-relative { position: relative; }

Рабочая демонстрация

person hitautodestruct    schedule 03.02.2016
comment
только тот, который работал, не портил цвет шрифта в div - person pjammer; 17.09.2016
comment
@pjammer Что ты имеешь в виду под канализацией? Я проверил все примеры, и цвет шрифта — это то, что вы установили для параметра color. - person hitautodestruct; 08.11.2016
comment
Примечание: если вы ищете максимальную поддержку браузера, используйте linear-gradient. caniuse.com/#feat=css-gradients - person cacoder; 26.07.2018
comment
очень хорошие решения. к сожалению, это всегда создает полную заливку. п.э. если у меня есть частично прозрачное фоновое изображение, цвет наложения также заполнит прозрачные области фонового изображения. поэтому умножение не полностью ведет себя как оттенок. - person Thomasn; 16.09.2019
comment
@Thomasn Спасибо, что указали на это. Я добавил еще один метод, используя свойство filter, которое должно позволять покрывать только непрозрачные области. Минус в том, что подобрать цвет тинта непросто. - person hitautodestruct; 18.09.2019


Это будет свойство overlay https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingoverlay Но это черновик. Не полагайтесь на это

person yunzen    schedule 24.08.2012

Попробуйте непрозрачность:

opacity:0.4;
filter:alpha(opacity=40); /* For IE8 and earlier */
person tahdhaze09    schedule 24.08.2012
comment
Без изменений. Я действительно не понимаю - rgba отлично работает для основного блока содержимого. - person user1623053; 24.08.2012