当前位置: 首页 > Web前端 > HTML

翻译-使用ScrollSnapping实现CSS控制页面滚动

时间:2023-04-03 01:10:08 HTML

特别声明,本文翻译自@alligatorio的文章ControlPageScrollinCSSUsingScrollSnapping,受译者能力所限,翻译可能有误有不足之处。欢迎指出。如需转载,请注明出处。ScrollSnapping“ScrollSnapping”是你一定见过的技术。如果实施不当,可能会非常烦人,并给用户带来糟糕的浏览体验。但是,如果实施得当,它可能是实施显示内容的功能(例如图片库)的好方法。以前滚动捕捉只能通过JavaScript实现,但现在得益于新的CSS滚动捕捉模块“CSSScrollSnapmodule”,这种效果已经可以通过CSS实现。同时,好在浏览器可以根据用户的滚动方式,自动控制判断是否使用抓取点“捕捉点”进行抓取。这避免了捕捉点阻碍流畅导航的糟糕用户体验。让我们简要了解一下CSS中的滚动对齐是如何工作的。概述与CSS网格或Flexbox的使用类似,滚动捕获的使用需要定义父/容器元素,容器中的子元素将根据容器元素上定义的规则进行捕获。与ScrollSnapping相关的一些属性适用于容器元素,而其他一些适用于子元素。容器元素属性:scroll-snap-type容器元素最重要的属性是scroll-snap-type。它使一个普通元素成为一个snap容器“snapcontainer”元素,通过这个属性可以定义滚动snap轴“snapaxis”(取值可以是:x,y,block,inline,both),而这个属性还可以定义滚动捕获的严格程度“strictness”(取值可以是:none、proximity、mandatory)。假设你想让一个容器在y轴上滚动,并且在任何情况下都滚动捕获,那么你可以像这样使用它scroll-snap-type属性:.container{scroll-snap-type:ymandatory;}如果你想scrollsnapping在两个方向上,而且snapping行为不需要太严格,那么你可以这样写:填充,它允许为容器设置填充以避免在容器边缘触发捕捉动作。此属性的赋值语法与填充属性的赋值语法相同。子元素属性:scroll-snap-alignscroll-snap-align可能是滚动容器元素的子元素中最重要的属性。它可以接收以下值,none、start、end、center,以指定元素是否应在开始、中间或结束处滚动。基于滚动轴,并假设当前的文本方向是从左到右,则开始可以是顶部或左侧,结束可以是底部或右侧。您必须设置元素的scroll-snap-align属性值,因为它的初始值为none,这意味着不会执行对齐。scroll-marginscroll-margin属性的使用方法与margin属性相同,它可以在元素中设置不同的捕获区域。scroll-snap-stopscroll-snap-stop属性的取值可以是:normal和always,通过这个属性可以指定元素是否强制应用对齐点,即使用户的滚动行为通常会导致对齐跳过。此属性的初始值是正常的。案例接下来,我们不要停留在理论和属性的介绍上,而是通过一些简单的例子来说明。如果一个元素的滚动是基于y轴的,并且它的滚动严格设置为强制的,如下代码所示:

1
2
3
4
.container{scroll-snap-type:y强制;溢出-y:滚动;border:2pxsolidvar(--gs0);边界半径:8px;height:33vh;}.containerdiv{scroll-snap-align:start;身高:33vh;显示:弹性;证明内容:居中;;}.containerdiv:nth-child(1){背景:hotpink;颜色:白色;}.containerdiv:nth-child(2){background:azure;}.containerdiv:nth-child(3){background:blanchedalmond;}.containerdiv:nth-child(4){background:浅珊瑚;color:white;}那么它的效果是这样的:案例演示1反之,将scrollstrictness属性设置为proximity,则捕捉行为将只发生在捕捉点的近距离范围内。.container{/*...*/scroll-snap-type:yproximity;overflow-y:scroll;}/*...*/CaseDemo2最后,我们来看看当“snapsnapping”在两个轴上产生滚动条时会是什么样子。图片库是这种情况的完美用例,我们这里的容器也恰好是网格容器。首先,写好HTML:
1
2
3
4
5
6
7
8
9
然后是样式:.container2{display:grid;网格模板列:100%100%100%;scroll-snap-type:都是强制性的;溢出:滚动;边框:2px实心var(--gs0);边界半径:8px;height:33vh;}.container2div{scroll-snap-align:start;身高:33vh;显示:弹性;证明内容:居中;对齐项目:居中;font-size:4rem;}.container2div:nth-child(1){background:hotpink;颜色:白色;}.container2div:nth-??child(2){背景:天蓝色;}.container2div:nth-??child(3){背景:blanchedalmond;}.container2div:nth-??child(4){背景:浅珊瑚;颜色:白色;}.container2div:nth-child(5){背景:rebeccapurple;color:white;}/*...你懂的*/那么效果如下:CaseDemo3Learnmore本文简单介绍一些语法知识给大家。如果你有兴趣了解更多用例和查看更多示例,下面有几篇不错的文章PracticalCSSScrollSnapping实用CSSScrollSnapping(整理自PracticalCSSScrollSnapping)Well-ControlledScrollingwithCSSScrollSnap