纯js实现手风琴效果代码


Posted in Javascript onApril 17, 2020

我知道现在大多数前端开发人员都在使用jQuery等第三方的库来进行开发,这不仅节约了时间,也让效率大大的提高,并让公司的效益增加,何乐而不为呢?

但是,这也会有一定的缺点,比如jQ比js慢,尤其在大型项目中就会显现出来,下面我用原生js实现一个简单的手风琴效果效果。

 HTML代码如下 

结构非常简单就5个li盒子,js代码会渲染图片上去

<!DOCTYPE html>
<html>
<head lang="en">
 <meta charset="UTF-8">
 <title></title>
</head>
<body>
<div id="box">
 <ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
 </ul>
</div>
</body>
</html>

CSS代码如下:

宽高请自行设置,我之前做的这个项目图片是1226*446的图片,所以宽度和高度是按照当时做项目的时候设置的,如果你想放置其他尺寸的图片请按照实际情况设施...

ul {
 list-style: none
}

* {
 margin: 0;
 padding: 0;
}

div {
 width: 1150px;
 height: 400px;
 margin: 50px auto;
 border: 1px solid red;
 overflow: hidden;
}

div li {
 width: 240px;
 height: 400px;
 float: left;
 /*background-image: url(images/1.jpg);*/
}

div ul {
 width: 1300px;

}

下面是重头戏啦,请欣赏原生js(相信很多人都快忘了原生js吧)

//找人
var box = document.getElementById("box");
var ul = box.children[0];
var lis = ul.children;

//循环遍历 lis 绑定背景图

for (var i = 0; i < lis.length; i++) {
 lis[i].style.backgroundImage = "url(images/" + (i + 1) + ".jpg)";

 //给每一个li注册鼠标经过事件 鼠标经过后要排他

 lis[i].onmouseover = function () {

  //干掉所有人 让所有人的宽度 渐渐地 变为100

  for (var j = 0; j < lis.length; j++) {
   animate(lis[j], {"width": 100});
  }

  //留下我自己 让我的宽度 渐渐地 变为800

  animate(this, {"width": 800});
 };
}

//鼠标离开box 所有的li宽度 渐渐地 变为240

box.onmouseout = function () {
 for (var i = 0; i < lis.length; i++) {
  animate(lis[i], {"width": 240});
 }
};

//jQuery中有animate动画函数,下面是实现的原理,虽然没有jQ的强大,但是基本的效果实现还是没有问题的

function animate(obj, json) {
 clearInterval(obj.timer);
 obj.timer = setInterval(function () {

  //先假设 这一次执行完 所有的属性都到达目标了

  var flag = true;
  for (var k in json) {
   var leader = parseInt(getStyle(obj, k)) || 0;
   var target = json[k];
   var step = (target - leader) / 10;
   step = step > 0 ? Math.ceil(step) : Math.floor(step);
   leader = leader + step;
   obj.style[k] = leader + "px";
   //if (leader === target) {
   // clearInterval(obj.timer);
   //}
   console.log("代码还在运行");
   if (leader != target) {

    flag = false;//告诉标记 当前这个属性还没到达

   }
  }

  //如果此时仍然为true 就说明真的都到达了

  if (flag) {
   clearInterval(obj.timer);
  }
 }, 15);
}

//全部属性都到达目标值才能清空

function getStyle(obj, attr) {
 if (window.getComputedStyle) {
  return window.getComputedStyle(obj, null)[attr];
 } else {
  return obj.currentStyle[attr];
 }
}

上面就是所有的代码,你可以找五张图片试一试。

实际开发中效率还是最重要的,因为现在浏览器的性能已经非常好了,所以jQ的有些缺点完全可以忽略不计啦,并且jQ的兼容性真的是不错的,能节省开发人员很多的时间和精力,我也很支持在工作项目中用jQ来开发,可是作为一个真正的前端技术人员,你要时刻了解底层代码的实现,这样随着科技的发展,你也不会落于人后。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
整理8个很棒的 jQuery 倒计时插件和教程
Dec 12 Javascript
JSON+JavaScript处理JSON的简单例子
Mar 20 Javascript
js取得html iframe中的元素和变量值
Jun 30 Javascript
jQuery ajax调用WCF服务实例
Jul 16 Javascript
JavaScript中window.showModalDialog()用法详解
Dec 18 Javascript
jQuery的框架介绍
May 11 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
Jul 05 Javascript
Javacript中自定义的map.js  的方法
Nov 26 Javascript
使用canvas实现一个vue弹幕组件功能
Nov 30 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
Aug 07 Javascript
解决vuex刷新数据消失问题
Nov 12 Javascript
JavaScript 继承详解(六)
Oct 11 #Javascript
JavaScript 继承详解(五)
Oct 11 #Javascript
Javascript动画效果(4)
Oct 11 #Javascript
JavaScript中const、var和let区别浅析
Oct 11 #Javascript
对javascript继承的理解
Oct 11 #Javascript
Javascript动画效果(3)
Oct 11 #Javascript
JavaScript实现自动切换图片代码
Oct 11 #Javascript
You might like
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP中的string类型使用说明
2010/07/27 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
JS代码放在head和body中的区别分析
2011/12/01 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
js读取本地文件的实例
2017/12/22 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
深入解析Python中的线程同步方法
2016/06/14 Python
详解Python装饰器由浅入深
2016/12/09 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
商场活动策划方案
2014/01/24 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
新闻传播专业求职信
2014/07/22 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
死亡诗社观后感
2015/06/05 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript
Win11快速关闭所有广告推荐
2022/04/19 数码科技