原生JS实现百叶窗动画效果及核心原理

作者:窗边听雨

时间:2026-10-30

浏览:637

本文详细解析使用原生JavaScript实现百叶窗动画效果的原理与代码。通过CSS相对定位与overflow隐藏配合子元素绝对定位,利用定时器改变top值实现视觉切换。文章涵盖布局分析、JS逻辑要点及完整示例代码,帮助开发者掌握基础动画实现技巧。

文章目录

百叶窗效果展示

百叶窗是常见的视觉元素,其效果如下图所示:

百叶窗效果展示

百叶窗效果展示百叶窗效果展示百叶窗效果展示

实现原理与布局分析

实现该效果的核心原理如下:

如示意图所示,空心格子对应HTML中的每个li元素,需为其设置相对定位(relative)并添加overflow: hidden属性以隐藏溢出内容。黑色方块为li的子元素,高度设为父级li的两倍,并采用绝对定位(absolute)。动画的关键在于动态改变该子元素的top值,从而控制显示区域。(右上角多余部分与本图无关)

百叶窗效果展示百叶窗效果展示

布局结构分析如下:

需重点关注top值的变化逻辑。当top=0时,显示“一楼上铺”内容;当top=-40px时,li的子元素向上移动40px,此时显示“一楼下铺”内容。需注意p元素被div包裹层的结构关系。

百叶窗效果展示

百叶窗效果展示百叶窗效果展示

JavaScript代码逻辑

JavaScript逻辑分析: 1、需开启多个定时器以达成最终效果 2、执行相反方向的动画 3、执行多组运动逻辑 4、通过累加产生错落感 5、产生时间间隔的动画 JS代码如下:


<script>
  window.onload = function(){
   var oUl = document.getElementById('ul1');
   var oUl2 = document.getElementById('ul2');

   toShow(oUl);
   //每四秒执行一次
   setTimeout(function(){
    toShow(oUl2);     
   },4000); 
   function toShow(obj){
    var aDiv = obj.getElementsByTagName('div');
    var iNow = 0;
    var timer = null;
    var bBtn = true;

    setInterval(function(){   
     toChange(); 
    },2000);
    function toChange(){
     timer = setInterval(function(){
      if(iNow==aDiv.length){
       clearInterval(timer);
       iNow = 0;
       bBtn = !bBtn;
      }
      else if(bBtn){
       startMove(aDiv[iNow],{top:0},function(){
        var p = document.getElementsByClassName('p-2');
        for(var i=0; i<p.length;i++){
         p[i].style.background = 'red';
        }
       });
       iNow++;
      }
      else{
       startMove(aDiv[iNow],{top:-30});
       iNow++;
      }     
     },100);     
    }    
   }   
  };
       //运动框架
  function startMove(obj,json,endFn){ 
   clearInterval(obj.timer);  
   obj.timer = setInterval(function(){   
    var bBtn = true;   
    for(var attr in json){    
     var iCur = 0;   
      iCur = parseInt(getStyle(obj,attr)) || 0;
     var iSpeed = (json[attr] - iCur)/8;
      iSpeed = iSpeed >0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);

     if(iCur!=json[attr]){
      bBtn = false;
     }
     obj.style[attr] = iCur + iSpeed + 'px';    
    }   
    if(bBtn){
     clearInterval(obj.timer);
     if(endFn){
      endFn.call(obj);
     }
    }
   },30); 
  }
        //获取非行间样式
  function getStyle(obj,attr){
   if(obj.currentStyle){
    return obj.currentStyle[attr];
   }
   else{
    return getComputedStyle(obj,false)[attr];
   }
  }
 </script>

下载地址:js实现百叶窗效果 以上就是本文的全部内容,希望对大家学习实现js百叶窗效果有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章