CSS实现吸附临近点效果探索:scroll-snap-type
七娃博客720人阅读
早上逛掘金社区,发一下一篇《纯 CSS 也能实现拖拽效果?》这样的文章,然后脑回路想到的是html5的拖拽,CSS?不会是标题党吧,再看署名:阅文前端团队,不得了了,然后不得不认真起来了!
我这篇不是讲拖拽的,在大佬的文章里面发现了一个新的知识点:Scroll Snap ——CSS吸附功能。
在线体验-Scroll Snap吸附效果:https://course.51qux.com/scrollsnap
Scroll Snap吸附效果实现必备条件:
0.滚动容器内部使用!!!
1.父级scroll-snap-type 吸附轴设置,默认不启用(none),可用参数如下:
scroll-snap-type:none | x | y | mandatory | proximity;
scroll-snap-type: none; /* 忽略临时点,不启用吸附 */
scroll-snap-type: x; /* 只捕捉其水平轴上的捕捉位置 */
scroll-snap-type: y; /* 只捕捉其垂直轴上的捕捉位置 */
scroll-snap-type: x mandatory; /*滚动结束吸附水平轴上的临近点*/
scroll-snap-type: y proximity;/*滚动结束,是临近点就吸附,不是就不吸附*/
...
1.父级scroll-snap-type 吸附轴设置,默认不启用(none),可用参数如下:
scroll-snap-type:none | x | y | mandatory | proximity;
scroll-snap-type: none; /* 忽略临时点,不启用吸附 */
scroll-snap-type: x; /* 只捕捉其水平轴上的捕捉位置 */
scroll-snap-type: y; /* 只捕捉其垂直轴上的捕捉位置 */
scroll-snap-type: x mandatory; /*滚动结束吸附水平轴上的临近点*/
scroll-snap-type: y proximity;/*滚动结束,是临近点就吸附,不是就不吸附*/
...
更多参数前往MDN,地址见文章底部,ios端兼容需要在父盒子加入:
-webkit-overflow-scrolling:touch;
2.子元素scroll-snap-align 规定吸附位置,必须作用在子元素上,设置子元素 临近点位置
scroll-snap-align: start | center | end;
scroll-snap-align:start /*子元素起始位置 作为 临近点*/
scroll-snap-align:end /*子元素结束位置 作为 临近点*/
scroll-snap-align:center /*子元素居中对齐-父盒子水平垂直居中位置*/
更多详细推荐阅读 张鑫旭大佬的《大侠,请留步,要不过来了解下CSS Scroll Snap?》
3.scroll-snap-stop ,根据实际效果,这个属性可以理解为 增加了阻尼系数,不添加的时候,使劲滚动一次,可以滚动好多个(3+),加上scroll-snap-stop:always,再使劲最多多滚动1~3个。
scroll-snap-stop:normal|always;
scroll-snap-stop:normal;/*默认值。可以忽略捕获位置*/
scroll-snap-stop:always;/*不能忽略捕获位置,不允许一次滚动多屏*/
案例实战
水平轴案例:
<style type="text/css">
.scroll-box{
width: 100%;height: 250px;white-space: nowrap;overflow-x: scroll;
scroll-snap-type: x mandatory;
-webkit-overflow-scrolling:touch;
}
.scroll-box .item{width: 300px;height: 200px;display: inline-block;margin-right: 15px;text-align: center;background: #333;font: 16px/200px "微软雅黑";color: #fff;
scroll-snap-align: start;
scroll-snap-stop:always;
}
.scroll-box .item:nth-child(even){background: #666;}
</style>
<div class="scroll-box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
<style type="text/css"> .scroll-box{ width: 100%;height: 250px;white-space: nowrap;overflow-x: scroll; scroll-snap-type: x mandatory; -webkit-overflow-scrolling:touch; } .scroll-box .item{width: 300px;height: 200px;display: inline-block;margin-right: 15px;text-align: center;background: #333;font: 16px/200px "微软雅黑";color: #fff; scroll-snap-align: start; scroll-snap-stop:always; } .scroll-box .item:nth-child(even){background: #666;} </style> <div class="scroll-box"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div>
应用场景:横向滚动商品、图片等位置
垂直案例:
<style type="text/css">
.scroll-box-y{
width: 100%;height: 250px;overflow-y: scroll;
scroll-snap-type: y mandatory;
-webkit-overflow-scrolling:touch;
}
.scroll-box-y .item{width: 100%;height: 250px;display: inline-block;text-align: center;background: #333;font: 16px/250px "微软雅黑";color: #fff;
scroll-snap-align: start;
scroll-snap-stop:always;
}
.scroll-box-y .item:nth-child(even){background: #666;}
</style>
<div class="scroll-box-y">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
应用场景:全屏banner滚动
Scroll Snap兼容
兼容性的话,很一般,毕竟是一个css新属性,目前的话才60%的浏览器支持,还是要慎用!如下:
本文参考
1.MDN:《scroll-snap》
2.张鑫旭:《大侠,请留步,要不过来了解下CSS Scroll Snap?》
3.阅文前端团队:《纯 CSS 也能实现拖拽效果?》
评论 | 0 条评论
登录之后才可留言,前往登录