参照fullPage.js的效果,用自己的想法实现的。

实现的效果:1、全屏滚动,滚动一下齿轮就会滚动全屏。

2、自适应缩放,无论怎么改变窗口的大小,都会保证用一个元素占满全屏。

下一步计划:

1、改成react组件

2、实现更多的效果

注释写的很清楚,基本上知道函数怎么用就可以了。有想法这东西就很简单。

这里偷懒使用了我之前写过的一个运动框架(其实就是一个函数),稍加修改就可以在这上面使用。框架相关:点击这里

注释非常详细了,就不说其他的了。直接上代码:

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>index</title>
 </head>
 <style>
     *{
         margin: 0;
         padding: 0;
     }
     div{
         width: 100%;
         height: 100%;
     }
     .one{
         background-color: #1bbc9b;
     }
     .sec{
         background-color: #4bbfc3;
     }
     .thr{
         background-color: #7baabe;
     }
 </style>
 <body>
     <div class="full one">1</div>
     <div class="full sec">2</div>
     <div class="full thr">3</div>
 </body>
 <script>
 //添加滚动监听
 document.addEventListener('mousewheel',wheel,false);

 //判断一次滚动是是否完成
 var isComplete = true;
 //隐藏滚动条
 document.body.style.overflow='hidden';

 //获取滚动的元素
 var fullList = document.getElementsByClassName("full");

 //因为是类数组对象,不是数组对象,所以只能使用call的方式来调用
 Array.prototype.forEach.call(fullList,function(value){
     //获取一个网页满屏的高
     value.style.height = window.innerHeight +'px';
 })

 //如果窗口大小改变执行的函数
 window.onresize = function(){
     Array.prototype.forEach.call(fullList,function(value){
         value.style.height = window.innerHeight +'px';
     });

     //改变窗口大小后,应该仍是一个元素占满全屏
     if(document.body.scrollTop % window.innerHeight)
     {
         isComplete = false;
         //根据四舍五入判断滚动位置
         let tmp = Math.round(document.body.scrollTop / window.innerHeight)* window.innerHeight;

         //使用运动框架
         showAnimate(document.body,{'scrollTop':tmp},function(){
                 isComplete = true;
         });
     }
 };

 //滚动函数
 function wheel(e){
     //等待上一个滚动完成
     if(isComplete){

         //滚动进行时
         isComplete = false;

         //判断是往上滚动还是往下滚动
         if(e.wheelDelta < 0){
             //要滚动到的点
             let arrivePoint = document.body.scrollTop + window.innerHeight;

             //最大的滚动点
             let maxBottom = document.body.offsetHeight - window.innerHeight;

             //如果超出了最大的滚动点,则赋值为最大滚动点
             arrivePoint = arrivePoint > maxBottom ? maxBottom : arrivePoint;

             showAnimate(document.body,{'scrollTop':arrivePoint},function(){
                 isComplete = true;
             });
         }else{
             let arrivePoint = document.body.scrollTop - window.innerHeight;

             //最小滚动点为0
             arrivePoint = arrivePoint < 0 ? 0 :arrivePoint;
             showAnimate(document.body,{'scrollTop':arrivePoint},function(){
                 isComplete = true;
             });
         }
     }
 }
 /**
 *函数作用:执行动画
 *接受参数:obj(需要运动的DOM元素)
 *        json(需要改变的属性集合,json格式)
 *        fn(回调函数)
 */
 function showAnimate(obj,json,fn){
     clearInterval(obj.timer);
     //表示运动是否都已经停止
     var flag = true;
     obj.timer=setInterval(function(){
         //循环json
         for(var i in json){
              if(i == 'opacity'){
                  //获取透明度值,round四舍五入去除小数点
                  var icur = Math.round(parseFloat(getStyle(obj,i))*100);
              }
              else{
                  //获取属性值
                  var icur = parseInt(getStyle(obj,i))||obj[i];
              }
              //缓冲运动,speed随时变换
             var speed = (json[i]-icur)/10;//千万要写在定时器里面,写在外面会有意想不到的后果
             speed = speed > 0 ? Math.ceil(speed):Math.floor(speed);//速度向上或者下取整,防止到不了over位置
             //如果有一个没到达终点就是false
             if(json[i] !== icur){
                 flag = false;
             }else{
                 flag = true;
             }
             if(i == 'opacity'){
                 obj.style.filter = 'alpha(opacity:'+(icur+speed)+')';//IE兼容
                 obj.style.opacity = (icur+speed)/100;
             }else if(obj[i]||obj[i] == 0){
                 obj[i] = icur + speed;
             }
             else{
                 obj.style[i] = icur+speed+'px';
             }
             console.log(icur + ' ' + json[i]);
         }
         //检查是否所有的运动都已经停止
         if(flag){
             clearInterval(obj.timer);
             if(fn){
                 fn();
             }
         }
     },13);
 }
 /**
 *函数作用:返回样式属性值
 *接受参数:obj(需要获取属性的DOM元素)
 *           attr(需要获取的属性名称)
 */
 function getStyle(obj,attr)
 {
     if(obj.currentStyle)
     {
         return obj.currentStyle[attr];//IE兼容
     }
     else
     {
         return getComputedStyle(obj,false)[attr];
     }
 }
 </script>
 </html>

自己用js实现全屏滚动的更多相关文章

  1. fullpage.js jq全屏滚动插件

    fullPage.js和fullPage都能实现全屏滚动,二者区别是:fullPage.js需依赖于JQuery库,而fullPage不需要依赖任何一个js库,可以单独使用. (代码演示效果并且可以下 ...

  2. fullpage.js全屏滚动插件使用小结

    刚做好公司网站,通过全屏滚动,显著提高了官网的浏览体验.遂总结一下使用fullpage.js的方法.欢迎指正 一. fullpage.js简介 fullpage.js是一套实现浏览器全屏滚动的js插件 ...

  3. 全屏滚动效果H5FullscreenPage.js

    前提: 介于现在很多活动都使用了 类似全屏滚动效果 尤其在微信里面 我自己开发了一个快速构建 此类项目的控件 与市面上大部分控件不同的是此控件还支持元素的动画效果 并提供多种元素效果 基于zepto. ...

  4. FullPage.js – 轻松实现全屏滚动(单页网站)效果

    FullPage.js 是一个简单而易于使用的插件,用来创建全屏滚动网站(也被称为单页网站).除了可以创建全屏滚动效果以外,也可以给网站添加一些水平的滑块效果.能够自适应不同的屏幕尺寸,包括平板电脑和 ...

  5. jquery.fullPage.js全屏滚动插件教程演示

    css部分(此处需要导入jquery.fullPage.css) <style> .section { text-align: center; font: 50px "Micro ...

  6. jQuery+fullPage.js演示10种全屏滚动

    基本演示 背景演示 循环演示 回调函数演示 绑定菜单演示 项目导航演示 自动滚动 slide自动滚动 响应式 下载地址 实例代码 <!DOCTYPE html> <html lang ...

  7. jQuery fullPage.js 全屏滚动

    fullPage 是一款不依赖任何 js 库的全屏滚动组件,支持垂直/水平滚动.CSS3 旋转/缩放动画,支持 IE5.5+,支持移动设备. 在线实例 垂直滚动 水平滚动 CSS3 动画1 CSS3 ...

  8. pagePiling.js - 创建漂亮的全屏滚动效果

    全屏滚动效果是最近非常流行的网页设计形式,带给用户良好的视觉和交互体验.pagePiling.js 这款 jQuery 插件可以帮助前端开发人员轻松实现这种效果.支持所有的主流浏览器,包括IE8+,支 ...

  9. 《fullPage.js》创建全屏滚动的网站

    插件介绍 fullPage.js是一个简单易用的插件,创建全屏滚动的网站(也被称为单页网站).它允许全屏滚动创建网站,以及添加内部滑块. 浏览器兼容性 主要功能 支持鼠标滚动 支持前进后退和键盘控制 ...

随机推荐

  1. jquery获取kindEditor值

    KE.show({            id: 'txtMessage',            imageUploadJson: '/ajax/Manager/keupload.ashx?ptyp ...

  2. 十六、mysql 分区之 简单sql优化1

    .使用 show session status like '%Com_%'; 可以查看当前连接的各个sql的执行频率 show global status like '%Com_%'; 可以查看从上次 ...

  3. Live555 Streaming from a live source

    https://www.mail-archive.com/live-devel@lists.live555.com/msg05506.html-----ask--------------------- ...

  4. git stash 保存修改现场

    用途:当你正在分支上做一个项目的时候,突然必须停下来去做别的事情,但因为没有此项目还没改好,所以不想commit 就可以保留现场,等忙完后再回复现场继续修改. bug处理保存开发现场$ git sta ...

  5. [Javascript] Array methods in depth - filter

    Array filter creates a new array with all elements that pass the test implemented by the provided fu ...

  6. DOCKER功能练习

    都是书上的示例,慢慢进入..

  7. 为什么不能在子类或外部发布C#事件

    为什么不能在子类或外部发布C#事件 背景 一个朋友问了一个问题:“为什么不能在子类或外部发布C#事件?”,我说我不知道,要看看生产的IL代码,下面我们看看. 测试 代码 1 using System; ...

  8. [NOI 2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  9. Confluence 6 数据库结构图

    结构图细节 下面的 SVG 图片(可缩放矢量图)包括了 Confluence 数据库中使用的所有表.单击下面的连接在你的浏览器中打开图片连接,你也可以随后将图片下载到本地.你可以使用浏览器的缩放快捷键 ...

  10. CSS----布局不理解

    正常情况 正常显示 如果往div标签中添加汉字 出现显示(不理解) 解决方式 加上vertical-align:top