Кратко
Скопированоbackground управляет тем, двигается ли фон при прокрутке страницы или остаётся на месте. Именно оно отвечает за классический параллакс-эффект.
Пример
СкопированоПараллакс-эффект: фон остаётся на месте, а контент прокручивается поверх него.
<section class="hero"> <h1>Заголовок</h1></section><section class="content"> <p>Обычный контент...</p></section>
<section class="hero">
<h1>Заголовок</h1>
</section>
<section class="content">
<p>Обычный контент...</p>
</section>
.hero { background-image: url("mountain.jpg"); background-size: cover; background-attachment: fixed; height: 100vh;}
.hero {
background-image: url("mountain.jpg");
background-size: cover;
background-attachment: fixed;
height: 100vh;
}
При прокрутке страницы фон секции .hero остаётся зафиксированным, создавая глубину между слоями.
Как понять
СкопированоУ каждого фона есть точка привязки — то, относительно чего он позиционируется при прокрутке. background эту точку и задаёт.
scroll — фон привязан к самому элементу. Страница скроллится — элемент вместе с фоном движется. Но если у элемента есть собственная прокрутка, фон при ней не сдвигается: он зафиксирован относительно границ элемента, не его содержимого.
fixed — фон привязан к вьюпорту. Страница скроллится, элемент движется, а фон остаётся на месте. Это и создаёт эффект параллакса.
local — фон привязан к содержимому элемента. Если у элемента есть прокрутка, фон скроллится вместе с текстом.
Разница между scroll и local заметна только у элементов с собственной прокруткой (то есть с overflow: scroll или auto). Если у элемента нет скролла, то эти два значения визуально не отличаются.
Как пишется
Скопировано
.element { background-attachment: scroll; /* значение по умолчанию */ background-attachment: fixed; background-attachment: local;}
.element {
background-attachment: scroll; /* значение по умолчанию */
background-attachment: fixed;
background-attachment: local;
}
scroll
СкопированоЗначение по умолчанию. Фон зафиксирован относительно самого элемента и не прокручивается вместе с его содержимым. Когда страница скроллится, элемент движется вместе с фоном как единое целое.
Если у элемента есть внутренняя прокрутка, пользователь, листая содержимое, не сдвинет фон, он останется на своём месте внутри элемента.
fixed
СкопированоФон фиксируется относительно вьюпорта браузера. Это главный инструмент для создания параллакс-эффекта: содержимое страницы прокручивается, а фоновое изображение стоит неподвижно.
При использовании fixed значение background игнорируется, позиционирование фона всегда считается от вьюпорта.
local
СкопированоФон прикреплён к содержимому элемента. Если у элемента есть скролл, фон прокручивается вместе с содержимым будто это часть самого текста или контента.
Это удобно, например, для элементов с длинным текстом и декоративным паттерном на фоне, который должен двигаться вместе с текстом при прокрутке.
Несколько фонов
СкопированоЕсли у элемента несколько фоновых изображений, можно задать разные значения background для каждого из них — через запятую, в том же порядке, что и в background.
.element { background-image: url("stars.png"), url("sky.jpg"); background-attachment: fixed, scroll;}
.element {
background-image: url("stars.png"), url("sky.jpg");
background-attachment: fixed, scroll;
}
Первое изображение (stars) зафиксировано, второе (sky) прокручивается вместе с элементом.
Подсказки
Скопировано💡 fixed на мобильных устройствах работает нестабильно. iOS Safari исторически отображает background как scroll, игнорируя фиксацию — из-за особенностей реализации скролла. Для мобильных параллакс-эффектов лучше использовать CSS-трансформации или JavaScript.
💡 background создаёт новый контекст наложения и может влиять на производительность при прокрутке, так как браузер вынужден перерисовывать фон при каждом шаге скролла. В современных браузерах это оптимизировано, но на слабых устройствах большие fixed-фоны могут вызывать подтормаживания.
💡 Параллакс-эффект с background работает только тогда, когда прокручивается именно страница (документ). Если прокручивается контейнер с overflow, фиксированный фон внутри него не создаст параллакс-эффекта — он просто встанет неподвижно относительно вьюпорта, а не относительно контейнера.
- Chrome 1, поддерживается
- Edge 12, поддерживается
- Firefox 25, поддерживается
- Safari 15.4, поддерживается
На практике
Скопированосоветует
Скопировано🛠 Самый быстрый параллакс. Без JS и библиотек. Достаточно двух свойств: background и background. Фон прибивается к вьюпорту, контент скроллится поверх него. Секции чередуются: фото с параллаксом, потом обычный блок с текстом, потом снова фото — и получается многослойная глубина.
.parallax-section { height: 100vh; background-image: url("photo.jpg"); background-size: cover; background-position: center; background-attachment: fixed;}.content-section { padding: 60px 40px; background: #fff;}
.parallax-section {
height: 100vh;
background-image: url("photo.jpg");
background-size: cover;
background-position: center;
background-attachment: fixed;
}
.content-section {
padding: 60px 40px;
background: #fff;
}
Важный нюанс: fixed не работает на iOS Safari — браузер отображает фон как scroll. Если сайт должен работать на мобильных, параллакс лучше делать через JS или CSS-трансформации.
🛠 Разница между scroll и local видна только в элементах с overflow. По умолчанию (scroll) фон зафиксирован относительно границ блока: текст скроллится, паттерн стоит на месте. С local фон движется вместе с содержимым, как будто напечатан на той же бумаге. Это удобно для текстовых блоков с декоративным паттерном, который должен ощущаться частью содержимого, а не рамкой.
.container { height: 300px; overflow-y: scroll; background-image: url("pattern.svg"); background-repeat: repeat; background-attachment: local;}
.container {
height: 300px;
overflow-y: scroll;
background-image: url("pattern.svg");
background-repeat: repeat;
background-attachment: local;
}
🛠 background в связке с background даёт эффект «фото сквозь текст». Изображение просвечивает через буквы, и при прокрутке разные части фото появляются в тексте — как через движущееся окно. С scroll изображение зафиксировано в тексте и не меняется при прокрутке. Разницу лучше один раз увидеть в демке.
.title { background-image: url("photo.jpg"); background-size: cover; background-position: center; background-attachment: fixed; -webkit-background-clip: text; background-clip: text; color: transparent;}
.title {
background-image: url("photo.jpg");
background-size: cover;
background-position: center;
background-attachment: fixed;
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}