CSS hover效果:如何仅使容器移动而固定其父容器?
修复父容器随子元素移动的问题
问题根源
你用margin-top移动#container时,触发了CSS的外边距折叠——子元素的负外边距会带着父容器一起偏移,再加上父容器没做溢出控制,导致整个背景块跟着动。
两种修复方案
方案1:用transform替代margin(推荐)
transform不会触发布局重排,也不会产生外边距折叠问题,效率更高。同时给父容器加overflow: hidden,让子元素在父容器内部移动:
/* 给父容器添加样式 */ .parent-box { background-color: rgb(162, 0, 255); height: 400px; overflow: hidden; /* 隐藏超出父容器的内容 */ } #container { font-size: 20px; font-family: Arial; margin-top: 10px; transition: transform 55s linear; /* 过渡效果绑定transform */ } #container:hover { transform: translateY(-3500px); /* 用translateY实现垂直移动 */ }
对应HTML调整(把行内样式换成类):
<div class="parent-box"> <div id="container"> <a href="#">link1</a> some text...<br><br> <a href="#">link2</a> some more text 2....<br><br> <a href="#">link3</a> some text 3....<br><br> <a href="#">link4</a> some text 3....<br><br> <a href="#">link5</a> some text 3....<br><br> <a href="#">link6</a> some text 3....<br><br> <a href="#">link7</a> some text 3....<br><br> <a href="#">link8</a> some text 3....<br><br> </div> </div>
方案2:用定位固定父容器
给父容器设position: relative,子容器设position: absolute,让子元素脱离标准流,移动时不会影响父容器:
.parent-box { background-color: rgb(162, 0, 255); height: 400px; position: relative; /* 父容器相对定位 */ overflow: hidden; /* 隐藏超出部分 */ } #container { font-size: 20px; font-family: Arial; position: absolute; /* 子容器绝对定位 */ top: 10px; /* 替代原来的margin-top */ transition: top 55s linear; } #container:hover { top: -3500px; /* 修改top值实现移动 */ }
HTML同样使用上面的类结构即可。
额外注意
你原来的CSS里写了两次transition,只会生效最后一个,记得删掉重复声明。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

