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 相关文章推荐
对YUI扩展的Gird组件 Part-2
Mar 10 Javascript
用JS剩余字数计算的代码
Jul 03 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
javascript通过class来获取元素实现代码
Feb 20 Javascript
js实现从数组里随机获取元素
Jan 12 Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 Javascript
自己动手写的jquery分页控件(非常简单实用)
Oct 28 Javascript
vue 指定组件缓存实例详解
Apr 01 Javascript
微信小程序实现自定义modal弹窗封装的方法
Jun 15 Javascript
vue路由切换之淡入淡出的简单实现
Oct 31 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
Nov 12 Javascript
angular *Ngif else用法详解
Dec 15 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
Jquery cookie操作代码
2010/03/14 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
用Python实现KNN分类算法
2017/12/22 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
校长就职演讲稿
2014/01/06 职场文书
教师听课评语大全
2014/12/31 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
开学第一周值周总结
2015/07/16 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
Python采集股票数据并制作可视化柱状图
2022/04/04 Python