(學習影片分享:css影片教學)
根據 CSS Scroll Snap Module Level 1 規範,CSS 新增了一批能夠控制滾動的屬性,讓滾動能夠在僅僅通過CSS 的控制下,得到許多原本需要JS 腳本介入才能實現的美好交互。
Tips:本文截的一些 Gif 圖涉及容器滾動,效果不是很好,可以點進 Demo 裡實際感受下。
#首先看看 sroll-snap-type
可能算是新的滾動規範裡面最核心的一個屬性樣式。
scroll-snap-type:屬性定義在滾動容器中的一個暫存點(snap point)如何被嚴格的執行。
光看定義有點難理解,簡單而言,這個屬性規定了一個容器是否對內部滾動動作進行捕捉,並且規定瞭如何去處理滾動結束狀態。
{ scroll-snap-type: none | [ x | y | block | inline | both ] [ mandatory | proximity ]? }
舉個例子,假設,我們希望一個橫向可捲動容器,每次滾動之後,子元素最終的停留位置不是尷尬的被分割,而是完整的呈現在容器內,可以這樣寫:
<ul> <li>1</li> <li>2</li> <li>3</li> </ul>
ul { scroll-snap-type: x mandatory; } li { scroll-snap-align: center; }
上面 scroll-snap-type: x mandatory
中, x
表示捕捉x 軸方向上的捲動,mandatory
表示強制將捲動結束後元素的停留位置設定到我們規定的地方。
左邊是正常捲動容器的寫法,右邊是加入了 scroll-snap-
之後:
#
如果是y 軸方向的捲動也是一樣的,只需要簡單改一下scroll-snap-type:
ul { scroll-snap-type: y mandatory; }
#CodePen Demo -- CSS Scroll Snap Demo
scroll-snap-type
中的另外一個重點就是mandatory 與proximity。
mandatory: 通常在CSS 程式碼中我們都會使用這個,mandatory 的英文意思是強制性的,表示滾動結束後,滾動停止點一定會強制停在我們指定的地方
proximity: 英文意思是接近、臨近、大約,在這個屬性中的意思是滾動結束後,滾動停止點可能就是滾動停止的地方,也可能會再進行額外移動,停在我們指定的地方
#也就是說,如上指定了 scroll- snap-type: y proximity
的滾動容器,如果不額外設定 scroll-snap-margin
/scroll-snap-padding
,是有可能停在下面這樣~尷尬~的位置:
当然,还有一种比较特殊的情况是,scroll-snap-type: both mandatory
,表示横向与竖向的滚动,都会同时进行捕捉,也是可以的:
CodePen Demo -- CSS Scroll Snap Both mandatory Demo
使用 scroll-snap-align
可以简单的控制将要聚焦的当前滚动子元素在滚动方向上相对于父容器的对齐方式。
其需要作用在父元素上,可选值有三个:
{ scroll-snap-align: start | center | end; }
什么意思呢,看看示意图:
可以类比单个元素在 flexbox 里面的 justify-content
属性的 flex-start | flex-end | center,规定当前元素在主轴上相对父容器的对齐方式去理解。
再看看实际的 Demo ,将 scroll-snap-align
添加到滚动子容器上:
使当前聚焦的滚动子元素在滚动方向上相对于父容器顶部对齐。
使当前聚焦的滚动子元素在滚动方向上相对于父容器中心对齐。
使当前聚焦的滚动子元素在滚动方向上相对于父容器底部对齐。
CodePen Demo -- CSS Scroll Snap Demo
如果子元素大小不一,也能有非常好的表现,使用 scroll-snap-align: center
,使得不规则子元素在每次滚动后居于容器中间:
CodePen Demo -- CSS Scroll Snap 不规则子元素滚动 Demo
上述的 scroll-snap-align
很好用,可以控制滚动子元素与父容器的对齐方式。然而可选的值只有三个,有的时候我们希望进行一些更精细的控制时,可以使用 scroll-margin
或者 scroll-padding
其中:
举个例子,在竖向滚动下,给滚动父容器添加一个 scroll-padding-top: 30px
等同于给每个子元素添加 ``scroll-margin-top: 30px`:
我们希望滚动子元素在 scroll-snap-align: start
的基础上,与容器顶部的距离为 30px:
<ul class="snap"> <li>1</li> <li>2</li> <li>3</li> ... </ul>
.snap { overflow-x: auto; scroll-snap-type: y mandatory; scroll-padding-top: 30px; } li { scroll-snap-align: start; }
总结一下就是,scroll-snap-align 可以对滚动之后的对齐方式进行简单控制,而配合 scroll-margin
/ scroll-padding
则可以进行精确控制。
标准的发展过程,早年间的规范如今废除,这个了解一下即可,新标准现在是这几个,并且大部分浏览器已经兼容:
scroll-snap-stop 是一个仍处于实验室的标准,本文没有过多介绍,我自己在几个不同浏览器尝试了下,暂时没有发现浏览器支持这个属性,但是最新的标准里面是有关于它的明确的定义的。
在实际应用中,应用在全屏滚动/广告banner上有很多用武之地:
CodePen Demo -- full screen scroll
当然,兼容性现在还是很大的问题:
不过在很多场景下,就算 scroll-snap-
相关几个属性暂不兼容,也不会对正常使用造成影响,所以在很多场景,这些属性都可以直接应用上去,对支持的浏览器提供更好的交互。
更多程式相關知識,請造訪:程式設計入門! !
以上是詳解css sroll-snap-type屬性(優化滾動的小技巧)的詳細內容。更多資訊請關注PHP中文網其他相關文章!