理解CSS的position:relative

最近工作中做了几件事情都与页面元素定位相关,所以这里将工作中遇到的问题以及解决方法记录在博客里,以便日后查阅。

叠压



有一个任务是做一个列表组件,列表中的每一行都要向上叠压上一行的底边,注意,是叠压,不是接壤。


问题分析:

利用相对定位(position:relative)来制造相对于行(row)的偏移量,使行内元素向上偏移,并叠压上一行的行内元素的底边。

既然是相对定位,那就不能让每一行的定位基准点基于上一行的底边。因为,基准点不会因为上一行元素被CSS搞过之后而同时发生偏移。

举例说明:2个div上下排列,第一个div(class="div1")height为100px,并且向上偏移-10px。第二个div(class="div2")height也是100px,希望叠压到div1的底边10px,所以也设置了top: -10px。如果div1的基准点Y轴坐标=0px,那么,在div1没有发生偏移的情况下,div2的基准点Y轴坐标= div1.top + div1.height,也就是0px + 100px = 100px。现在,div1.top = -10px,即向上偏移10px,按理说,div2的基准点= -10px + 100px = 90px。可惜,现实并非如此。div2的基准点并没有任何改变。所以,div2.top = -10px 依旧无法叠压到div1的底边。只有当div2.top=-20px才可能叠压到div1底边10px处。有人说此处应该让div1的高度增加10px,这样,div2就能叠压到div1了。我做了尝试,发现当div1的高度增加10px后,div2的原始基准点Y轴坐标也跟着+10px。如此,重新套用公式:div2的定位基准点Y轴坐标 = div1的定位基准点Y轴坐标 + div1高度,重新得到div2的定位基准点Y轴坐标为110px。110px-10px的向上偏移量=100px,而div1虽然高度增加到了110px,可是它向上偏移了-10px,div2还是叠压不到div1的底边。


解决思路:

就像问题分析中开头说的那样,解决方法很简单,就是不要让后续元素的定位基准点基于前一个会改变位置的元素。如下图:

这时原先的元素排列结构。这种结构中,每个要向上偏移的元素定位基准点就是上一个也需要变动位置的元素的左下角。这样是不能实现我们的需求的。只要在元素结构上稍加改变,就可以了,见下图,改变后的元素结构:

在原来每个元素内部再添加一个box元素。将偏移设置在这个box元素上。因为每个浅蓝色的box元素都是基于其上层box元素(黑色边框的div)的,而非前面一个需要变动位置的box元素,所以每个浅蓝色的box元素进行偏移时、增加高度时,都不会改变下一个浅蓝色box的定位基准点。而且,每个浅蓝色box元素的高度增加,也不会导致其上层box元素(黑色边框的div)高度改变,因为浅蓝色box元素改变了其top属性后,它就被认为是个浮动元素。一个浮动元素不会撑大包含它的上层box元素。所以第二个黑框div,以及第三个黑框div的定位基准点都不会发生改变。如此一来,我们便可以实现浅蓝色box元素相互叠压的效果了。

实现代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			body {
				margin: 20px;
			}
			.nav-menu-bar {
				height: 500px;
				width: 350px;
				overflow-x: auto;
			}
			.menu-item-slot {
				height: 50px;
				width: 100%;
			}
			.nav-menu-bar .menu-item {
				background-color: rgba(128,176,224, 1.0); /*rgba()#6699cc;*/
				border-radius: 8px 8px 0px 0px;
				box-shadow: 0px -5px 5px -2px #375e8c;
				position: relative;
				top: -8px;
				height: 58px;  /* ------ Be careful ------ */
				width: 100%;
				overflow: hidden;
			}
			.menu-item .content {
				margin-top: 8px;
				margin-left: 8px;
				width: 94%;
				height: 72%;
				vertical-align: top;
				overflow-x: hidden;
				color: #fafafa;
			}
			.nav-menu-bar .menu-item-slot:hover {
				transition: height 0.3s;
				height: 200px;
			}
			.nav-menu-bar .menu-item-slot:first-child:hover {
				transition: height 0.3s;
				height: 208px;
			}
			.nav-menu-bar .menu-item-slot:first-child .menu-item:hover {
				transition: height 0.3s;
				height: 208px;
			}
			.nav-menu-bar .menu-item:hover {
				transition: height 0.3s;
				height: 208px;
			}
			.nav-menu-bar .menu-item-slot:first-child {
				height: 58px;
			}
			.nav-menu-bar .menu-item-slot:first-child .menu-item {
				box-shadow: none;
				top: 0px;
			}
			.nav-menu-bar .menu-item-slot:last-child .menu-item {
				border-radius: 8px 8px 8px 8px;
			}
		</style>
	</head>
	<body>
		<div class="nav-menu-bar">
			<div class="menu-item-slot">
				<div class="menu-item">
					<div class="content">Created in 1998, its name is derived from the World Wide Web,</div>
				</div>
			</div>
			<div class="menu-item-slot">
				<div class="menu-item">
					<div class="content">Created in 1998, its name is derived from the World Wide Web,</div>
				</div>
			</div>
			<div class="menu-item-slot">
				<div class="menu-item">
					<div class="content">Created in 1998, its name is derived from the World Wide Web,</div>
				</div>
			</div>
			<div class="menu-item-slot">
				<div class="menu-item"></div>
			</div>
		</div>
	</body>
</html>
时间: 2024-10-24 06:23:46

理解CSS的position:relative的相关文章

深入理解css中position属性及z-index属性

深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共有四种不同的定位方法,分别是static.fixed.relative.absolute.最后将会介绍和position属性密切相关的z-index属性. 第一部分:position: static static定位是HTML元素的默认值,即没有定位,元素出现在正常的流中,因此,这种定位就不会收到t

【拼爹坑爹不比爹】深入理解css中position属性及z-index属性

总结:拼爹坑爹不比爹 1,定位移动:距左上角left+top;(移动后对于移动前:如果值为负数,则直接换成整数:如果值为整数,则直接改变相对方向.)2,单一父元素不设值,子z-index才奏效:"不比爹"3,多个父元素,"拼爹坑爹"(子凭父贵,子贵父不贵)(爹设值,因外有body)4,多个父元素多子元素,各父各子高低相互比,就是不比爹:>< [转]深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要

CSS中&quot;position:relative&quot;属性与文档流的关系

前言 近期遇到一个问题--"position:relative"到底会不会导致元素脱离文档流?主流观点是不会,但都给不出一个有说服力的论据.最后我自己佐证了一番,总算有了个结果:"position:relative"不会导致元素脱离文档流. 博文地址:CSS中"position:relative"属性与文档流的确切关系 "relative"与文档流 说到标准,最权威的自然莫过于CSS标准文档.经过一番繁琐的查找之后(w3c网站

css中position:relative的真正理解

其实话说一直以来也没真正去理解好position:relative的用法的真实意义. 我想很多人实实在在用的多都是position:relative和position:absolute结合起来一起用的. position属性是用四种定位.默认的是static. position:absolute(绝对定位) --是脱离文档流,相对于父级元素(包含这个position:relative)定位,当然如果没有,那就是相对于body定位的. position:relative(相对定位) --单独使用,

css中position:relative和overflow:hidden的问题

<div style="height:100px; width:100px; background:#CCC; overflow:hidden;"> <div style="height:300px; width:90px; background:#999; position:relative;"></div> </div> ↓ 解决方案:将父标签的position也设置成relative,代码如下: <div 

理解CSS中position的各个值

static position的默认值,没有定位,元素在normal flow中: fixed 相对于浏览器左上角定位: relative 相对定位元素,其位置根据其在normal flow中的位置来计算: absolute 产生脱离正常流的元素,相对于第一个父级position值不为static的元素来定位,没有则相对于body

CSS 中 Position relative 和 absolute区别

Relative Positioning A relative positioned element is positioned relative to its normal position. The reserved space for the element is still preserved in the normal flow. relative 位置是相对元素的父元素的位置.left, top 是相对其父元素进行调整, 但是位置还是和DOM中的看起来一致(in normal flo

css里面position:relative与position:absolute的区别

position:absolute这个是绝对定位:是相对于浏览器的定位.比如:position:absolute:left:20px;top:80px; 这个容器始终位于距离浏览器左20px,距离浏览器上80px的这个位置. position:relative是相对定位,是相对于前面的容器定位的.这个时候不能用top left在定位.应该用margin. 比如:<div class="1"></div><div class="2">

深入理解 CSS 的 :before 和 :after 选择器(制作select美化插件)

原文链接:http://www.cnblogs.com/LY-leo/p/5765598.html 对于 :before 和 :after 选择器,大家并不陌生,但是很少有人会主动去用它们.先解释下它们的定义和用法: :before 选择器在被选元素的内容前面插入内容,:after 选择器在被选元素的内容后面插入内容,都会使用 content 属性来指定要插入的内容. 有时候,项目中或多或少需要一些箭头,如果用图片来做,感觉就有点 low 了,而上面这两个选择器是最好的选择.效果如下: html