CSS实现fullpage.js全屏滚动效果的示例代码


Posted in HTML / CSS onMarch 24, 2021

最近研究CSS的时候发现了 仅使用两个CSS属性就可以制作出全屏滚动效果 ,这两个属性就是:

  • scroll-snap-type
  • scroll-snap-align

使用它就可以实现 fullpage.js 这种全屏滚动效果,其实,这种全屏滚动效果的理论非常简单,就是使用js监听界面滚动,当界面滚动到某个值时就让界面持续滚动到下一个屏幕,但是!要考虑到屏幕尺寸大小带来的兼容性问题就是一件非常麻烦的事情。

今天说的这两个属性并不能替代 fullpage.js ,有下面2个原因:

  1. 它们在浏览器上面存在兼容性问题。
  2. CSS属性无法监听事件,也就无法提供动画完成时的回调函数。

1. 兼容性

目前主流的浏览器都已经支持了这两个CSS属性,可以放心的使用。如果你需要兼容IE浏览器,那么请选择 fullpage.js 。

2. 使用

使用的方法其实很简单, scroll-snap-type 属性放在 需要全屏滚动的容器的父容器上 ,而 scroll-snap-align 则需要 放在全屏滚动的容器上 ,多说无益,我们直接来看一下代码就可以很清楚的知道如何使用这两个CSS属性。

CSS实现fullpage.js全屏滚动效果的示例代码

整个网页的完整代码很简单,下面直接将它贴上来:

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>CSS scroll snap</title>
    <style>
      body {
        margin: 0;
      }
 
      .container {
        height: 100vh;
        overflow-y: scroll;
        /* 在父容器上面使用 scroll-snap-type 属性 */
        scroll-snap-type: y mandatory;
      }
 
      section {
        padding: 112px;
        height: calc(100vh - 224px);
        color: white;
        /* 在需要滚动的容器上使用 scroll-snap-align 属性 */
        scroll-snap-align: start;
      }
 
      section:nth-of-type(1) {
        background-color: #60af15;
      }
 
      section:nth-of-type(2) {
        background-color: #158baf;
      }
 
      section:nth-of-type(3) {
        background-color: #af1581;
      }
 
      section h3 {
        font-size: 48px;
      }
 
      section p {
        font-size: 20px;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <section>
        <h3>A subtitle lives here</h3>
        <p>
          Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
          deleniti dignissimos ducimus expedita iure maxime qui rerum veniam
          voluptatibus. Accusamus asperiores assumenda atque consectetur
          consequuntur culpa cum deserunt dicta distinctio error excepturi fuga
          ipsa iste magnam modi nobis, obcaecati, pariatur perspiciatis placeat
          quo quod reiciendis repudiandae saepe soluta tempora unde vel? Aliquam
          exercitationem iste maiores placeat reprehenderit voluptates
          voluptatum. Ad at commodi culpa cumque debitis delectus dolorum, eius
          error et explicabo harum in ipsum iste labore laborum libero magni
          maiores nam non nostrum nulla officia pariatur quam quasi quia quo
          recusandae reprehenderit saepe similique vel vero vitae voluptas
          voluptatem! Quibusdam.
        </p>
      </section>
      <section>
        <h3>A subtitle lives here</h3>
        <p>
          Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
          deleniti dignissimos ducimus expedita iure maxime qui rerum veniam
          voluptatibus. Accusamus asperiores assumenda atque consectetur
          consequuntur culpa cum deserunt dicta distinctio error excepturi fuga
          ipsa iste magnam modi nobis, obcaecati, pariatur perspiciatis placeat
          quo quod reiciendis repudiandae saepe soluta tempora unde vel? Aliquam
          exercitationem iste maiores placeat reprehenderit voluptates
          voluptatum. Ad at commodi culpa cumque debitis delectus dolorum, eius
          error et explicabo harum in ipsum iste labore laborum libero magni
          maiores nam non nostrum nulla officia pariatur quam quasi quia quo
          recusandae reprehenderit saepe similique vel vero vitae voluptas
          voluptatem! Quibusdam.
        </p>
      </section>
      <section>
        <h3>A subtitle lives here</h3>
        <p>
          Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
          deleniti dignissimos ducimus expedita iure maxime qui rerum veniam
          voluptatibus. Accusamus asperiores assumenda atque consectetur
          consequuntur culpa cum deserunt dicta distinctio error excepturi fuga
          ipsa iste magnam modi nobis, obcaecati, pariatur perspiciatis placeat
          quo quod reiciendis repudiandae saepe soluta tempora unde vel? Aliquam
          exercitationem iste maiores placeat reprehenderit voluptates
          voluptatum. Ad at commodi culpa cumque debitis delectus dolorum, eius
          error et explicabo harum in ipsum iste labore laborum libero magni
          maiores nam non nostrum nulla officia pariatur quam quasi quia quo
          recusandae reprehenderit saepe similique vel vero vitae voluptas
          voluptatem! Quibusdam.
        </p>
      </section>
    </div>
  </body>
</html>

可以看到代码并不复杂,下面我们就着重讲解一下这两个CSS属性。

3. scroll-snap-type

该CSS属性拥有下面这些值:

none:当这个滚动容器的可视的 viewport 是滚动的,不做任何处理。

  • x :滚动容器只捕捉其水平轴上的捕捉位置。
  • y :滚动容器只捕捉其垂直轴上的捕捉位置。
  • block:滚动容器仅捕捉到其块轴上的捕捉位置。
  • inline:滚动容器仅捕捉到其内联轴上的捕捉位置。
  • both:滚动容器会独立捕捉到其两个轴上的位置(可能会捕捉到每个轴上的不同元素)。
  • mandatory :如果滚动容器被滚动,那么它超过临界值后会自动滚动到下个容器上。
  • proximity :如果滚动容器被滚动,那么它超过临界值后不会自动滚动到下个容器上。

其中需要注意的就是上面粗体标注的几个属性,使用 mandatory 就是全屏滚动, 则当滚动过一定阈值后,会自动滚动到下一屏幕,如果没有滚动过某一阈值,则回弹。

而 proximity 不一样的是: 滚动过一定阈值后,就可以正常进行滚动(而 mandatory 是直接进入下一屏),如果没有滚动过某一阈值,则回弹。

理解这两个属性其实非常简单,将上面的代码改改自己体验下就明白了。

注:使用 mandatory ,如果 滚动容器的高度已经大于屏幕的高度时 需要慎用,因为可能会导致有一部分内容因为强制滚屏的原因导致阅读起来非常困难。

4. scroll-snap-align

该CSS属性拥有下面这些值:

none:该容器不会进行定义在父容器上面对应轴的捕捉。 start:该容器被捕捉的位置是该容器开始的部分。 end:该容器被捕捉的位置是该容器结束的部分。 center:该容器被捕捉的位置是该容器中间的部分。

用一张图可以很形象的明白这些属性所代表的容器位置:

CSS实现fullpage.js全屏滚动效果的示例代码

5. 最后

因为我看到 scroll-snap 的 其它属性大部分都存在很严重的兼容性问题 ,所以就不在这里细讲了,如果有兴趣的话可以到 CSS Scroll Snap 直接查看,不过使用上面的这两个属性其实已经完全够用了。

参考文章:

  1. scroll-snap-align MDN
  2. scroll-snap-type MDN
  3. Practical CSS Scroll Snapping
HTML / CSS 相关文章推荐
详解css3 object-fit属性
Jul 27 HTML / CSS
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
Jan 06 HTML / CSS
css3设置box-pack和box-align让div里面的元素垂直居中
Sep 01 HTML / CSS
css3的动画特效之动画序列(animation)
Dec 22 HTML / CSS
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
Jan 23 HTML / CSS
HTML5中Canvas与SVG的画图原理比较
Jan 16 HTML / CSS
2014年圣诞节倒计时网页的制作过程
Dec 05 HTML / CSS
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
Feb 28 HTML / CSS
HTML5 Canvas绘制五星红旗
May 04 HTML / CSS
HTML5视频播放插件 video.js介绍
Sep 29 HTML / CSS
POST提交数据常见的四种方式
Jan 18 HTML / CSS
table不让td文字溢出操作方法
Dec 24 HTML / CSS
css animation配合SVG制作能量流动效果
如何通过 CSS 写出火焰效果
Html5移动端div固定到底部实现底部导航条的几种方式
Mar 09 #HTML / CSS
HTML5拖拽文件上传的示例代码
Mar 04 #HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
Feb 24 #HTML / CSS
Canvas在超级玛丽游戏中的应用详解
Feb 06 #HTML / CSS
Html5移动端网页端适配(js+rem)
Feb 03 #HTML / CSS
You might like
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
对python 自定义协议的方法详解
2019/02/13 Python
Django框架视图函数设计示例
2019/07/29 Python
Series和DataFrame使用简单入门
2019/11/13 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
汽车销售顾问求职自荐信
2014/01/01 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
超市开店计划书
2014/04/26 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
上诉答辩状范文
2015/05/22 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
《围炉夜话》110句人生箴言,精辟有内涵,引人深思
2019/10/23 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电