TGViewer
<divelopers> <divelopers> @alexnozer_dev · 1.18K subscribers
Post #311 820
Кнопки для CSS-карусели

В 135й версии Chrome появились CSS-карусели. С помощью Scroll Snap и новых псевдо-элементов можно создать функциональные карусели (и не только) с прокруткой, стрелками и маркерами, используя лишь HTML и CSS вместо тяжёлых JS-библиотек.

Звучит классно, но разработчики Chrome поторопились и выкатили реализацию, к которой в сообществе возникли вопросы. В частности, критиковалась доступность и использование псевдо-элементов в CSS для создания кнопок.

Многие высказались в пользу использования обычных HTML-кнопок. Я в том числе оставлял фидбек и предлагал использовать активно развивающийся API Invoker Commands, который уже внедрён в Chrome 135 и Firefox 144.

В мае началось обсуждение в OpenUI о добавлении новых команд для прокрутки. Затем последовал небольшой эксплейнер с описанием API. И на днях команда Chromium взялась за создание прототипа. Поэтому есть шансы, что это появится.

Дисклеймер: это обзор раннего предложения новых функций. Синтаксис может измениться в будущем или от функций могут отказаться.


Что предлагается: 8 новых команд для прокрутки Scroll Snap контейнеров, на базе которых работает CSS-карусель. 4 команды для каждого направления плюс логические эквиваленты:

- page-up
- page-down
- page-left
- page-right
- page-block-start
- page-block-end
- page-inline-start
- page-inline-end

Выглядеть это будет вот так:

<style>
.carousel__track {
display: flex;
overflow-x: auto;
width: 300px;
scroll-snap-type: x mandatory;
}

.carousel__slide {
min-width: 300px;
scroll-snap-align: center;
}
</style>

<section
class="carousel"
aria-labelledby="related"
aria-roledescription="carousel"
>
<h2 id="related">Смотрите также</h2>
<div class="carousel__controls">
<button
type="button"
command="page-inline-start"
commandfor="track"
>
Предыдущий
</button>
<button
type="button"
command="page-inline-end"
commandfor="track"
>
Следующий
</button>
</div>
<div class="carousel__track" id="track">
<div
class="carousel__slide"
role="group"
aria-roledescription="slide"
aria-label="1 из 6"
>
<!-- Слайд 1 -->
</div>
<div
class="carousel__slide"
role="group"
aria-roledescription="slide"
aria-label="2 из 6"
>
<!-- Слайд 2 -->
</div>
<!-- остальные слайды -->
</div>
</section>

Кнопки привязываются к карусели через commandfor. Нажатие приводит к вызову системной команды на карусели «прокрутить одну страницу» в зависимости от направления. В конечном итоге это приводит к прокрутке слайдов с учётом точек привязки.

Это делает кнопки полностью настраиваемыми: можно добавить классы, атрибуты, вложить иконки, поместить в контейнер и разместить в нужном месте. Сама карусель избавляется от псевдо-элементов-кнопок, хотя их всё ещё можно будет добавить.

Для начала функциональность ограничена прокруткой одной страницы по нужной оси. Но уже обсуждаются расширения: отключение при достижении крайних элементов, автоматическая привязка без commandfor, «scroll to top» и количество страниц.

Использование обычных кнопок в сочетании с Invoker Commands — это именно то, как изначально должны были быть реализованы встроенные в платформу карусели на мой взгляд. Это понятнее, удобнее и доступнее кнопок, создаваемых в CSS.

#html #css
  • ❤ 13
  • 💩 1
  • 👾 1
More from @alexnozer_dev
  1. Sep 21, 2026Реализация пользовательских атрибутов Под конец прошлого года я рассказывал об API пользов…
  2. Sep 14, 2026Подклассы Event вместо CustomEvent Многие библиотеки предоставляют систему событий в качес…
  3. Sep 11, 2026Эволюция стилей в темах Shopify Адам Ватан на днях поделился новостью, что Shopify выкупил…
  4. Sep 9, 2026Persistent Widgets Многие сайты не должны быть SPA. Но иногда эта архитектура продиктована…
  5. Sep 7, 2026Processing Instructions и маркеры В DOM всё представлено в виде узлов (Node) разных типов.…
  6. Sep 1, 2026@scope и потоковая передача HTML Ноам Розенталь поделился интересной техникой, в которой с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →