JavaScript与jQuery实现图片手风琴效果的完整教程

作者:小括号

时间:2026-10-21

浏览:465

本文详细演示了如何使用原生JavaScript和jQuery两种技术实现图片手风琴效果。通过封装自定义运动框架或利用jQuery内置动画方法,结合CSS布局与DOM操作,实现鼠标悬停时图片宽度的平滑切换。文章提供了完整的HTML结构、CSS样式及JS代码示例,并对比了两种实现方式的代码量与逻辑差异,适合前端初学者参考学习。

文章目录

JavaScript与jQuery实现图片手风琴效果的完整教程

近期重新复习了jQuery的相关知识。既然jQuery本质上是JavaScript的一个库,那么JavaScript原生能力同样可以完成jQuery所实现的功能。基于此,本文分别使用这两种方法实现了图片手风琴交互效果。

遵循惯例,直接展示代码实现。由于代码中已包含详细注释,这些注释实际上也充当了解释说明的作用。

首先查看JavaScript版本的实现代码:

HTML结构与CSS样式

HTML部分采用div布局。需要注意的是,其中的图片元素并非直接写在HTML中,而是通过JavaScript代码动态生成的。


<div id="box">
 <ul>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 </ul>
</div>

接下来定义CSS样式:


<style type="text/css">
 *{
 margin: 0;
 padding: 0;
 }
 ul{
 list-style: none;
 }
 #box{
 width: 1150px;
 height: 400px;
 margin: 50px auto;
 border: 1px solid red;
 overflow: hidden;
 }
 #box ul{
 width: 1300px;
 }
 #box ul li{
 width: 240px;
 height: 400px;
 float: left;

 }
 </style>

JavaScript原生实现方案

随后编写JavaScript逻辑。此处封装了一个完整的运动框架(个人见解,读者可自行完善,若有改进方案也欢迎交流分享)。


/*
 * 实现动画的步骤:
 1.怎样得到当前的样式 封装一个函数 getStyle()
 2.步长的计算 用(目标位置 - 当前的样式) / 10
 3. 缓动动画原理: 盒子本身的样式 + 步长(不断变化的)
 */
/*
 * css设置透明度,一般在ie中用的是filter:alpha(opacity=0);
而在firefox中,一般就是直接使用opacity:0
*/
// 多个属性的运动框架 以及添加回调函数
function animate(obj,json,fn){ // 目标obj json 属性:属性值 fn回调函数
 clearInterval(obj.timer);
 obj.timer = setInterval(function(){
 var flag = true;// 用来判断是否停止定时器 
 // 遍历json
 for (var attr in json) { //attr 属性 json[attr]值
 var curStyle = 0;
 if (attr == "opacity") {
 curStyle = parseInt(getStyle(obj,attr)*100);
 } else{
 curStyle = parseInt(getStyle(obj,attr));// 获得数值
 }
 // 得到步长 目标位置就是json[attr]
 var step = (json[attr]-curStyle) / 10;
 step = step > 0 ? Math.ceil(step) :Math.floor(step);

 // 判断透明度
 if (attr == "opacity") { // 判断用户有没有输入opacity
 if ("opacity" in obj.style) { 
  obj.style.opacity = (curStyle + step) / 100;
 } else{
  obj.style.filter = "alpha(opacity="+(curStyle +step)+")";
 }

 } else if(attr == "zIndex"){
 obj.style.zIndex = json[attr];
 } else{
 obj.style[attr] = curStyle +step +"px";
 }
 // 判断是否已经都到了目标位置 只要其中一个不满足条件 就不应该停止定时器
 if (curStyle != json[attr]) {
 flag = false;
 }
 }
 // 判断定时器条件 是否该停止了
 if (flag) {
 clearInterval(obj.timer)
 // 当定时器停止后,动画也就结束了.如果有回调函数就执行回调函数
 if(fn){
 fn();
 }

 }
 },30);
}

// 封装函数 得到属性
function getStyle(obj,attr) { // 谁的 那个属性
 if(obj.currentStyle) // ie 等
 {
 return obj.currentStyle[attr]; // 返回传递过来的某个属性
 }
 else
 {
 return window.getComputedStyle(obj,null)[attr]; // w3c 浏览器
 }
}

在JavaScript文件中引入之前编写的运动框架脚本。


<script src="animate.js"></script>

接着编写核心的JavaScript交互代码。


<script>
 window.onload = function(){
 var box = document.getElementById("box");
 var lis = box.children[0].children;
 for (var i = 0; i < lis.length;i++) {
  lis[i].style.backgroundImage = "url(images/"+(i+1)+".jpg)";
  lis[i].onmouseover = function(){
  for (var j = 0; j < lis.length;j++) {
  animate(lis[j],{width:100});
  }
  animate(this,{width:800});
  }
  lis[i].onmouseout = function(){
  for (var k = 0; k < lis.length;k++) {
  animate(lis[k],{width:240});
  }
  }
 }
 }
</script>

至此,功能实现完毕,具体效果建议读者自行运行查看。JavaScript版本的完整代码下载地址为:js版本的手风琴效果。

jQuery简化实现方案

完成JavaScript版本后,发现代码量较大。接着查看jQuery版本的代码,需要注意的是,务必先引入jQuery库文件,然后再编写业务逻辑。


<script src="jquery-1.11.1.min.js"></script>
 <script>
 $(function(){
 $("#box li").each(function(index,ele){
  $(ele).css("background","url(images/"+(index+1)+".jpg)");
 }).mouseenter(function(){
  $(this).stop().animate({width:800},500).siblings("li").stop().animate({width:100},500);
 }).mouseleave(function(){
  $("#box li").stop().animate({width:240},500);
 });
 });

 </script>

代码量大幅精简。jQuery版本手风琴效果的完整下载地址为:jQuery版本手风琴效果。

以上就是本文的全部内容,希望对各位的学习有所帮助,也欢迎大家多多支持本站。

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章