Как убрать или стилизовать полосу прокрутки — CSS скроллбар

HTML и CSS
232054 просмотра

Скроллбар — единственный элемент интерфейса, который пользователь видит постоянно, а дизайнеры вспоминают о нём в последнюю очередь. Между тем стилизация полосы прокрутки CSS делается без JavaScript и jQuery-плагинов. В статье разберём все способы: как скрыть или убрать полосу прокрутки CSS, изменить CSS скроллбар через стандартные свойства и webkit-псевдоэлементы — с детальным контролем и живыми примерами.

Стилизация полосы прокрутки CSS — кастомный скроллбар

Из чего состоит скроллбар

Браузеры на движке Webkit/Blink (Chrome, Edge, Opera) раскрывают внутренности скроллбара через CSS-псевдоэлементы с префиксом ::-webkit-scrollbar . Их четыре основных:

  • ::-webkit-scrollbar — полоса целиком: задаёт ширину и фон
  • ::-webkit-scrollbar-track — дорожка: пространство, по которому движется бегунок
  • ::-webkit-scrollbar-thumb — бегунок: тот самый перетаскиваемый элемент
  • ::-webkit-scrollbar-button — кнопки со стрелками вверх/вниз (их обычно скрывают)
Анатомия CSS скроллбара — псевдоэлементы webkit-scrollbar
В Firefox webkit-псевдоэлементы не работают — там используют стандарт: scrollbar-width и scrollbar-color. Оба подхода можно прописать одновременно: браузер применит только тот, что ему подходит.

Как скрыть полосу прокрутки CSS

Частая задача — убрать полосу прокрутки визуально, но оставить саму возможность прокручивать. Делается в четыре строки:

.element {
    scrollbar-width: none; /* Firefox */
}
.element::-webkit-scrollbar {
    display: none; /* Chrome, Edge, Safari */
}

Для всей страницы замените .element на body . Колёсико мыши и свайп продолжат работать — просто полоска исчезнет с экрана.

Стандартный способ: scrollbar-width и scrollbar-color

В 2018 году появилась официальная спецификация CSS Scrollbars. Она даёт два свойства без каких-либо префиксов, и уже поддерживается во всех современных браузерах: Firefox 64+, Chrome 121+, Edge 121+, Safari 15.4+.

scrollbar-width — управляет шириной полосы. Три значения:

scrollbar-width: auto;   /* по умолчанию */
scrollbar-width: thin;   /* тонкий скроллбар */
scrollbar-width: none;   /* скрыть полностью */

scrollbar-color — задаёт цвет бегунка и дорожки через пробел: сначала бегунок, потом дорожка:

/* бегунок — #18aaaa, дорожка — #f1f5f9 */
.element {
    scrollbar-color: #18aaaa #f1f5f9;
}

/* или системные цвета */
.element {
    scrollbar-color: auto;
}

Вот как это выглядит вживую — прокрутите блок:

Стандартные свойства scrollbar-width и scrollbar-color из спецификации CSS Scrollbars Level 1. Работают в Firefox, Chrome 121+ и Edge 121+ без webkit-префикса. Цвет бегунка и дорожки задаётся одной строкой. Форма бегунка определяется браузером — скруглить углы или добавить градиент этим способом нельзя, зато код получается предельно простым.

.element {
    scrollbar-width: thin;
    scrollbar-color: #6366f1 #e0e7ff;
}

Стандартный способ — проще и кросс-браузернее, но даёт меньше контроля: нельзя задать скруглённые углы, тени или градиент на бегунке. Для тонкой стилизации нужен webkit-подход ниже.

Как изменить скроллбар CSS через webkit

Псевдоэлементы работают в Chrome, Edge и Safari. Разберём пошагово, как собрать аккуратный кастомный скроллбар с нуля.

Шаг 1 — ширина и фон полосы

.element::-webkit-scrollbar {
    width: 8px;
    background-color: #f1f5f9;
}

Шаг 1: задана ширина 8px и фоновый цвет дорожки #f1f5f9. Бегунок пока отображается в системном стиле браузера — мы только начали. Прокрутите блок и обратите внимание: полоса уже стала заметно уже стандартной.

Шаг 2 — дорожка

::-webkit-scrollbar-track — фон вокруг бегунка. Добавим скруглённые углы и лёгкую внутреннюю тень для глубины:

.element::-webkit-scrollbar-track {
    background-color: #f1f5f9;
    border-radius: 4px;
    -webkit-box-shadow: inset 0 0 4px rgba(0, 0, 0, 0.2);
}

Шаг 2: добавлена стилизация дорожки — border-radius скругляет края, -webkit-box-shadow с inset создаёт едва заметную глубину. Бегунок всё ещё системный, но общее ощущение уже меняется.

Шаг 3 — бегунок

::-webkit-scrollbar-thumb — главный элемент. Добавим смену цвета при наведении, чтобы пользователь понял, что с ним можно взаимодействовать:

.element::-webkit-scrollbar-thumb {
    background-color: #18aaaa;
    border-radius: 4px;
}

.element::-webkit-scrollbar-thumb:hover {
    background-color: #0d9090;
}

Шаг 3: добавлен цвет бегунка #18aaaa и смена цвета при наведении на #0d9090. Наведите курсор на бегунок — он потемнеет. Скроллбар готов.

Четыре строки — и скроллбар выглядит лучше, чем у большинства сайтов в интернете. Чтобы применить стили ко всей странице, уберите .element и используйте псевдоэлементы без дополнительных селекторов:

::-webkit-scrollbar {
    width: 8px;
}

::-webkit-scrollbar-track {
    background-color: #f1f5f9;
    border-radius: 4px;
    -webkit-box-shadow: inset 0 0 4px rgba(0, 0, 0, 0.2);
}

::-webkit-scrollbar-thumb {
    background-color: #18aaaa;
    border-radius: 4px;
}

::-webkit-scrollbar-thumb:hover {
    background-color: #0d9090;
}

Готовые примеры CSS скроллбара

Три варианта оформления — каждый работает прямо здесь. Прокрутите любой блок, чтобы увидеть результат:

Пример 1 — полосатый бегунок

Полупрозрачный глянцевый эффект на бегунке создаётся через -webkit-gradient: светлая полоса поверх персикового фона #f2bf93. Старый синтаксис, но работает в Chrome стабильно.

::-webkit-scrollbar {
    width: 10px;
}
::-webkit-scrollbar-track {
    background: #f9f9fd;
}
::-webkit-scrollbar-thumb {
    background-color: #f2bf93;
    background-image: -webkit-linear-gradient(45deg,rgba(255, 255, 255, .25) 25%,
            transparent 25%,
            transparent 50%,
            rgba(255, 255, 255, .25) 50%,
            rgba(255, 255, 255, .25) 75%,
            transparent 75%,
            transparent);
}

Пример 2 — синий градиент

Градиент от голубого #00c6fb к синему #005bea. border-radius: 10px добавляет плавности. Используется в технологичных и корпоративных интерфейсах.

::-webkit-scrollbar {
    width: 10px;
}
::-webkit-scrollbar-track {
    background: #f1f5f9;
    border-radius: 10px;
}
::-webkit-scrollbar-thumb {
    background: linear-gradient(180deg, #00c6fb, #005bea);
    border-radius: 10px;
}

Пример 3 — минималистичный

Тонкая полоса в 4 пикселя почти не занимает места. Прозрачная дорожка делает скроллбар ненавязчивым. При наведении бегунок темнеет.

::-webkit-scrollbar {
    width: 4px;
}
::-webkit-scrollbar-track {
    background: transparent;
}
::-webkit-scrollbar-thumb {
    background: #cbd5e1;
    border-radius: 2px;
}
::-webkit-scrollbar-thumb:hover {
    background: #94a3b8;
}

Предотвращаем скачок страницы: scrollbar-gutter

Знакомая ситуация: открывается модальное окно, прокрутка страницы блокируется через overflow: hidden на body — и страница прыгает вбок на несколько пикселей. Место, которое занимал скроллбар, освободилось. Раньше это чинили магическим padding-right: 17px . Теперь есть нормальный способ:

html {
    scrollbar-gutter: stable;
}

scrollbar-gutter: stable резервирует место под скроллбар даже когда он скрыт — страница не прыгает. Если хотите зарезервировать место с обеих сторон (например, для симметрии), добавьте both-edges :

html {
    scrollbar-gutter: stable both-edges;
}
Комбинируйте оба подхода: пишите scrollbar-width/color для Firefox, следом ::-webkit-scrollbar для Chrome и Safari. Браузеры применят только тот блок, который понимают — конфликта не будет.
Вам может быть интересно:
CSS псевдокласс :is() — группировка селекторов в одно правило
CSS псевдокласс :is() — как и где его использовать
Меш градиент CSS — сетчатый фон из нескольких radial-gradient
Как сделать меш градиент в CSS — Mesh gradient генератор
Вставка видео с Rutube на сайт — iframe и адаптивный embed
Как правильно вставить видео с RuTube на сайт
Встраивание YouTube видео на сайт — адаптивный плеер на HTML и CSS
Добавляем YouTube видео на сайт
Комментарии 0 Разные мнения приветствуются. Здесь можно спорить и обсуждать, но уважительно и без токсичности.
Отмена