Javascript 实现全屏滚动实例代码


Posted in Javascript onDecember 31, 2016

JS 全屏滚动

参照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>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
用JavaScript显示随机图像或引用
Apr 21 Javascript
JQuery 小练习(实例代码)
Aug 07 Javascript
js弹出模式对话框,并接收回传值的方法
Mar 12 Javascript
jQuery实现的进度条效果
Jul 15 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
JS中的数组方法笔记整理
Jul 26 Javascript
js禁止Backspace键使浏览器后退的实现方法
Sep 01 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
Electron中实现大文件上传和断点续传功能
Oct 28 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
js+css实现扇形导航效果
Aug 18 Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 #Javascript
javascript 闭包详解及简单实例应用
Dec 31 #Javascript
深入理解Angularjs中的$resource服务
Dec 31 #Javascript
BootStrap Fileinput的使用教程
Dec 30 #Javascript
BootStrap Fileinput初始化时的一些参数
Dec 30 #Javascript
bootstrapValidator表单验证插件学习
Dec 30 #Javascript
JS实现类似百叶窗下拉菜单效果
Dec 30 #Javascript
You might like
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
JS常用算法实现代码
2016/11/14 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
详解js类型判断
2018/05/22 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python实现简单的文字识别
2018/11/27 Python
python 二维数组90度旋转的方法
2019/01/28 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
python中class的定义及使用教程
2019/09/18 Python
python实现随机加减法生成器
2020/02/24 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
英语国培研修感言
2014/02/13 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
捐款通知怎么写
2015/04/24 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android