原生js实现百叶窗效果及原理介绍


Posted in Javascript onApril 12, 2016

百叶窗大家都见过吧!如图:

原生js实现百叶窗效果及原理介绍

原生js实现百叶窗效果及原理介绍原生js实现百叶窗效果及原理介绍原生js实现百叶窗效果及原理介绍

原理:

如图所示,空心格子就好比是每个li,给它设定相对定位属性,设置overflow:hidden;黑块为li子元素,高度为li的2倍,设置absolute属性,我们正是要改变它的top值从而获得变化!(右上角多余块与本图无关)

原生js实现百叶窗效果及原理介绍原生js实现百叶窗效果及原理介绍

布局分析:

注意top值得变化!默认top=0时候,显示的“一楼上铺”,当top=-40px时候,li的子元素 上移40px,这时候显示的内容就为“一楼下铺”注意p元素的包裹层div

原生js实现百叶窗效果及原理介绍

原生js实现百叶窗效果及原理介绍原生js实现百叶窗效果及原理介绍

JS分析:
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百叶窗效果有所帮助。

Javascript 相关文章推荐
javaScript - 如何引入js代码
Mar 09 Javascript
js树形控件脚本代码
Jul 24 Javascript
返回页面顶部top按钮通过锚点实现(自写)
Aug 30 Javascript
js闭包的用途详解
Nov 09 Javascript
javascript如何实现暂停功能
Nov 06 Javascript
什么是JavaScript中的结果值?
Oct 08 Javascript
JS实现倒计时(天数、时、分、秒)
Nov 16 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
Dec 01 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
JavaScript模块详解
Dec 18 Javascript
Vue中使用vue-i18插件实现多语言切换功能
Apr 25 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
Sep 06 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 #Javascript
jquery中实现时间戳与日期相互转换
Apr 12 #Javascript
Angular.js与Bootstrap相结合实现表格分页代码
Apr 12 #Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 #Javascript
zTree插件下拉树使用入门教程
Apr 11 #Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
Apr 11 #Javascript
js创建jsonArray传输至后台及后台全面解析
Apr 11 #Javascript
You might like
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
Python爬虫爬验证码实现功能详解
2016/04/14 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python实现机器学习之多元线性回归
2018/09/06 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
个人找工作自荐信格式
2013/09/21 职场文书
文员个人求职自荐信
2013/09/21 职场文书
资深生产主管自我评价
2013/09/22 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
行政专员的岗位职责
2014/03/10 职场文书
工作求职信
2014/07/04 职场文书
个人作风建设心得体会
2014/10/22 职场文书
营销与策划实训报告
2014/11/05 职场文书
高中生毕业评语
2014/12/30 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS