::scroll-button()

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

::scroll-button() CSS 伪元素表示用于控制滚动容器滚动的按钮。当其 content 属性值不为 none 时,它们会在滚动容器上生成。滚动的方向由参数值决定。

语法

css
::scroll-button(<scroll-button-direction>) {
  /* ... */
}

参数

<scroll-button-direction>

一个表示你想要选择的滚动按钮方向的值。可用值如下:

*

选中所有原始元素的滚动按钮,允许在一条规则中为每个按钮应用样式。

down

选中将内容向下滚动的按钮。

left

选中将内容向左滚动的按钮。

选中将内容向右滚动的按钮。

up

选中将内容向上滚动的按钮。

block-end

选中将内容向块末尾方向滚动的按钮。

block-start

选中将内容向块起始方向滚动的按钮。

inline-end

选中将内容向行内末尾方向滚动的按钮。

inline-start

选中将内容向行内起始方向滚动的按钮。

规范还定义了另外两个值——nextprev——但目前没有任何浏览器支持它们。

描述

仅当 content 属性被设置为 none 以外的值时,::scroll-button() 伪元素才会在滚动容器内生成。它们作为滚动容器子 DOM 元素的同级元素生成,紧邻这些子元素以及容器上生成的任何 ::scroll-marker-group 之前。

每个滚动容器最多可以生成四个滚动按钮,它们将内容向块轴和行内轴的起点和终点滚动。选择器的参数指定了所选的滚动方向。你也可以指定一个 * 值来定位所有的 ::scroll-button() 伪元素,从而在一条规则中为所有按钮提供样式。

生成的按钮的行为就像常规的 <button> 元素一样,包括共享它们的默认浏览器样式。它们是可聚焦的、可访问的,并且可以像常规按钮一样被激活。当按下滚动按钮时,滚动容器的内容会向指定方向滚动一个“页面”,或者大约是滚动容器的尺寸,类似于按下 PgUpPgDn 键。

建议在滚动容器上设置 CSS 滚动捕捉,并将你想要滚动的每个独立内容项设置为一个捕捉目标。在这种情况下,激活一个滚动按钮会将内容滚动到距离一个“页面”远的捕捉目标。虽然滚动按钮在没有滚动捕捉的情况下也能工作,但你可能得不到想要的效果。

当无法再向某个滚动按钮的滚动方向进一步滚动时,该按钮会自动被禁用,否则它是启用的。你可以使用 :enabled:disabled 伪类来为滚动按钮的启用和禁用状态设置样式。

示例

更多轮播图示例,请参阅创建 CSS 轮播图

创建滚动按钮

在这个例子中,我们演示了如何在一个 CSS 轮播图上创建滚动按钮。

HTML

我们有一个基本的 HTML <ul> 列表,包含几个 <li> 列表项。

html
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
</ul>

CSS

我们通过将 display 设置为 flex,将我们的 <ul> 转换成一个轮播图,从而创建了一行不换行的 <li> 元素。将 overflow-x 属性设置为 auto,意味着如果项目在 x 轴上溢出其容器,内容将会水平滚动。然后,我们将 <ul> 转换为一个滚动捕捉容器,通过将 scroll-snap-type 的值设置为 mandatory 来确保在容器滚动时项目总是能捕捉到相应位置。

css
ul {
  display: flex;
  gap: 4vw;
  padding-left: 0;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
}

接下来,我们为 <li> 元素设置样式,使用 flex 属性使它们的宽度为容器的 100%。将 scroll-snap-align 的值设置为 start 会使得在内容滚动时,最左侧可见项目的左侧边缘捕捉到容器的左边缘。

css
li {
  list-style-type: none;
  background-color: #eeeeee;
  flex: 0 0 100%;
  height: 100px;
  padding-top: 20px;
  scroll-snap-align: start;
  text-align: center;
}
创建滚动按钮

首先,所有滚动按钮都被赋予了一些基本的样式,以及基于不同状态的样式。为键盘用户设置 :focus 样式是很重要的。此外,由于当无法再向某个方向滚动时,滚动按钮会自动被设置为 disabled,我们使用 :disabled 伪类来针对这种状态。

css
ul::scroll-button(*) {
  border: 0;
  font-size: 2rem;
  background: none;
  color: black;
  opacity: 0.7;
  cursor: pointer;
}

ul::scroll-button(*):hover,
ul::scroll-button(*):focus {
  opacity: 1;
}

ul::scroll-button(*):active {
  translate: 1px 1px;
}

ul::scroll-button(*):disabled {
  opacity: 0.2;
  cursor: unset;
}

注意:我们还在滚动按钮上设置了 cursor 值为 pointer,以使其更明显地表示可以与之交互(这对通用的用户体验认知可访问性都是一种改进),并在滚动按钮处于 :disabled 状态时取消该设置。

接下来,通过 content 属性为左、右滚动按钮设置一个合适的图标,这个属性也是导致滚动按钮生成的原因。

css
ul::scroll-button(left) {
  content: "◄";
}

ul::scroll-button(right) {
  content: "►";
}

我们不需要为 content 上的图标设置替代文本,因为浏览器会自动提供合适的无障碍名称

结果

注意滚动按钮是如何在轮播图的左下角创建的。试着按下它们,看看它们如何使内容滚动。

定位滚动按钮

前面的例子可以工作,但按钮的位置并不理想。在这一节中,我们将添加一些 CSS 来使用锚点定位来定位它们。

CSS

首先,在 <ul> 上设置了一个引用的 anchor-name,将其定义为一个命名锚点。接下来,每个滚动按钮的 position 都被设置为 absolute,并且其 position-anchor 属性被设置为列表的 anchor-name,以将两者关联起来

css
ul {
  anchor-name: --my-carousel;
}

ul::scroll-button(*) {
  position: absolute;
  position-anchor: --my-carousel;
}

为了实际定位每个滚动按钮,我们首先在它们两个上都设置了 align-self 值为 anchor-center,以使它们在轮播图上垂直居中。

css
ul::scroll-button(*) {
  align-self: anchor-center;
}

然后我们为它们的内边距属性设置值来处理水平定位。我们使用 anchor() 函数来将按钮的指定边相对于轮播图的边进行定位。在每种情况下,都使用 calc() 函数在按钮边缘和轮播图边缘之间添加一些空间。例如,左侧滚动按钮的右边缘被定位在轮播图左边缘右侧 45 像素处。

css
ul::scroll-button(left) {
  right: calc(anchor(left) - 45px);
}

ul::scroll-button(right) {
  left: calc(anchor(right) - 45px);
}

结果

规范

规范
CSS Overflow Module Level 5
# 滚动按钮

浏览器兼容性

另见