CSS relative? absolute? 傻傻分不清楚

CSS 比较常用的有3种定位方式:

positionfloatflex

以新手来说,一开始学习定位的方式,以position居多。

其中最容易令人搞混的是position的relative与absolute属性。

本章节要来探讨这两种属性的差异,以及产生的结果。

HTML

<body>  <div class="box-before">    box-before  </div>  <div class="box-1">    box-1    <div class="box-2">      box-2    </div>    <div class="box-3">      box-3    </div>  </div>  <div class="box-after">    box-after  </div></body>

CSS

body {  background-color: khaki;  font-family: Helvetica;}.box-before {  width: 300px;  height: 50px;  color: white;  font-size: 20px;  background-color: #2e5ec0;}.box-1 {  width: 300px;  padding: 10px;  color: white;  font-size: 20px;  background-color: #fd3c40;  box-sizing: border-box;}.box-2 {  height: 50px;  color: white;  font-size: 20px;  background-color: #8c4fb6;}.box-3 {  height: 50px;  color: white;  font-size: 20px;  background-color: #00b842;}.box-after {  width: 300px;  height: 50px;  color: white;  font-size: 20px;  background-color: #faaa20;}

初始页面
http://img2.58codes.com/2024/20112573rw89yWaBV0.png

第一层有3个div,依序为box-before、box-1、box-after。

box-1内有box-2、box-3。

未使用position的话,预设会套用position:static。

relative

设定box-1

position: relative;

跟刚刚的一模一样,因为我们还未定top 、 right 、 bottom 和 left 属性。

设定

top: 30px;left: 20px;

box-1往下移动30px、往右移动20px。
http://img2.58codes.com/2024/201125735XPo9YXXuE.png

虚线代表box-1原本的位置(position:static)。
http://img2.58codes.com/2024/20112573TjRxU9dAtS.png

所以

position: relative;top: 30px;left: 20px;

box-1相对于原本的位置(position:static),往下移动30px、往右移动20px。

仍佔据原本的位置(position:static)。

其他元素(box-before、box-after)的定位不受影响。

元素会重叠。

将所有的CSS回复到初始状态。

这次,我们设定box-2

position: relative;top: 30px;left: 20px;

box-2往下移动30px、往右移动20px。
结果一样。
http://img2.58codes.com/2024/20112573K0eB8Mm4iF.png

absolute

设定box-2

position: absolute;top: 30px;left: 20px;

页面显示
http://img2.58codes.com/2024/20112573eBzHVU6F3S.png

完全走钟...

就几个问题来一一探讨。

1. box-3往上移动

只要position设定absolute,该元素就会完全跳脱该页面,这概念类似Photoshop的图层,跳脱的元素位于该页面上一层图层。换个说法,它浮在页面之上。

既然如此,box-2原本所占用的空间将不复存在,所以box-3便会往上移动。

2. box-2宽度改变

我们一开始没有设box-2的宽度,所以宽度会完全撑开至box-1的边界,这是block元素的特性。

当box-2跳脱该页面后,也意味着,它脱离了父元素box-1的範围,宽度就以内容为基準。

3. 定位的相对元素在哪?

大魔王 本文重点

这是很多新手搞不清楚的地方。

当元素的position设定absolute后,它就会往外层的元素找是否有position:relative | absolute | fixed | inherit(若继承的是前面3个之一)的元素,若是都没有,就会以该网页页面(<body>)的左上角为定位点。

box-2的外层元素都没有设定position:relative | absolute | fixed | inherit,自然会以页面的左上角为定位点,往下移动30px、往右移动20px。

position: absolute;top: 0;left: 0;

box-2完全贴齐页面的左上角。
http://img2.58codes.com/2024/20112573IMduRMigTT.png

把top跟left通通删掉,只留position: absolute。
http://img2.58codes.com/2024/201125734bN58GpDZE.png

若没有设定任何偏移属性的话,box-2的位置将遵照原本的位置(position:static),但依旧会跳脱原本页面。

若设定任一边属性值,将以此为主。

position: absolute;top: 0;

贴齐上边界。
http://img2.58codes.com/2024/201125738CP59x3UEh.png

position: absolute;left: 0;

贴齐左边界。
http://img2.58codes.com/2024/20112573S6G5PXNWYk.png

设box-1为定位元素。
box-1

position: relative;

box-2

position: absolute;right: 0;bottom: 0;

box-2就会以box-1为定位元素,贴齐右下角。
不会受到box-1的padding属性影响。
http://img2.58codes.com/2024/20112573zNbgkaathC.png

可设定负数。

position: absolute;right: -20px;bottom: -20px;

就会超出box-1的範围。
http://img2.58codes.com/2024/20112573GKDRM7tqQe.png


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章