特别声明,本文翻译自@alligatorio的Control Page Scroll in CSS Using Scroll Snapping一文,受限于译者能力,译文或存在不足,欢迎大家指出。如需转载,烦请注明出处。


滚动捕捉「Scroll Snapping」是一项你肯定已经见过的技术。当实现得不佳时,它会十分惹人厌,给用户带来很差的浏览体验。但当实现得好的时候,它又会是用于实现展示内容的功能的好方法,如图片画廊。过去滚动捕捉只能通过JavaScript实现,但现在得益于新的CSS滚动捕捉模块「CSS Scroll Snap module」,这种效果已经可以通过CSS实现了。

同时令人庆幸的是浏览器可以根据用户的滚动方式自动控制并判断是否利用捕捉点「snap point」捕捉。这可以避免捕捉点阻碍平滑导航这种不好的用户体验。

让我们简要介绍一下CSS中的滚动捕捉是如何工作的。

概览

CSS grid或者Flexbox的使用类似,滚动捕捉的使用需要定义父级/容器元素,容器内的子元素会根据容器元素上定义的规则进行捕捉。

Scroll Snapping的相关属性中有一些是应用在容器元素上的,而另一些则用于子元素。

容器元素属性:scroll-snap-type

容器元素上最重要的属性就是scroll-snap-type。它令一个普通元素成为一个捕捉容器「snap container」元素,并且通过这个属性可以定义滚动捕捉轴「snap axis」(取值可为:x,y,block,inline,both),同时这个属性还可以定义滚动捕捉的严格性「strictness」(取值可为:none,proximity,mandatory).

假设你想要某个容器在y轴上滚动,并且在任何情况下都进行滚动捕捉,那么你可以这样使用scroll-snap-type属性:

.container {
scroll-snap-type: y mandatory;
}

如果你想要在两个方向上都进行滚动捕捉,并且捕捉行为也不需要太过严格,那么你可以这样写:

.container {
scroll-snap-type: both proximity;
}

scroll-padding

另一个作用于容器元素上的属性是scroll-padding,它允许为容器设置padding,以避免捕捉动作在容器的边缘触发。这个属性的赋值语法与padding属性的语法相同。

子元素属性:scroll-snap-align

在滚动容器元素的子元素中,scroll-snap-align可能会是最重要的属性。它可以接收以下几个值,none,start,end,center,以指定元素是在开头、中间、还是结束时进行滚动捕获。基于滚动轴,并假设当前为从左到右的文本方向,那么start可以是顶部或左侧,而end可以是底部或右侧。

你必须要设置元素的scroll-snap-align属性值,因为它的初始值是none,这表示不会执行任何的捕捉。

scroll-margin

scroll-margin属性的使用方式与margin属性一样,它可以设置元素中的不同捕捉区域。

scroll-snap-stop

scroll-snap-stop属性的取值可以为:normalalways,通过这个属性可以指定元素是否强制应用捕捉点,即使用户的滚动行为通常会导致跳过捕捉。这个属性的初始值为normal

案例

接下来我们不再停留在理论和属性介绍上,来通过一些简单例子的演示一下吧。如果一个元素的滚动是基于y轴之上,且它的scroll strictness被设置为mandatory,如下面的代码所示:

<div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
.container {
scroll-snap-type: y mandatory;
overflow-y: scroll;
border: 2px solid var(--gs0);
border-radius: 8px;
height: 33vh;
}
.container div {
scroll-snap-align: start; height: 33vh;
display: flex;
justify-content: center;
align-items: center;
font-size: 4rem;
}
.container div:nth-child(1) {
background: hotpink;
color: white;
}
.container div:nth-child(2) {
background: azure;
}
.container div:nth-child(3) {
background: blanchedalmond;
}
.container div:nth-child(4) {
background: lightcoral;
color: white;
}

那么它的效果会像这样:

案例演示1

相反地,将scroll strictness属性设置为proximity,那么捕捉行为将只会在snap point的近距离范围内发生。

.container {
/* ... */
scroll-snap-type: y proximity;
overflow-y: scroll;
} /* ... */

案例演示2

最后,一起来看一下当「snap snapping」在两条轴上的滚动条上都产生的时候会是什么样子。图片画廊就是一个这种情况下的完美用例,而我们这里的容器也恰好是一个网格容器。

首先,写好HTML:

<div class="container2">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>

然后是样式:

.container2 {
display: grid;
grid-template-columns: 100% 100% 100%;
scroll-snap-type: both mandatory;
overflow: scroll; border: 2px solid var(--gs0);
border-radius: 8px;
height: 33vh;
} .container2 div {
scroll-snap-align: start; height: 33vh;
display: flex;
justify-content: center;
align-items: center;
font-size: 4rem;
}
.container2 div:nth-child(1) {
background: hotpink;
color: white;
}
.container2 div:nth-child(2) {
background: azure;
}
.container2 div:nth-child(3) {
background: blanchedalmond;
}
.container2 div:nth-child(4) {
background: lightcoral;
color: white;
}
.container2 div:nth-child(5) {
background: rebeccapurple;
color: white; } /* ...你懂得 */

然后实现效果如下:

案例演示3

了解更多

这篇文章浅显地向大家介绍了一些语法知识,如果你有兴趣了解更多的用例和查看更多示例,下面有几篇不错的文章。

Practical CSS Scroll Snapping

实战CSS Scroll Snapping(整理自Practical CSS Scroll Snapping)

Well-Controlled Scrolling with CSS Scroll Snap

译-使用Scroll Snapping实现CSS控制页面滚动的更多相关文章

  1. Flex中使用CSS控制页面样式

    Using file: Stylebounding.mxml Stylebounding2.mxml myCSS0329.css 在Flex4中使用CSS控制样式,既可以直接在MXML文件中写样式,也 ...

  2. 【学习DIV+CSS】2. 学习CSS(一)--CSS控制页面样式

    1. CSS如何控制页面 使用XHTML+CSS布局页面,其中有一个很重要的特点就是“结构与表现相分离”(结构指XHTML,表现指CSS).有人这样描述这种分离的关系,结构XHTML好比一个人,表现C ...

  3. 《Two Days DIV + CSS》读书笔记——CSS控制页面方式

    1.1 你必须知道的知识 (其中包括1.1.1 DIV + CSS的叫法解释:1.1.2 DIV + CSS 名字的误区:以及1.1.3 W3C简介.由于只是背景知识,跳过该章.) 1.2 你必须掌握 ...

  4. 通过CSS控制页面中的内容垂直居中的方法

    方法一:通过行高(line-height)定位 line-height通常是用于调节一段文字的行与行之间的距离,或者说两行文字之间的距离,如果行高是500px,那么每一行中的文字距离本行的顶部就是25 ...

  5. css控制页面打印(分页、屏蔽不需要打印的对象)

    样式: <style   media="print">     .Noprint   {   DISPLAY:   none;}     .PageNext   {   ...

  6. css控制页面文字不能被选中user-select:none;

    现象:html中可能有些地方不想让用户复制文字,或是用a标签做了个点击按钮,点快的时候文字会被选中,很丑,这个时候可以使用下面的方案禁止文字选中. 原因:鼠标点快了文字会被选中. 解决方案:不同的浏览 ...

  7. WOW.js和animate.css让页面滚动时显示动画

    官网:http://mynameismatthieu.com/WOW/ bootstrap CDN服务:http://www.bootcdn.cn/wow/ 1.wow.js 实现了在网页滚动时的动画 ...

  8. Web--CSS控制页面(link与import方式区别)

    先了解: [1]         “Table”和“DIV”这两个网页元素诞生的目的不同,首先Table诞生的目的是为了存储数据,而DIV诞生的目的就是为了架设页面结构 W3C,是World Wide ...

  9. Web--CSS控制页面(link与import方式差别)

        先了解: [1]         "Table"和"DIV"这两个网页元素诞生的目的不同,首先Table诞生的目的是为了存储数据,而DIV诞生的目的就是 ...

随机推荐

  1. day 01 常量 注释 int(整型) 用户交互input 流程控制语句if

    python的编程语言分类(重点) if 3 > 2: 编译型: 将代码一次性全部编译成二进制,然后再执行. 优点:执行效率高. 缺点:开发效率低,不能跨平台. 代表语言:C 解释型: 逐行解释 ...

  2. mybatis工作原理及实现

    对数据库的连接 使用时就创建连接,不使用就立即释放,对数据库进行频繁连接开启和关闭,造成数据库的资源浪费,影响数据库的性能: 解决办法:使用数据库连接池,管理数据库的连接. 2 将sql语句硬编码到j ...

  3. flutter-dart语言初识

    dart 官方文档 http://dart.goodev.org/guides/language/language-tour# 重要概念所以能够使用变量引用的都是对象,也就是所以可以赋值给变量的都是对 ...

  4. js 学习一 猜数字游戏

    知识点 js 操作元素 增 (document.createElement(),document.body.appendChild()), 删(parentNode.removeChild()) ,改 ...

  5. iconv_close - 关闭字符转换描述符

    总览 (SYNOPSIS) #include <iconv.h> int iconv_close (iconv_t cd); 描述 (DESCRIPTION) iconv_close 函数 ...

  6. XML 总结

    XML 可用于交换.共享和存储数据. XML 文档形成 树状结构,在"根"和"叶子"的分支机构开始的. XML 有非常简单的 语法规则.带有正确语法的 XML ...

  7. canvas在高倍屏下变模糊的处理办法

    因为canvas不是矢量图,而是像图片一样是位图模式的.如果不做Retina屏适配的话,例如二倍屏,浏览器就会以2个像素点的宽度来渲染一个像素,该canvas在Retina屏幕下相当于占据了2倍的空间 ...

  8. [易学易懂系列|rustlang语言|零基础|快速入门|(8)|Operators操作符]

    [易学易懂系列|rustlang语言|零基础|快速入门|(8)] 有意思的基础知识 Operators 我们今天再来看看操作符. 算术运算 操作符: + - * / % 代码如下 : let a = ...

  9. Spring Boot 整合监听器

    Listener是servlet规范中定义的一种特殊类,用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件,监听域对象的属性发生修改的事 ...

  10. Metafile::EmfToWmfBits的使用

    其中涉及到string转换LPCWSTR以及模块绝对路径的调用 #include <iostream> #include <stdio.h> #include <WIND ...