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 相关文章推荐
jquery api参考 visualjquery 中国线路 速度快
Nov 30 Javascript
拖动table标题实现改变td的大小(css+js代码)
Apr 16 Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 Javascript
node.js中的fs.closeSync方法使用说明
Dec 17 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 Javascript
Bootstrap每天必学之标签页(Tab)插件
Aug 09 Javascript
Bootstrap Validator 表单验证
Jul 25 Javascript
Bootstrap模态窗口源码解析
Feb 08 Javascript
Three.js如何实现雾化效果示例代码
Sep 27 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
Nov 13 jQuery
JS中自定义事件的使用与触发操作实例分析
Nov 01 Javascript
基于javascript的无缝滚动动画实现2
Aug 07 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引用返回与取消引用的详解
2013/06/08 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
YII2框架使用控制台命令的方法分析
2020/03/18 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
责任心演讲稿
2014/05/14 职场文书
敬老月活动总结
2014/08/28 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
教师求职自荐信
2015/03/26 职场文书
换届选举主持词
2015/07/03 职场文书
教师培训简讯
2015/07/20 职场文书
2015年国庆节寄语
2015/08/17 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python