首頁 > web前端 > js教程 > 主體

Javascript 實作全螢幕滾動實例程式碼

高洛峰
發布: 2017-01-11 09:29:40
原創
1131 人瀏覽過

JS 全螢幕滾動

參照fullPage.js的效果,用自己的想法實現的。

實現的效果:1、全螢幕滾動,滾動一下齒輪就會滾動全螢幕。

2、自適應縮放,無論怎麼改變視窗的大小,都會確保用一個元素佔滿全螢幕。

下一步計畫:

1、改成react元件

2、實現更多的效果

註解寫的很清楚,基本上知道函數怎麼用就可以了。有想法這東西就很簡單。

這裡偷懶使用了我之前寫過的一個運動框架(其實就是一個函數),稍加修改就可以在這上面使用。框架相關:點這裡

註解非常詳細了,就不說其他的了。直接上碼:

<!DOCTYPE html>
<html>
<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(&#39;mousewheel&#39;,wheel,false);
 
//判断一次滚动是是否完成
var isComplete = true;
//隐藏滚动条
document.body.style.overflow=&#39;hidden&#39;;
 
//获取滚动的元素
var fullList = document.getElementsByClassName("full");
 
//因为是类数组对象,不是数组对象,所以只能使用call的方式来调用
Array.prototype.forEach.call(fullList,function(value){
  //获取一个网页满屏的高
  value.style.height = window.innerHeight +&#39;px&#39;;
})
 
//如果窗口大小改变执行的函数
window.onresize = function(){
  Array.prototype.forEach.call(fullList,function(value){
    value.style.height = window.innerHeight +&#39;px&#39;;
  });
 
  //改变窗口大小后,应该仍是一个元素占满全屏
  if(document.body.scrollTop % window.innerHeight)
  {
    isComplete = false;
    //根据四舍五入判断滚动位置
    let tmp = Math.round(document.body.scrollTop / window.innerHeight)* window.innerHeight;
     
    //使用运动框架
    showAnimate(document.body,{&#39;scrollTop&#39;: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,{&#39;scrollTop&#39;:arrivePoint},function(){
        isComplete = true;
      });
    }else{
      let arrivePoint = document.body.scrollTop - window.innerHeight;
       
      //最小滚动点为0
      arrivePoint = arrivePoint < 0 ? 0 :arrivePoint; 
      showAnimate(document.body,{&#39;scrollTop&#39;: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 == &#39;opacity&#39;){
         //获取透明度值,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 == &#39;opacity&#39;){
        obj.style.filter = &#39;alpha(opacity:&#39;+(icur+speed)+&#39;)&#39;;//IE兼容
        obj.style.opacity = (icur+speed)/100;
      }else if(obj[i]||obj[i] == 0){
        obj[i] = icur + speed;
      }
      else{
        obj.style[i] = icur+speed+&#39;px&#39;;
      }
      console.log(icur + &#39; &#39; + 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 實作全螢幕滾動實例程式碼相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板