纯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 相关文章推荐
jQuery Clone Bug解决代码
Dec 22 Javascript
jQuery将多条数据插入模态框的示例代码
Sep 25 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
原创jQuery弹出层插件分享
Apr 02 Javascript
js获取字符串字节数方法小结
Jun 09 Javascript
JavaScript解八皇后问题的方法总结
Jun 12 Javascript
Jquery实时监听input value的实例
Jan 26 Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 Javascript
vue component组件使用方法详解
Jul 14 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
Mar 05 Javascript
Angular使用Restful的增删改
Dec 28 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
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
PHP实现文件上传与下载
2020/08/28 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
VueJS全面解析
2016/11/10 Javascript
js实现无缝滚动图
2017/02/22 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
建筑设计专业求职自我评价
2014/03/02 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
办理信用卡工作证明
2014/09/30 职场文书
个人四风问题整改措施
2014/10/24 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
php双向队列实例讲解
2021/11/17 PHP
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js