根据CSS规范,为开发者提供良好控制的滚动体验是引入 CSS scroll snap的主要原因之一。它增强了用户体验,并使其更容易实现滚动体验。
要创建一个滚动容器,以下是我们需要做的基本内容
overflow
举个例子:
Item 1Item 2Item 3Item 4Item 5
.section { white-space: nowrap; overflow-x: auto; }
多年来,使用white-space: nowrap
是一种流行的CSS解决方案,用于强制元素保持内联。不过,现在我们基本都使用 Flexbox
:
.section { display: flex; overflow-x: auto; }
实际上需要将每个项目移动到它自己的位置。这并不是滑动,这是一种非常糟糕的体验,通过使用CSS scroll snap,我们可以通过简单地定义snap points来解决这个问题,它将使用户更容易地水平或垂直滚动。
接着,我们来看看如何使用CSS scroll snap。
要在容器上使用scroll snap,它的子项目应该内联显示,这可以用我上面解释的方法之一来实现。我选择CSS flexbox:
Item 1Item 2Item 3Item 4Item 5
.section { display: flex; overflow-x: auto; }
了这个,我们需要添加另外两个属性来让scroll snap工作。我们应该在哪里添加它们?
首先,我们需要将scroll-snap-type
添加到滚动容器中。 在我们的示例中,是.section
元素。 然后,我们需要向子项(即.section__item
)添加scrolln-snap-align
。
.section { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; } .section__item { scroll-snap-align: start; }
这里你可能想知道x mandatory
和start
是干嘛用的。 不用担心,这是本文的核心,下面会对其进行深入的讲解。
这一刻,我对CSS scroll snap非常兴奋,它使滚动更加自然。现在,让我们深入研究scroll snap 属性。
根据CSS规范,scroll-snap-type 属性定义在滚动容器中的一个临时点(snap point)如何被严格的执行。
滚动容器的轴表示滚动方向,它可以是水平或垂直的,x
值表示水平滚动,而y
表示垂直滚动。
/* 水平*/ .section { display: flex; overflow-x: auto; scroll-snap-type: x; } /* 垂直*/ .section { height: 250px; overflow-y: auto; scroll-snap-type: y; }
.section { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; } .section__item { scroll-snap-align: start; }
.section { display: flex; overflow-x: auto; /* proximity is the default value, I added it for clarity reasons */ scroll-snap-type: x proximity; }
有时,我们可能需要一种方法来防止用户在滚动时意外跳过一些重要的项。如果用户滚动太快,就有可能跳过某些项。
.section__item { scroll-snap-align: start; scroll-snap-stop: normal; }
法动太快可能会跳过三个或四个项目,如下所示:
scroll-snap-stop
的默认值是normal
,要强制滚动捕捉到每个可能的点,应使用always
。
.section__item { scroll-snap-align: start; scroll-snap-stop: always; }
直滚动也是如此。参见下面的示例:
.section { overflow-y: auto; scroll-snap-type: y mandatory; scroll-padding: 50px 0 0 0; }
.images-list { display: flex; overflow-x: auto; scroll-snap-type: x; gap: 1rem; -webkit-overflow-scrolling: touch; /* Important for iOS devices */ } .images-list img { scroll-snap-align: start; }
注意,我使用x
作为scroll-snap-type
的值。
.list { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; gap: 1rem; scroll-padding: 48px; padding-bottom: 32px; -webkit-overflow-scrolling: touch; } .list-item { scroll-snap-align: start; }
请注意,滚动容器的padding-bottom:32px
。 这样做的目的是提供额外的空间,以便box-shadow
可以按预期显示。
.list { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; } .list-item { scroll-snap-align: center; }
这在一个角色列表中是很有用的,角色在滚动容器的中间是很重要的
main { height: 100vh; overflow-y: auto; scroll-snap-type: y mandatory; -webkit-overflow-scrolling: touch; } .section { height: 100vh; scroll-snap-align: start; }
值得一提的是,对于scroll-snap-type,可以使用inline
和block
逻辑值。参见下面的示例
main { scroll-snap-type: inline mandatory; }
使用 CSS scroll snap时,请确保可访问性。 这是滚动对齐的一种不好用法,它阻止用户自由滚动内容以读取内容。
.wrapper { scroll-snap-type: y mandatory; } h2 { scroll-snap-align: start; }
请务必不要这样做。
这是我刚刚学到的一个新的CSS特性的长篇文章。我希望它对你有用。
原文地址:https://ishade.com/article/css-scroll-snap/
作者:Ahmad
译文地址:https://segmentfault.com/a/1190000038459089
更多编程相关知识,请访问:编程入门!!
以上就是优化滚动的小技巧:使用CSS Scroll Snap!!的详细内容,更多请关注其它相关文章!