Open
Close

Фиксированный фон html. Фиксированные, прокручивающиеся фоновые изображения

Решил я тут недавно на одном из своих сайтов сделать легкий редизайн. И дошло дело до фона. Показался он мне каким-то скучным. Захотелось его немного «оживить». Подобрал подходящую картинку небольшого размера, загнал ее в свойство фона:

Body{ background: url("../images/bg.jpg") no-repeat center center / cover fixed; }

И довольный нажал F5. Красота, да и только!

Начал скроллить страничку вниз и чувствую, что-то не то…

Такое чувство, как будто я играю в Crysis на очень старом компьютере. Почему же на сайте начались «тормоза» и прокрутка проходит рывками?

Я начал свое расследование…

Сначала я погрешил на свойство cover , но дело оказалось не в нем. Отключив фиксированное положение фона (убрав fixed), мой «Crysis» выдал мне больше 30 FPS ! «Во дела...», подумал я. Как же так? Почему? Почему я не замечал этого раньше? Возможно, это не очень заметно на легковесных сайтах, где не так много html элементов.

А дело оказалось вот в чем. Использование background-attachment: fixed каждый раз при прокрутке вызывает операцию перерисовки. Страница должна переместить свое содержимое. И когда дело доходит до фиксированного фона, браузер должен заново прорисовать картинку в новом месте, относительно существующих DOM-элементов.

Чтобы решить эту проблему, нашему фоновому изображению нужен свой элемент, чтобы оно могло двигаться независимо от других. А также нам понадобится CSS3-свойство will-change . О нем речь пойдет ниже.

Как только мы решим проблему с прорисовкой, скроллинг уже не будет проходить у нас рывками. Так как фон будет лежать на своем собственном слое, больше не потребуется перерисовывать страницу каждый раз при прокрутке.

Давайте я покажу все на примере.

Это наш изначальный код (я развернул свойства для наглядности):

Body{ background: url("../images/bg.jpg") no-repeat center center; background-attachment: fixed; background-size: cover; }

А вот, что нам необходимо сделать для решения проблемы:

Body{ position: relative; } body::before { background: url("../images/bg.jpg") no-repeat center center; background-size: cover; content: " "; height: 100%; left: 0; position: fixed; top: 0; width: 100%; will-change: transform; z-index: -1; }

Мы добавили position: relative для элемента body , чтобы затем спозиционировать псевдо-элемент, который будет отдельным слоем для нашего фона. Остальные свойства, касательно фона, мы перенесли в::before . У псевдо-элемента мы теперь используем position: fixed , вместо прежнего background-attachment: fixed у body . Ну и самое важное, без чего вся затея потерпит крах, - это свойство will-change .

Свойство will-change предписывает браузеру отображать элемент, независимо от окружающих его других элементов. Оно как бы говорит браузеру: «Эй, друг, этот элемент изменится когда-нибудь потом, в будущем, так что прорисуй его только один раз на его собственном слое. И не нужно учитывать остальные элементы - он сам по себе».

Такие вот дела.

Данный билд я протестировал в разных браузерах, и вот небольшое резюме:

  1. Google Chrome. Все ОК, работает как часы.
  2. Mozilla Firefox. Все ОК, работает как часы.
  3. Opera. Все ОК, работает как часы.
  4. Safari. Все ОК, работает как часы. За проверку спасибо smssystem
  5. Microsoft Edge. Метод работает, но есть один косяк. Если крутить колесиком, то дергается верх и низ страницы, но потом приходят в норму. Если же крутить с помощью скроллбара, то все ОК.
  6. Internet Explorer. Та же проблема, что и у Edge.

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

Сегодня в интернете можно увидеть множество сайтов с параллакс-эффектом. Похожий эффект можно реализовать через CSS. По идее нужно просто применить параллакс эффект к фоновым изображениям. Для этого ознакомьтесь с CSS свойством background-attachment .

Создание структуры

HTML очень прост: чередуем элементы

с классом.cd-fixed-bg - для фиксации фона - с элементами
с классом.cd-scrolling-bg - обычными настройками для фона.

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore incidunt suscipit similique, dolor corrupti cumque qui consectetur autem laborum fuga quas ipsam doloribus sequi...

Стили

Значение по умолчанию для свойства background-attachment равно scroll , что означает прокрутку фона вдоль элемента. Если же задать значение fixed , то позиция будет фиксированной.

Body, html, main { /* important */ height: 100%; } .cd-fixed-bg { min-height: 100%; background-size: cover; background-attachment: fixed; background-repeat: no-repeat; background-position: center center; } .cd-fixed-bg.cd-bg-1 { background-image: url("../img/cd-background-1.jpg"); } .cd-fixed-bg.cd-bg-2 { background-image: url("../img/cd-background-2.jpg"); } .cd-fixed-bg.cd-bg-3 { background-image: url("../img/cd-background-3.jpg"); } .cd-fixed-bg.cd-bg-4 { background-image: url("../img/cd-background-4.jpg"); } .cd-scrolling-bg { min-height: 100%; }

Трепачёв Д.П. 2012-2020 г.

Ученикам: у меня до 6 января каникулы, на каникулах буду отвечать по возможности,
иногда могу на пару дней пропадать

Верстка JavaScript PHP NodeJs Vue React Laravel WordPress AJAX Парсинг Основной учебник Справочник HTML Справочник CSS Учебник ООП и MVC Видеоуроки Основной учебник Справочник Видеоуроки Основной учебник Основной учебник Основной учебник Учебник администратора Учебник разработчика Учебник AJAX+PHP

Свойство background-attachment

Свойство background-attachment задает каким образом прокручивать фоновую картинку элемента: вместе с текстом или текст будет скользить по картинке.

Синтаксис

Селектор { background-attachment: fixed | scroll | local; }

Значения

Значение по умолчанию: scroll .

Пример . Значение scroll

Сейчас свойство background-attachment установлено в значение scroll . Прокрутите элемент по вертикали - вы увидите, как текст прокручивается вместе с фоном:

какой-то длинный текст...
body { background-attachment: scroll; background-image: url("bg.png"); } #elem { width: 400px; margin: 0 auto; text-align: justify; font-weight: bold; font-size: 20px; }

Пример . Значение scroll

А теперь свойство background-attachment установлено в значение fixed . Прокрутите элемент по вертикали - вы увидите, как текст скользит по фону:

какой-то длинный текст...
body { background-attachment: fixed; background-image: url("bg.png"); } #elem { width: 400px; margin: 0 auto; text-align: justify; font-weight: bold; font-size: 20px; }

По умолчанию, когда вы скроллите веб-страницу с фоном, фон прокручивается вместе с другими элементами. Иногда это уместно, а иногда хочется, чтобы изображение, заданное через background-image , всегда оставалось на виду. Для управления этим состоянием существует свойство background-attachment .

Значения background-attachment

Свойство может принимать три значения для настройки поведения фона:

  • scroll (значение по умолчанию) - фоновое изображение перемещается вместе с другими элементами при скролле веб-страницы.
  • fixed - значение фиксирует фоновое изображение, делая его нечувствительным к скроллу. При прокручивании страницы фон на заднем плане останется неподвижным.
  • local - данное значение было добавлено из-за того, что в случае с локальным скроллом фон со значением scroll ведет себя как fixed . При значении local фон прокручивается вместе с содержимым элемента, и не прокручивается, если содержимое не скроллится (но прокручивается вместе с самим элементом).

Для лучшего понимания работы свойства взгляните на примеры ниже. Чтобы вы могли их сравнить, ваш все три значения background-attachment (надеемся, что при изучении CSS вы пользуетесь современным десктопным браузером!).

background-attachment: scroll

background-attachment: fixed

background-attachment: local

Поддержка браузерами

Полная поддержка всех значений свойства background-attachment есть у десктопных браузеров IE9+, Edge 12+, Firefox 25+, Chrome (все версии), Safari 5+, Opera 11.5+. Из мобильных браузеров все значения понимают Opera Mobile, Firefox для Android, IE Mobile и QQ Browser. В других браузерах поддержка либо частичная, либо отсутствует.

Далее в учебнике: свойства background-origin и background-clip для позиционирования фоновых изображений и управления обрезкой.