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+dom树型菜单类,希望朋友们一起进步
May 03 Javascript
jquery 利用show和hidden实现级联菜单示例代码
Aug 09 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
Jan 02 Javascript
JavaScript设计模式经典之工厂模式
Feb 24 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
JS中常用的正则表达式
Sep 29 Javascript
使用mint-ui开发项目的一些心得(分享)
Sep 07 Javascript
javaScript之split与join的区别(详解)
Nov 08 Javascript
浅谈webpack devtool里的7种SourceMap模式
Jan 14 Javascript
JavaScript从原型到原型链深入理解
Jun 03 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
Mar 23 Javascript
JavaScript常用工具函数库汇总
Sep 17 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中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
写出高质量的PHP程序
2012/02/04 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
python 中xpath爬虫实例详解
2019/08/26 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫