【前端】手写手风琴·教程

效果图:

  • 未展开时的效果
    在这里插入图片描述
  • 鼠标悬浮在其上的效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

需求分析:

  1. 在每个 li 里面设置一个图片
  2. 鼠标移出 ul ,每个 li 的宽度变成240
  3. 鼠标移入某个 li ,当前 li 的宽度变成800,其他 li 的宽度变成100

源代码:

  • HTML部分
<!-- 
	1.创建一个div盒子容器
    2.div盒子里面创建ul,设置id名box
    3.ul里面li用来放置图片使用
-->
<div>
	<ul id="box">
		<li></li>
		<li></li>
	    <li></li>
	    <li></li>
	    <li></li>
	</ul>
</div>
  • CSS部分
<style>
	/*  */
    *{/* 重置内外默认边距 */
        margin:0; 
        padding:0;
    }
    ul{/* 重置ul行内样式 */
        list-style: none
    }
    div{
        width: 1200px;
        height: 400px;
        margin:50px auto;	/* 上下 50px 外边距,左右自适应居中 */
        border:1px solid red;
        overflow: hidden;	/* 超出部分隐藏 */
    }
    div li {
        width: 240px;
        height: 400px;
        float: left;            
    }
    div ul {/* ul的宽度要放宽,防止掉落li */
        width: 2000px;
    }
</style>
  • JavaScript部分
  1. 封装两个函数,这部分可以先不看
<script>
// 返回指定dom节点的attr样式值
function getStyle(dom,attr){
	if(window.getComputedStyle){// 是否有getComputedStyle方法
		//非IE低版
		return window.getComputedStyle(dom,null)[attr];
	}else{
		//IE低版
		return dom.currentStyle[attr];
	}
}
// 封装一个缓动的动画函数,需要时调用即可
function animate(dom,json,callback){
	/* 
        dom:要运动的节点
        json:要运动的样式名
        callback:运动完成的回调函数
    */
    clearInterval(dom.timer);//要用定时器,先清定时器
    //要运动的定时器
    dom.timer = setInterval(function(){
		var flag = true;
		//json有几个属性,就要运动几次
		for(var attr in json){
			//获取当前位置
			var current = parseInt(getStyle(dom,attr));
			// 计算速度
			var speed = json[attr] - current > 0 ? Math.ceil((json[attr]-current)/10):Math.floor((json[attr]-current)/10);
			//计算下一个位置
			var next = current + speed;
			//定位元素
			dom.style[attr] = next+'px';
			//判断是否达到目标
			if(next != json[attr]){
				flag = false;
			}
		}
		if(flag){
			clearInterval(dom.timer);
		}
	},20)// 每20毫秒
}
</script>
  1. 主要部分
<script>
	//获取 id 为 box 的 ul 标签
	var ul = document.getElementById('box');
	//获取 ul 下 li 的子元素集合
	var liArr = ul.children;
	//遍历获取到的 li 集合
	for(var i = 0; i < liArr.length; i++){
		//在每一个 li 里面放置一张图片
		liArr[i].innerHTML = "<img src=./images/"+(i+1)+".jpg>";
		//鼠标移入某个 li,当前 li 的宽度变成 800px,其他 li 的宽度变成 100px
		liArr[i].onmouseenter = function(){//设置鼠标移入事件
			// 干掉所有人,留下我一个
			for(var j = 0; j < liArr.length; j++){
				// 没动画效果的简单写法:
				liArr[j].style.width = '100px';
				/* 
				有动画效果的复杂写法:
				animate(liArr[j],{width:100})
				*/
			}
			// 没动画效果的简单写法:
			this.style.width = '800px';
			/* 
				有动画效果的复杂写法:
				animate(this,{width:800})
			*/
	}
	// 鼠标移出 ul,每个 li 的宽度变成 240px
	ul.onmouseleave = function(){
		for(var j = 0; j < liArr.length; j++){
			// 没动画效果的简单写法:
			liArr[j].style.width = '240px';
			/* 
				有动画效果的复杂写法:
				animate(liArr[j],{width:240})
			*/
		}
	}
	}
</script>
  • 总代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
 <style>
	/*  */
    *{/* 重置内外默认边距 */
        margin:0; 
        padding:0;
    }
    ul{/* 重置ul行内样式 */
        list-style: none
    }
    div{
        width: 1200px;
        height: 400px;
        margin:50px auto;	/* 上下 50px 外边距,左右自适应居中 */
        border:1px solid red;
        overflow: hidden;	/* 超出部分隐藏 */
    }
    div li {
        width: 240px;
        height: 400px;
        float: left;            
    }
    div ul {/* ul的宽度要放宽,防止掉落li */
        width: 2000px;
    }
</style>
</head>
<body>
	<!-- 
	1.创建一个div盒子容器
    2.div盒子里面创建ul,设置id名box
    3.ul里面li用来放置图片使用
	-->
	<div>
		<ul id="box">
		   <li></li>
		   <li></li>
		   <li></li>
	 	   <li></li>
	 	   <li></li>
		</ul>
	</div>
<script>
	//获取 id 为 box 的 ul 标签
	var ul = document.getElementById('box');
	//获取 ul 下 li 的子元素集合
	var liArr = ul.children;
	//遍历获取到的 li 集合
	for(var i = 0; i < liArr.length; i++){
		//在每一个 li 里面放置一张图片
		liArr[i].innerHTML = "<img src=./images/"+(i+1)+".jpg>";
		//鼠标移入某个 li,当前 li 的宽度变成 800px,其他 li 的宽度变成 100px
		liArr[i].onmouseenter = function(){//设置鼠标移入事件
			// 干掉所有人,留下我一个
			for(var j = 0; j < liArr.length; j++){
				// 没动画效果的简单写法:
				liArr[j].style.width = '100px';
				/* 
				有动画效果的复杂写法:
				animate(liArr[j],{width:100})
				*/
			}
			// 没动画效果的简单写法:
			this.style.width = '800px';
			/* 
				有动画效果的复杂写法:
				animate(this,{width:800})
			*/
	}
	// 鼠标移出 ul,每个 li 的宽度变成 240px
	ul.onmouseleave = function(){
		for(var j = 0; j < liArr.length; j++){
			// 没动画效果的简单写法:
			liArr[j].style.width = '240px';
			/* 
				有动画效果的复杂写法:
				animate(liArr[j],{width:240})
			*/
		}
	}
	}
// 返回指定dom节点的attr样式值
function getStyle(dom,attr){
	if(window.getComputedStyle){// 是否有getComputedStyle方法
		//非IE低版
		return window.getComputedStyle(dom,null)[attr];
	}else{
		//IE低版
		return dom.currentStyle[attr];
	}
}
// 封装一个缓动的动画函数,需要时调用即可
function animate(dom,json,callback){
	/* 
        dom:要运动的节点
        json:要运动的样式名
        callback:运动完成的回调函数
    */
    clearInterval(dom.timer);//要用定时器,先清定时器
    //要运动的定时器
    dom.timer = setInterval(function(){
		var flag = true;
		//json有几个属性,就要运动几次
		for(var attr in json){
			//获取当前位置
			var current = parseInt(getStyle(dom,attr));
			// 计算速度
			var speed = json[attr] - current > 0 ? Math.ceil((json[attr]-current)/10):Math.floor((json[attr]-current)/10);
			//计算下一个位置
			var next = current + speed;
			//定位元素
			dom.style[attr] = next+'px';
			//判断是否达到目标
			if(next != json[attr]){
				flag = false;
			}
		}
		if(flag){
			clearInterval(dom.timer);
		}
	},20)// 每20毫秒
}
</script>
</body>
</html>

所用图片:

在这里插入图片描述

由于你们没有图片,直接复制代码,展示不出效果,大家可以自己找几张图片来代替,稍微修改下即可,只要能看得懂代码,修改起来莫得问题啦

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值