本例实现这样一个效果,当鼠标移动到div元素上时,显示子div,并且鼠标移到子div上子div仍然保持显示。当鼠标移出父子div时子div才又重新隐藏起来。子div显示的时候,重叠在后面其他div上,不能挤压后面其他div。网上找了很多例子没法完全达到这个效果,自己经过各种试验折腾了一天才搞出来,记录下来备忘。
本例使用CSS样式来控制,先贴代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<style>
.Content{
padding:10px 10px;10px;10px;
position:relative; /**父元素设置为relative,不设置overflow属性,否则隐藏的子div显示出来会不正常。*/
z-index:1;
}
/*注:Content-Left定义多个div从左到右排列在一行,使用了float:left;*/
.Content-Left{
margin-left: 0px;
margin-right: 5px;
margin-top: 0px;
margin-bottom: 0px;
border:none;
float: left;
color:#000;
position: relative; /**父元素设置为relative,不设置overflow属性,否则隐藏的子div显示出来会不正常。*/
z-index: 1;
}
.hide{
/** display设置为none表示默认隐藏,这里要使用绝对定位position:absolute,可以重叠在其他div上面,显示的时候不会挤压后面的其他div。
并且,父div不能设置overflow属性,否则隐藏的div显示就无法超出父元素的当前显示的内容范围。 */
display:none;
position:absolute;
left:0px;
top:15px;
padding:10px 10px 10px 0px;
width:100px;
z-index:1;
}
.Content-Left:hover .hide{
display:block; /** 当父div类 LinkContent-Left鼠标移上去的时候,将隐藏的子div类hide显示出来 */
}
</style>
<body>
<!--第一行div
鼠标移到第一行div父元素的时候,子元素显示出来会重叠在第二行div上面。
因为子元素和第二行div重叠,第一行div的z-index必须比第二行div的大,
否则鼠标移出第一行div父元素的时候,还没有移入子div时,会被认为已移出第一行div,
导致第一行div的子div又隐藏起来。
这里把第一行div的z-index设置为100,第二行为99。
z-index只会同级别的div有效,因此即使把第一行div的子div的z-index调高是无效的。
-->
<div class="Content" style="z-index:100">
<div class="Content-Left" >第一行div父元素A
<div class="hide" align="left" style="width:400px">
第一行div父元素A子div
</div>
</div>
<div class="Content-Left" >|</div>
<div class="Content-Left" >第一行div父元素B
<div class="hide" align="left" style="width:400px">
第一行div父元素B子div
</div>
</div>
</div><!--第一行div结束-->
<!--第二行div-->
<div class="Content" style="z-index:99">
<div class="Content-Left">第二行div</div>
</div><!--第二行div结束-->
</body>
</html>
代码实现说明:
两行div并列,样式为Content。
第一行div有多个div从左到右排列,样式为Content-Left。
第一行div内的元素有个子div,默认隐藏,样式为hide。当鼠标移到Content-Left元素上时,显示子元素。
实现要点:
1. 通过CSS的hover控制修改子div的display属性来实现显示隐藏的子div。
.Content-Left:hover .hide{
display:block; /** 当父div类 LinkContent-Left鼠标移上去的时候,将隐藏的子div类hide显示出来 */
}
2.隐藏的子div要使用绝对定位,父div使用相对定位,并且父div不能设置overflow属性,否则子div无法不挤压其他div直接重叠显示在后面的第二行div上。
hide类设置position:absolute为绝对定位。
父div类Content和Content-Left设置position: relative为相对定位,且没有overflow属性。
3.第一行div的z-index必须比它的子div会重叠显示的其他div的z-index大,否则鼠标移到被重叠div上的时候,子div又会被隐藏起来。z-index只对同级的div有效,因此设置被隐藏的子div的z-index是无效的。
本例中第一行div的z-index为100,第二行设置为99。