css简易实现动态下拉框原理

直接步入正题,我们要实现的效果如下:
在这里插入图片描述

分析:
1.鼠标上浮出现下拉框:使用hover伪类实现
2.下拉框不占下一行元素的空间:绝对定位实现
3.下拉框瀑布式弹出:css的transition属性实现
(想要直接copy代码的同学可以直接跳到最后面☆☆☆最终代码标识处)

下面是代码逐步实现
1.首先为了保证下拉框弹出不占据后面元素的空间,我们提前设置两行div,高度自定义.(这里因为是代码逐步演示,所以写的内联CSS,之后整体再把所有代码放出来)

<body>
		<div style="height: 50px;background-color:red ;"></div>
		<div style="height: 50px;background-color:blue ;"></div>
</body>

在这里插入图片描述

2.然后我们在第一行中加上一个元素,这个元素的作用是鼠标上浮,并且在这里元素里再添加一个元素,用于存放内容

<body>
		<div style="height: 50px;background-color:red ;">
			<div style="height: 50px;width: 100px;background-color: aqua;cursor: pointer;">
				<div><h1>内容</h1></div>
			</div>
		</div>
		<div style="height: 50px;background-color:blue ;"></div>
	</body>

(这里的cursor:pointer为鼠标上浮后鼠标的形状变为指针)
在这里插入图片描述

3.接下来是重点:下拉框
第一步:先解决下拉框位置问题,下拉框的位置要正好位于浅蓝色大盒子的下方紧贴着,左边与盒子对齐,宽度与盒子一致这里我们采用绝对与相对定位,鼠标移至浅蓝色盒子下拉框弹出

首先在浅蓝色盒子加入一个子元素ul或者div都行(这个子元素在内容盒子的前或者后都无所谓),有些人会问为什么不是加在浅蓝色大盒子后或者红色大盒子后,因为效果图中鼠标浮上浅蓝色盒子之后出现下拉框,此时需要将鼠标移出浅蓝色盒子才能碰到下拉框,但是的下拉框不是浅蓝色盒子的子元素或者后代元素的话,鼠标一旦移到下拉框,就会被识别到移出浅蓝色盒子,下拉框就会消失,所以我们把下拉框设置为浅蓝色盒子的子元素,这样当鼠标想从浅蓝色盒子移至下拉框时,移到下拉框之后也会被认为鼠标还是在浅蓝色盒子内移动,所以下拉框不会消失,这里的原理是hover冒泡,这里不作展开

其次,在浅蓝色盒子元素上设置position: relative;让下拉框相对于浅蓝色盒子来设置位置,下拉框元素ul或者div上设置position: absolute;然后定位为top:浅蓝色盒子高度px;left:0px;,下拉框高度自定,宽度继承浅蓝色盒子(这里定位很多人也会问为什么不是bottom:0px,做到最后就知道效果了,自己可以体验一下,这里透露一下bottom设为0的话是瀑布往上)

<body>
		<div style="height: 50px;background-color:red ;">
			<div style="height: 50px;width: 100px;background-color: aqua;cursor: pointer;position: relative;">
				<div><h1>内容</h1></div>
				<ul style="width: 100%;height: 200px;background-color: #8A2BE2;position: absolute;top: 50px;left: 0px;">
					
				</ul>
			</div>
			
		</div>
		<div style="height: 50px;background-color:blue ;"></div>
	</body>

在这里插入图片描述
如果按照代码没有出效果,多了很多空隙,是因为浏览器默认给元素加了边距,所以将所有元素的边距设为0即可

<style>
	*{
		margin: 0px;
		padding: 0px;
	}
</style>

最后就是鼠标浮动,下拉框瀑布弹出

在浅蓝色盒子上设置hover,hover后的效果是使下拉框从上往下展示出来,背后的含义就是hover后下拉框的高度从0缓慢的变成200
我们首先在下拉框里加点内容

<style>
	*{
		margin: 0px;
		padding: 0px;
		box-sizing: border-box;
	}
	
	.show-box li{
		float: left;
		width: 100%;
		height: 50px;
	}
	.show-box li:hover{
		background-color: gainsboro;
	}
</style>
<ul class="show-box" style="width: 100%;height: 200px;background-color: #8A2BE2;position: absolute;top: 50px;left: 0px;">
	<li>2222</li>
	<li>11111</li>
	<li>3333</li>
	<li>4444</li>
</ul>

在这里插入图片描述
把下拉框的高度设为0,在浅蓝色盒子被hover时设置为200,注意在高度设置为0时,li标签中的内容是会显示出来的所以我们需要再为下拉框加上一个overflow:hidden的属性,意思是内容超过宽度或者高度就隐藏,最关键的一步是为下拉框加上一个transition: 秒数s;,这个属性的意思就是在元素从一个状态变成另一个状态需要的时间,不加上这个元素的话高度从0变成到200是瞬间的,加上这个属性后,高度的变化是缓慢执行的

☆☆☆最终代码为:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			*{
				margin: 0px;
				padding: 0px;
				box-sizing: border-box;
			}
			.show-box{
				width: 100%;
				height: 0px;
				background-color: #8A2BE2;
				position: absolute;
				top: 50px;
				left: 0px;
				overflow: hidden;
				transition: 0.3s;
				
			}
			
			.show-box li{
				float: left;
				width: 100%;
				height: 50px;
			}
			.show-box li:hover{
				background-color: gainsboro;
			}
			
			.hover-box:hover .show-box{
				height: 200px;
			}
		</style>
	</head>
	<body>
		<div style="height: 50px;background-color:red ;">
			<div class="hover-box" style="height: 50px;width: 100px;background-color: aqua;cursor: pointer;position: relative;">
				<div><h1>内容</h1></div>
				<ul class="show-box">
					<li>2222</li>
					<li>11111</li>
					<li>3333</li>
					<li>4444</li>
				</ul>
			</div>
			
		</div>
		<div style="height: 50px;background-color:blue ;"></div>
	</body>
</html>

最终效果图:
在这里插入图片描述


版权声明:本文为qq_37580940原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。