/* Keyword values */
scroll-target-group: none;
scroll-target-group: auto;
/* Global values */
scroll-target-group: inherit;
scroll-target-group: initial;
scroll-target-group: revert;
scroll-target-group: revert-layer;
scroll-target-group: unset;
scroll-target-group
属性指定为以下关键字值之一:
将元素的 scroll-target-group
设置为 auto
,表示它是一个滚动标记组容器。这会将一组导航项组合在一起,允许用户在页面上的元素之间导航(例如轮播项或文章部分),并突出显示当前正在视图中的元素。
容器内带有片段标识符的任何 <a>
元素都会自动设置为滚动标记。滚动目标当前在视图中的锚点元素可以通过 :target-current
伪类进行样式设置。
使用 scroll-target-group
创建的滚动标记组容器的行为与使用 scroll-marker-group
属性创建的容器非常相似,但有一些区别:
- 使用
scroll-target-group
,您必须创建自己的标记来表示滚动标记组容器和滚动标记,而 scroll-marker-group
会自动创建一组伪元素来表示容器(::scroll-marker-group
)和标记(一个或多个 ::scroll-marker
实例)。这些伪元素会自动与它们生成的滚动容器建立预期的导航关联。使用 scroll-marker-group
可以更快地进行设置,因为您不需要使用自己的标记。然而,通过 scroll-target-group
创建自己的标记并将其设置为滚动标记组容器提供了更多的控制和灵活性。
- 通过
scroll-target-group
指定为滚动标记的链接没有特殊的导航行为,而通过 scroll-marker-group
生成的标记会自动应用 tablist
/tab
语义,这意味着它们在 Tab 键顺序中表现为单个项,用户可以使用箭头键在滚动标记之间移动。同样,scroll-marker-group
提供了有用的默认行为,但您可以灵活地为使用 scroll-target-group
指定的标记提供替代语义和行为。
scroll-target-group =
none |
auto
此示例显示了一个页面,其中包含链接到不同部分的目录。
HTML
我们的标记包含一系列包含内容的 <section>
元素,以及一个使用有序列表(<ol>
/<li>
)和 <a>
元素创建的目录。
<nav id="toc">
<ol>
<li><a href="#intro">Introduction</a></li>
<li><a href="#ch1">Chapter 1</a></li>
<li><a href="#ch2">Chapter 2</a></li>
<li><a href="#ch3">Chapter 3</a></li>
<li><a href="#ch4">Chapter 4</a></li>
</ol>
</nav>
<section id="intro" class="chapter">
<h1>Prose of the century</h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
</section>
<section id="ch1" class="chapter">
<h2>Chapter 1</h2>
<!-- ... -->
</section>
<section id="ch2" class="chapter">
<h2>Chapter 2</h2>
<!-- ... -->
</section>
<!-- ... -->
<nav id="toc">
<ol>
<li><a href="#intro">Introduction</a></li>
<li><a href="#ch1">Chapter 1</a></li>
<li><a href="#ch2">Chapter 2</a></li>
<li><a href="#ch3">Chapter 3</a></li>
<li><a href="#ch4">Chapter 4</a></li>
</ol>
</nav>
<section id="intro" class="chapter">
<h1>My story</h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
</section>
<section id="ch1" class="chapter">
<h2>Chapter 1</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat.
Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra
congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus
varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.
</p>
<p>
Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies
lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</p>
</section>
<section id="ch2" class="chapter">
<h2>Chapter 2</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat.
Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra
congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus
varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.
</p>
</section>
<section id="ch3" class="chapter">
<h2>Chapter 3</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat.
Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra
congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus
varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.
</p>
</section>
<section id="ch4" class="chapter">
<h2>Chapter 4</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat.
Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra
congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus
varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.
</p>
</section>
CSS
为了简洁起见,我们省略了大部分样式。与此示例最相关的是,我们在 <ol>
上设置了 scroll-target-group: auto
,将其转换为滚动标记组容器,并触发浏览器算法来计算在任何给定时间哪个 <a>
元素是 :target-current
(即,哪个链接的目标当前在视图中)。然后,我们使用 red
color
为 :target-current
伪类设置样式,使其清晰可见。
body {
font: 1.2em / 1.5 system-ui;
width: 50%;
max-width: 700px;
margin: 0 auto;
}
nav {
position: fixed;
top: 0;
left: 0;
right: 0;
display: flex;
justify-content: center;
}
section {
padding-top: 60px;
}
a {
color: black;
text-decoration: none;
}
a:hover,
a:focus {
text-decoration: underline;
}
ol {
display: flex;
width: 100%;
justify-content: space-around;
list-style-type: none;
padding: 20px 0;
margin: 0;
background: white;
}
ol {
scroll-target-group: auto;
}
:target-current {
color: red;
}
结果
尝试通过激活链接和滚动来导航。您会看到在每种情况下,红色高亮都会在链接之间移动,以匹配当前显示的章节。
此示例展示了如何使用 scroll-target-group
创建 CSS 轮播滚动标记。此示例的代码与我们的单页轮播示例类似;我们只在下面解释不同之处。
HTML
标记在定义每个页面的列表项上设置了 ID,并添加了一个有序列表,我们将使用 CSS 将其转换为滚动标记组容器。
<h1>CSS carousel single item per page</h1>
<ul>
<li id="page1">
<h2>Page 1</h2>
</li>
<li id="page2">
<h2>Page 2</h2>
</li>
<li id="page3">
<h2>Page 3</h2>
</li>
<li id="page4">
<h2>Page 4</h2>
</li>
</ul>
<ol>
<li><a href="#page1">1</a></li>
<li><a href="#page2">2</a></li>
<li><a href="#page3">3</a></li>
<li><a href="#page4">4</a></li>
</ol>
CSS
我们通过在 <ol>
元素上设置 scroll-target-group
来创建滚动标记组容器和滚动标记。其余的样式代码非常相似,不同之处在于我们选择自己的元素(<ol>
和 <a>
),而不是 ::scroll-marker-group
和 ::scroll-marker
伪元素。
我们通过在 :target-current
、a:hover
和 a:focus
状态上设置一些样式来完成代码,以指示当前显示的页面以及正在悬停/聚焦的链接。
/* General styles */
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: "Helvetica", "Arial", sans-serif;
}
h1 {
text-align: center;
}
button {
background-color: white;
}
/* General styling of list as scrolling carousel */
ul {
width: 100%;
height: 400px;
padding: 20px;
gap: 4%;
display: grid;
grid-auto-flow: column;
grid-auto-columns: 100%;
overflow-x: scroll;
scroll-snap-type: x mandatory;
}
ul li {
list-style-type: none;
background-color: #eeeeee;
border: 1px solid #dddddd;
padding: 20px;
scroll-snap-align: center;
}
/* CSS scroll buttons */
/* Style the scroll buttons */
ul::scroll-button(*) {
border: 0;
font-size: 2rem;
background: none;
color: rgb(0 0 0 / 0.7);
cursor: pointer;
}
ul::scroll-button(*):hover,
ul::scroll-button(*):focus {
color: black;
}
ul::scroll-button(*):active {
translate: 1px 1px;
}
ul::scroll-button(*):disabled {
color: rgb(0 0 0 / 0.2);
}
ul::scroll-button(left) {
content: "◄";
}
ul::scroll-button(right) {
content: "►";
}
/* Position the scroll buttons */
ul {
anchor-name: --my-carousel;
}
ul::scroll-button(*) {
position: absolute;
position-anchor: --my-carousel;
}
ul::scroll-button(left) {
right: calc(anchor(left) - 70px);
top: calc(anchor(bottom) - 80px);
}
ul::scroll-button(right) {
left: calc(anchor(right) - 70px);
top: calc(anchor(bottom) - 80px);
}
ol {
position: absolute;
position-anchor: --my-carousel;
top: calc(anchor(bottom) - 90px);
justify-self: anchor-center;
display: flex;
justify-content: center;
gap: 20px;
list-style-type: none;
padding: 0;
scroll-target-group: auto;
}
ol a {
width: 28px;
height: 28px;
display: inline-block;
text-align: center;
text-decoration: none;
padding-top: 4px;
color: black;
background-color: transparent;
border: 2px solid black;
border-radius: 50%;
}
ol a:hover,
ol a:focus,
:target-current {
background-color: black;
color: white;
}
结果
尝试通过以下三种方式进行导航:激活滚动标记链接,水平滚动,或按下两侧的滚动按钮。您会看到在每种情况下,高亮都会在链接之间移动,以匹配当前显示的章节。