Гид по технологиям

Netflix-подобный слайдер — 3 варианта (CSS и JS)

3 min read Веб-разработка Обновлено 09 Jan 2026
Netflix-подобный слайдер — CSS и JS примеры
Netflix-подобный слайдер — CSS и JS примеры

Короткое введение

Слайдер в стиле Netflix — популярный приём интерфейса: горизонтальная лента карточек с увеличением и превью при наведении. Ниже приведены три рабочих реализации, которые вы можете скопировать, адаптировать и расширить.

Важно: изображения и примеры кода сохранены как в исходном материале; в продуктивной среде отдавайте приоритет оптимизации изображений и lazy-loading.

Слайдер в стиле Netflix

1. Слайдер с кнопками навигации (только CSS)

Этот вариант имитирует навигацию между «страницами» ленты с помощью якорных ссылок и CSS-грида. При наведении карточка увеличивается.

Слайдер в стиле Netflix с кнопками навигации

При наведении:

Эффект наведения: слайдер с кнопками навигации

Используйте следующий HTML и CSS — код приведён полностью.

HTML Code

  
  
  
  
   
 Netflix Carousel  
   
  
  
  
 

NETFLIX

CSS Code

html {  
 scroll-behavior: smooth;  
}  
  
body {  
 margin: 0;  
 background-color: #000;  
}  
  
h1 {  
 font-family: Arial;  
 color: red;  
 text-align: center;  
}  
  
.wrapper {  
 display: grid;  
 grid-template-columns: repeat(3, 100%);  
 overflow: hidden;  
 scroll-behavior: smooth;  
}  
.wrapper section {  
 width: 100%;  
 position: relative;  
 display: grid;  
 grid-template-columns: repeat(5, auto);  
 margin: 20px 0;  
}  
.wrapper section .item {  
 padding: 0 2px;  
 transition: 250ms all;  
}  
.wrapper section .item:hover {  
 margin: 0 40px;  
 transform: scale(1.2);  
}  
.wrapper section a {  
 position: absolute;  
 color: #fff;  
 text-decoration: none;  
 font-size: 6em;  
 background: black;  
 width: 80px;  
 padding: 20px;  
 text-align: center;  
 z-index: 1;  
}  
.wrapper section a:nth-of-type(1) {  
 top: 0;  
 bottom: 0;  
 left: 0;  
 background: linear-gradient(-90deg, rgba(0, 0, 0, 0) 0%, black 100%);  
}  
.wrapper section a:nth-of-type(2) {  
 top: 0;  
 bottom: 0;  
 right: 0;  
 background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, black 100%);  
}  
  
@media only screen and (max-width: 600px) {  
 a.arrow__btn {  
 display: none;  
}  
}

2. Слайдер с горизонтальной полосой прокрутки (только CSS)

Этот пример использует горизонтальную прокрутку браузера и поведение hover для появления деталей. Подходит для простых страниц, где не нужен JavaScript.

Слайдер в стиле Netflix с горизонтальной полосой прокрутки

При наведении:

Эффект наведения: слайдер с горизонтальной полосой прокрутки

HTML Code

  
  
  
  
   
 Netflix Carousel  
   
  
  
  
 

Pure CSS Netflix Video Carousel

Top Gear
Top Gear
Top Gear
Top Gear
Top Gear
Top Gear
Top Gear

CSS Code

body,  
html {  
 padding: 0 10px;  
 margin: 0;  
 background: #0e0f11;  
 color: #ecf0f1;  
 font-family: 'Open Sans', sans-serif;  
 min-height: 100vh;  
 display: flex;  
 flex-direction: row;  
 align-items: center;  
 width: 100%;  
}  
  
* {  
 box-sizing: border-box;  
}  
  
h1 {  
 text-align: center;  
}  
  
a:link,  
a:hover,  
a:active,  
a:visited {  
 transition: color 150ms;  
 color: #95a5a6;  
 text-decoration: none;  
}  
  
a:hover {  
 color: #7f8c8d;  
 text-decoration: underline;  
}  
  
.contain {  
 width: 100%;  
}  
  
.row {  
 overflow: scroll;  
 overflow-y: hidden;  
 width: 100%;  
}  
  
.row__inner {  
 transition: 450ms transform;  
 font-size: 0;  
 white-space: nowrap;  
 margin: 70.3125px 0;  
 padding-bottom: 10px;  
}  
  
.tile {  
 position: relative;  
 display: inline-block;  
 width: 250px;  
 height: 140.625px;  
 margin-right: 10px;  
 font-size: 20px;  
 cursor: pointer;  
 transition: 450ms all;  
 transform-origin: center left;  
}  
  
.tile__img {  
 width: 250px;  
 height: 140.625px;  
 -o-object-fit: cover;  
 object-fit: cover;  
}  
  
.tile__details {  
 position: absolute;  
 bottom: 0;  
 left: 0;  
 right: 0;  
 top: 0;  
 font-size: 10px;  
 opacity: 0;  
 background: linear-gradient(to top, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0) 100%);  
 transition: 450ms opacity;  
}  
  
.tile__details:after,  
.tile__details:before {  
 content: '';  
 position: absolute;  
 top: 50%;  
 left: 50%;  
 display: #000;  
}  
  
.tile__details:after {  
 margin-top: -25px;  
 margin-left: -25px;  
 width: 50px;  
 height: 50px;  
 border: 3px solid #ecf0f1;  
 line-height: 50px;  
 text-align: center;  
 border-radius: 100%;  
 background: rgba(0, 0, 0, 0.5);  
 z-index: 1;  
}  
  
.tile__details:before {  
 content: '▶';  
 left: 0;  
 width: 100%;  
 font-size: 30px;  
 margin-left: 7px;  
 margin-top: -18px;  
 text-align: center;  
 z-index: 2;  
}  
  
.tile:hover .tile__details {  
 opacity: 1;  
}  
  
.tile__title {  
 position: absolute;  
 bottom: 0;  
 padding: 10px;  
}  
  
.row__inner:hover {  
 transform: translate3d(-62.5px, 0, 0);  
}  
  
.row__inner:hover .tile {  
 opacity: 0.3;  
}  
  
.row__inner:hover .tile:hover {  
 transform: scale(1.5);  
 opacity: 1;  
}  
  
.tile:hover~.tile {  
 transform: translate3d(125px, 0, 0);  
}

3. Слайдер с кнопками навигации (CSS + JavaScript)

Гибридный вариант позволяет программно прокручивать ленту, показывать/скрывать стрелки и корректно обрабатывать события колесика мыши.

Слайдер в стиле Netflix с навигацией на CSS и JavaScript

При наведении:

Эффект наведения: слайдер с навигацией на CSS и JavaScript

HTML Code

  
  
  
  
   
 Netflix Carousel  
   
   
  
  
  
   
  
  
  

CSS Code

body {  
 background-color: #343434;  
 margin: 0;  
 padding: 0;  
 margin: auto;  
}  
  
div.items {  
 white-space: nowrap;  
 flex-flow: row nowrap;  
 justify-content: space-between;  
 overflow: hidden;  
 display: flex;  
 align-self: center;  
}  
div.items:hover .item {  
 opacity: 0.3;  
}  
div.items:hover .item:hover {  
 opacity: 1;  
}  
div.control-container {  
 height: 300px;  
 position: absolute;  
 width: 100%;  
 overflow: hidden;  
 box-sizing: border-box;  
}  
div.container {  
 -webkit-user-select: none;  
 -moz-user-select: none;  
 -ms-user-select: none;  
 user-select: none;  
 min-height: 300px;  
 position: relative;  
 width: 100%;  
 box-sizing: border-box;  
 overflow: hidden;  
 display: flex;  
 flex-flow: row nowrap;  
 justify-content: center;  
}  
/* ...остальной CSS как в исходнике... */

JavaScript Code

function MouseWheelHandler(e, element) {  
 var delta = 0;  
 if (typeof e === 'number') {  
 delta = e;  
 } else {  
 if (e.deltaX !== 0) {  
 delta = e.deltaX;  
 } else {  
 delta = e.deltaY;  
 }  
 e.preventDefault();  
 }  
  
 element.scrollLeft -= (delta);  
  
}  
  
window.onload = function() {  
 var carousel = {};  
 carousel.e = document.getElementById('carousel');  
 carousel.items = document.getElementById('carousel-items');  
 carousel.leftScroll = document.getElementById('left-scroll-button');  
 carousel.rightScroll = document.getElementById('right-scroll-button');  
  
 carousel.items.addEventListener("mousewheel", handleMouse, false);  
 carousel.items.addEventListener("scroll", scrollEvent);  
 carousel.leftScroll.addEventListener("click", leftScrollClick);  
 carousel.rightScroll.addEventListener("click", rightScrollClick);  
  
 setLeftScrollOpacity();  
 setRightScrollOpacity();  
  
 function handleMouse(e) {  
 MouseWheelHandler(e, carousel.items);  
 }  
  
 function leftScrollClick() {  
 MouseWheelHandler(100, carousel.items);  
 }  
  
 function rightScrollClick() {  
 MouseWheelHandler(-100, carousel.items);  
 }  
  
 function scrollEvent(e) {  
 setLeftScrollOpacity();  
 setRightScrollOpacity();  
 }  
  
 function setLeftScrollOpacity() {  
 if (isScrolledAllLeft()) {  
 carousel.leftScroll.style.opacity = 0;  
 } else {  
 carousel.leftScroll.style.opacity = 1;  
 }  
 }  
  
 function isScrolledAllLeft() {  
 if (carousel.items.scrollLeft === 0) {  
 return true;  
 } else {  
 return false;  
 }  
 }  
  
 function isScrolledAllRight() {  
 if (carousel.items.scrollWidth > carousel.items.offsetWidth) {  
 if (carousel.items.scrollLeft + carousel.items.offsetWidth === carousel.items.scrollWidth) {  
 return true;  
 }  
 } else {  
 return true;  
 }  
  
 return false;  
 }  
  
 function setRightScrollOpacity() {  
 if (isScrolledAllRight()) {  
 carousel.rightScroll.style.opacity = 0;  
 } else {  
 carousel.rightScroll.style.opacity = 1;  
 }  
 }  
}

Дополнения и лучшие практики

Доступность (чеклист)

  • Кнопки навигации: добавьте aria-label и tabindex.
  • Картинки: используйте осмысленные alt-атрибуты (если изображение — контент, а не декоративное).
  • Управление клавиатурой: обеспечьте фокусировку на карточках, поддержите стрелки для прокрутки.
  • Размеры и контраст: текстовые оверлеи должны соответствовать WCAG по контрасту.

Когда этот подход не подходит

  • Большое количество карточек (тысячи): нужно ленивое подгружение и виртуализация.
  • Сильная динамическая подгрузка контента: лучше управлять DOM из JavaScript/фреймворка.
  • Требуется поддержка старых браузеров без полифилов (например, отсутствие object-fit или scroll-behavior).

Альтернативы

  • Slick, Swiper — готовые библиотеки со множеством опций и адаптивностью.
  • Реализация на React/Vue с виртуализацией (react-window) для больших наборов данных.
  • CSS Scroll Snap для более «нативного» поведения прокрутки.

Критерии приёмки

  • Навигационные стрелки видны/скрываются корректно при достижении краёв.
  • Эффект hover масштабирует карточку без смещения соседних карточек критично.
  • Управление клавиатурой и скринридеры предоставляют базовую навигацию.
  • Подгрузка изображений не блокирует рендер основного контента.

Мини‑методология для внедрения (шаги)

  1. Выберите вариант: CSS-only или JS.
  2. Подготовьте оптимизированные изображения (WebP/AVIF, responsive).
  3. Реализуйте базовый HTML/CSS и протестируйте макет.
  4. Добавьте доступность (ARIA, tabindex).
  5. Добавьте lazy-loading и тесты производительности.
  6. Тестируйте на мобильных устройствах, планшетах и в популярных браузерах.

Шаблон проверки ролей (быстрый чеклист)

  • Дизайнер: утверждённые размеры карточек, состояния hover/active.
  • Фронтенд: верстка и тестирование производительности.
  • QA: сценарии прокрутки, клавиатурная навигация, адаптивность.
  • PM: подтверждение критериев приёмки и доступности.

Краткий глоссарий (1 строка)

  • Карточка: визуальный блок с изображением и метаданными.
  • Hover: состояние при наведении курсора.
  • Scroll snap: CSS-механизм «прилипания» к элементам при прокрутке.

Резюме

  1. Три варианта слайдера: CSS-only с кнопками, CSS-only с прокруткой и гибрид с JavaScript.
  2. Для простых страниц подойдёт вариант без JS; для контроля поведения и UX лучше использовать JavaScript.
  3. Обязательно учтите доступность, lazy-loading и оптимизацию изображений перед релизом.

Важно: код в статье распространяется по MIT License — проверяйте лицензию сторонних изображений и шрифтов перед коммерческим использованием.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство