0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#Руководства</a></p>
1
<p><a>#Руководства</a></p>
2
<ul><li>23 июн 2020</li>
2
<ul><li>23 июн 2020</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>JavaScript добавляет на страницы сайта очень интересные эффекты. Один из них - параллакс. Разбираемся, что это и как его создать самостоятельно.</p>
4
</ul><p>JavaScript добавляет на страницы сайта очень интересные эффекты. Один из них - параллакс. Разбираемся, что это и как его создать самостоятельно.</p>
5
<p>vlada_maestro / shutterstock</p>
5
<p>vlada_maestro / shutterstock</p>
6
<p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6
<p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7
<p>Параллакс - это иллюзия движения объекта относительно фона, которая появляется, если движется наблюдатель. Такой эффект легко увидеть, если поднести к лицу палец и посмотреть на него сперва одним глазом, а потом вторым.</p>
7
<p>Параллакс - это иллюзия движения объекта относительно фона, которая появляется, если движется наблюдатель. Такой эффект легко увидеть, если поднести к лицу палец и посмотреть на него сперва одним глазом, а потом вторым.</p>
8
<p>В этой статье мы рассмотрим, как создать движущиеся фон и другие элементы для сайта на JavaScript.</p>
8
<p>В этой статье мы рассмотрим, как создать движущиеся фон и другие элементы для сайта на JavaScript.</p>
9
<p>Исходный код вы найдёте на <a>GitHub</a>.</p>
9
<p>Исходный код вы найдёте на <a>GitHub</a>.</p>
10
<p>Для начала подготовим два изображения, которые нам нужны, - передний и задний планы. Для заднего плана я взял фотографию космоса:</p>
10
<p>Для начала подготовим два изображения, которые нам нужны, - передний и задний планы. Для заднего плана я взял фотографию космоса:</p>
11
<a></a><p>Для переднего плана вырезал простой пейзаж с другой фотографии:</p>
11
<a></a><p>Для переднего плана вырезал простой пейзаж с другой фотографии:</p>
12
<a></a><p>Теперь нужно сверстать элементы, в которых выводятся изображения:</p>
12
<a></a><p>Теперь нужно сверстать элементы, в которых выводятся изображения:</p>
13
<div class="parallax background-space" id="background-space"></div> <div class="parallax background-tree" id="background-tree"></div><p>Альтернативный вариант: установить один из фонов для<em>body</em>, а второй для<em>wrapper</em> - адаптируйте код под свой проект. Далее добавляем стили:</p>
13
<div class="parallax background-space" id="background-space"></div> <div class="parallax background-tree" id="background-tree"></div><p>Альтернативный вариант: установить один из фонов для<em>body</em>, а второй для<em>wrapper</em> - адаптируйте код под свой проект. Далее добавляем стили:</p>
14
.parallax { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .background-space { background: url(../images/space.png); background-size: 100% 100%; z-index: 1; } .background-tree { background: url(../images/tree.png); background-size: 105% 105%; z-index: 2; filter: blur(1px); }<p>У элементов фиксированная позиция на странице - один элемент<em>(дерево)</em>расположен поверх другого<em>(космос)</em>. Также мы добавили фильтр размытости для дерева, чтобы скрыть неровности и создать ощущение расфокуса.</p>
14
.parallax { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .background-space { background: url(../images/space.png); background-size: 100% 100%; z-index: 1; } .background-tree { background: url(../images/tree.png); background-size: 105% 105%; z-index: 2; filter: blur(1px); }<p>У элементов фиксированная позиция на странице - один элемент<em>(дерево)</em>расположен поверх другого<em>(космос)</em>. Также мы добавили фильтр размытости для дерева, чтобы скрыть неровности и создать ощущение расфокуса.</p>
15
<a></a><p>Остаётся написать скрипт:</p>
15
<a></a><p>Остаётся написать скрипт:</p>
16
//Получаем элемент фона с деревом const bgTree = document.getElementById("background-tree"); //При движении мышью вызываем функцию, которая меняет положение фона document.addEventListener("mousemove", function (e) { MoveBackground(e); }); function MoveBackground(e) { //Рассчитываем, насколько далеко от начала оси находится курсор: 0 - 0, 0.5 - середина экрана, 1 - ширина экрана (например, 1920) //Затем умножаем получившееся число на 30 - настолько будет сдвигаться фон //Например, если курсор находится посередине страницы (0.5), то при умножении получится 15 //Далее отнимаем половину от 30, чтобы фон мог двигаться как влево, так и вправо let offsetX = (e.clientX / window.innerWidth * 30) - 15; let offsetY = (e.clientY / window.innerHeight * 10) - 5; //Меняем положение фона bgTree.setAttribute("style", "background-position: " + offsetX + "px " + offsetY + "px;"); }<p>Теперь посмотрим на результат:</p>
16
//Получаем элемент фона с деревом const bgTree = document.getElementById("background-tree"); //При движении мышью вызываем функцию, которая меняет положение фона document.addEventListener("mousemove", function (e) { MoveBackground(e); }); function MoveBackground(e) { //Рассчитываем, насколько далеко от начала оси находится курсор: 0 - 0, 0.5 - середина экрана, 1 - ширина экрана (например, 1920) //Затем умножаем получившееся число на 30 - настолько будет сдвигаться фон //Например, если курсор находится посередине страницы (0.5), то при умножении получится 15 //Далее отнимаем половину от 30, чтобы фон мог двигаться как влево, так и вправо let offsetX = (e.clientX / window.innerWidth * 30) - 15; let offsetY = (e.clientY / window.innerHeight * 10) - 5; //Меняем положение фона bgTree.setAttribute("style", "background-position: " + offsetX + "px " + offsetY + "px;"); }<p>Теперь посмотрим на результат:</p>
17
<p>Вы можете использовать столько слоёв, сколько вам необходимо. При этом более дальние слои должны двигаться медленнее, как в нашем случае: если зритель пройдёт несколько шагов, то на положение звёзд это никак не повлияет. А вот дерево находится близко к смотрящему, поэтому оно двигается быстрее.</p>
17
<p>Вы можете использовать столько слоёв, сколько вам необходимо. При этом более дальние слои должны двигаться медленнее, как в нашем случае: если зритель пройдёт несколько шагов, то на положение звёзд это никак не повлияет. А вот дерево находится близко к смотрящему, поэтому оно двигается быстрее.</p>
18
<p>Параллакс работает не только для фона, но и для передних планов. Что-то подобное любят использовать в Apple на своих лендингах.</p>
18
<p>Параллакс работает не только для фона, но и для передних планов. Что-то подобное любят использовать в Apple на своих лендингах.</p>
19
<p>Мы добавим на страницу частицы, которые окажутся над основным контентом и будут двигаться вместе с прокруткой страницы.</p>
19
<p>Мы добавим на страницу частицы, которые окажутся над основным контентом и будут двигаться вместе с прокруткой страницы.</p>
20
<p>Для начала нужен блок, куда мы поместим частицы:</p>
20
<p>Для начала нужен блок, куда мы поместим частицы:</p>
21
<div class="particles" id="particles"></div><p>Сам блок не виден пользователю - он нужен нам как контейнер. Теперь подготовим стили:</p>
21
<div class="particles" id="particles"></div><p>Сам блок не виден пользователю - он нужен нам как контейнер. Теперь подготовим стили:</p>
22
.particles { position: absolute; left: -9999999px; } .particle { position: fixed; top: 0; left: 0; border-radius: 50%; display: block; width: 100px; height: 100px; filter: blur(0px); z-index: 1; box-shadow: 0 0 10px rgba(0,0,0,0.5); }<p>Основные свойства частицам задаём с помощью скрипта.</p>
22
.particles { position: absolute; left: -9999999px; } .particle { position: fixed; top: 0; left: 0; border-radius: 50%; display: block; width: 100px; height: 100px; filter: blur(0px); z-index: 1; box-shadow: 0 0 10px rgba(0,0,0,0.5); }<p>Основные свойства частицам задаём с помощью скрипта.</p>
23
//Создаём класс для частиц class Particle { //Конструктор принимает положение частицы по трём осям и цвет constructor(x, y, z, color) { this.x = x; this.y = y; this.z = z; //Размытие и скорость зависят от положения частицы по оси Z //Чем выше частица, тем более размытой она будет и тем быстрее она будет двигаться let blurs = [ 0, 2, 1, 0 ]; this.blur = blurs[z]; this.speed = z; this.color = color; } //Метод движения частицы Move(d) { this.y += this.speed * d; } } //Позиция полосы прокрутки let scrollPosition = 0; //Получаем контейнер для частиц const particlesContainer = document.getElementById("particles"); //Создаём массив с частицами const particles = [ new Particle(1650, 450, 3, "#FF7019"), new Particle(1700, 450, 1, "#FF7019"), new Particle(220, 500, 3, "#FF7019"), new Particle(600, 700, 1, "#FF7019"), new Particle(900, 600, 4, "#FF7019"), new Particle(1200, 900, 2, "#FF7019"), ]; //Это функция вывода частицы на страницу Fill(); //При каждой прокрутке вызываем функцию Scroll(), которая двигает частицы window.addEventListener("scroll", function (e) { Scroll(e); }); function Scroll(e) { //Определяем, в каком направлении была прокрутка let d = 0; if(window.pageYOffset > scrollPosition) { d = 1; } else { d = -1; } scrollPosition = window.pageYOffset; //Двигаем все частицы в заданном направлении for(let i = 0; i < particles.length; i++) { particles[i].Move(d); } //Выводим всё на страницу Fill(); } function Fill() { //Очищаем контейнер particlesContainer.innerHTML = ""; //Создаём новые элементы с обновлёнными свойствами и помещаем их в контейнер for(let i = 0; i < particles.length; i++) { let div = document.createElement("div"); div.className = "particle"; div.setAttribute("style", "top: " + particles[i].y + "px; left: " + particles[i].x + "px; z-index: " + particles[i].z + "px; filter: blur(" + particles[i].blur + "px); background: " + particles[i].color + "; "); particlesContainer.appendChild(div); } }<p>Теперь можно посмотреть, как это работает:</p>
23
//Создаём класс для частиц class Particle { //Конструктор принимает положение частицы по трём осям и цвет constructor(x, y, z, color) { this.x = x; this.y = y; this.z = z; //Размытие и скорость зависят от положения частицы по оси Z //Чем выше частица, тем более размытой она будет и тем быстрее она будет двигаться let blurs = [ 0, 2, 1, 0 ]; this.blur = blurs[z]; this.speed = z; this.color = color; } //Метод движения частицы Move(d) { this.y += this.speed * d; } } //Позиция полосы прокрутки let scrollPosition = 0; //Получаем контейнер для частиц const particlesContainer = document.getElementById("particles"); //Создаём массив с частицами const particles = [ new Particle(1650, 450, 3, "#FF7019"), new Particle(1700, 450, 1, "#FF7019"), new Particle(220, 500, 3, "#FF7019"), new Particle(600, 700, 1, "#FF7019"), new Particle(900, 600, 4, "#FF7019"), new Particle(1200, 900, 2, "#FF7019"), ]; //Это функция вывода частицы на страницу Fill(); //При каждой прокрутке вызываем функцию Scroll(), которая двигает частицы window.addEventListener("scroll", function (e) { Scroll(e); }); function Scroll(e) { //Определяем, в каком направлении была прокрутка let d = 0; if(window.pageYOffset > scrollPosition) { d = 1; } else { d = -1; } scrollPosition = window.pageYOffset; //Двигаем все частицы в заданном направлении for(let i = 0; i < particles.length; i++) { particles[i].Move(d); } //Выводим всё на страницу Fill(); } function Fill() { //Очищаем контейнер particlesContainer.innerHTML = ""; //Создаём новые элементы с обновлёнными свойствами и помещаем их в контейнер for(let i = 0; i < particles.length; i++) { let div = document.createElement("div"); div.className = "particle"; div.setAttribute("style", "top: " + particles[i].y + "px; left: " + particles[i].x + "px; z-index: " + particles[i].z + "px; filter: blur(" + particles[i].blur + "px); background: " + particles[i].color + "; "); particlesContainer.appendChild(div); } }<p>Теперь можно посмотреть, как это работает:</p>
24
<p>Конечно, тут ещё многое можно улучшить: изменить размер и форму частиц на разных слоях, поработать с перспективой и размытием. Найти подходящие значения можно только перебором.</p>
24
<p>Конечно, тут ещё многое можно улучшить: изменить размер и форму частиц на разных слоях, поработать с перспективой и размытием. Найти подходящие значения можно только перебором.</p>
25
<p>Параллакс чаще всего используют на лендингах, и это всё ещё достаточно модный эффект. Вы можете модифицировать представленный в статье код или использовать формулы, чтобы создать какой-нибудь новый эффект на основе параллакса.</p>
25
<p>Параллакс чаще всего используют на лендингах, и это всё ещё достаточно модный эффект. Вы можете модифицировать представленный в статье код или использовать формулы, чтобы создать какой-нибудь новый эффект на основе параллакса.</p>
26
<a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>
26
<a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>