百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

浅谈position中absolute和relative

yuyutoo 2025-04-08 20:28 9 浏览 0 评论

CSS position属性中absolute和relative很容易让人弄混,基本的概念什么着,你去参考W3C,就不啰嗦了

--------------------------------------------------------------------------------------------------------------------------------------------

1. static 默认值。没有定位,元素出现在正常流中(忽略top,bottom,left,right或者z-index声明)

解释:position设置为static或不设定position属性时,元素遵循正常的文档流,对象占用文档空间,该定位方式下,top、right、left、bottom、z-index属性是无效的。

示例

css代码:

#first { width: 200px; height: 100px; border: 1px solid red; position:static;}
#second{ width: 200px; height: 100px; border: 1px solid blue;position:static;}

html代码:

first

second

运行截图:

可以看到position属性设置为static和不设置其实是一样的~

所以,通常此属性值可以不设置,除非要覆盖之前的定义。下面举个栗子~

你有两个页面A、B,同时存在“div#div-1”,但你现在需要A页面的“div#div-1”绝对定位,B页面中的“div#div-1”不需要绝对定位。

A页面:

#div-1{
position:absolute;
}
B页面:

#div-1{
position:static;
}

页面B中position:static;是为了覆盖页面A中position的定义。

2. relative 生成相对定位的元素,相对于其正常位置进行定位。

解释:(1)position设置为relative时,top、right、left、bottom等属性有效,相对其正常位置偏移。

(2)position设置为relative时,元素遵照正常的文档流,占据文档空间,但是占据的文档空间不会随top、right、left、bottom的偏移而发生变动,也就是说,它后面的元素是依据前一个元素正常位置(即未设置top、right、left、bottom属性之前)进行的定位。

(3)position设置为relative时,如果没有进行任何的top、right、left、bottom设置,元素不会进行任何位置的改变。

css代码:

#first { width: 200px; height: 100px; border: 1px solid red; position:relative;top:20px;left:20px;}
#second{ width: 200px; height: 100px; border: 1px solid blue;}

html代码:

first

second

---虚线是初始的位置空间。

由图我们可以看出,相对定位是相对元素原本在文档流中的位置而进行的偏移。并且它后面的元素——second是依据虚线位置,也就是元素原本在文档流中的位置而进行的定位。

top、right、left、bottom等属性不会改变relative定位的元素所占据的文档空间,那么margin、padding会改变该元素占据的文档空间吗?我们来试一下:

css代码中添加margin属性:

#first { width: 200px; height: 100px; border: 1px solid red; position:relative;top:20px;left:20px;margin:20px;}
#second{ width: 200px; height: 100px; border: 1px solid blue;}

设置了margin:20px;后:

由图可以看出,我们将外边距设置为20px,second元素向下偏移40px,所以margin可以改变元素所占文档空间!同理,padding也可改变元素所占文档空间,这里不多做演示。

3. absolute 生成绝对定位的元素,相对于static定位以外的第一个父元素进行定位。

解释:position设置为absolute,元素会脱离文档流,整个元素不再占据文档空间,就只能相对非static定位的第一个父元素进行定位

注1:absolute在无父级是非static定位时以标签作为原点定位,而relative和static方式在最外层时是以标签作为原点定位。标签和标签相差9px左右。

注2:position设置为absolute或fixed时,必须指定left、right、top、bottom属性中的至少一个,否则left、right、top、bottom属性会使用它们的默认值auto,这将导致对象遵从正常的HTML布局规则,在前一个对象之后立即被呈递,简单讲就是都变成relative,会占用文档空间,不会脱离文档流。若多设,比如top和bottom一同存在的话,那么只有top生效;left和right一同存在的话,那么只有left生效。

注3:绝对(absolute)定位对象和相对(relative)定位对象在可视区域之外会导致滚动条出现。而固定(fixed)定位对象放置在可视区域之外,滚动条不会出现。

示例

css代码:

html{border:1px dashed green;}
body{border:1px dashed purple;}
#first{ width: 200px;height: 100px;border: 1px solid red;position: relative;}
#second{ width: 200px;height: 100px;border: 1px solid blue;position: absolute;top :0;left : 0;}

html代码:

relative

absoult

由图我们可以发现absolute相对html定位,relative相对body定位。

下面我们再来看看对absolute定位的元素的除static外第一个父元素设置margin/padding,看看会不会对文档空间有影响。

在absolute定位中添加margin/padding属性:

css代码:

#first{width: 200px;height: 100px;border: 1px solid red;position: relative;margin:40px;padding:40px;}
#second{width: 200px;height:100px;border: 1px solid blue;position: absolute;top:20px;left:20px;}

html代码:

first
second

运行代码复制代码保存代码提示:您可以先修改部分代码再运行

由上图我们可以看出,父元素的margin会让子元素的absolute定位跟着偏移,而padding却不会让子元素发生偏移。总结:absolute是根据父元素的border进行的定位。

4.fixed 生成绝对定位的元素,相对于浏览器窗口进行定位。

解释:fixed定位,又称固定定位,它和absolute定位一样,都脱离了文档流,并且能够根据top、right、left、bottom属性进行定位,但不同的是fixed是根据窗口为原点进行偏移定位的,也就是说它不会根据滚动条的滚动而进行偏移。

示例:

css代码:

#first{width: 200px;height: 100px;border: 1px solid red;position: fixed;}
#second{width: 200px;height:1000px;border: 1px solid blue;}

html代码:

first

second

5.inherit 规定应该从父元素继承position属性的值。

示例

css代码:

#first{width: 200px;height: 100px;border: 1px solid red;position: fixed;}
#second{width: 200px;height:1000px;border: 1px solid blue;position:inherit;left:30px;}

复制代码

html代码:

first
second

复制代码

运行代码复制代码保存代码提示:您可以先修改部分代码再运行!power byW3Cfuns.com

运行,我们发现second继承了first的position属性:fixed。同时超出可视区域之外时不会出现滚动条。

通过以上我们应该对position属性的各个值有了一个了解~

下面我们着重总结一下相对定位和绝对定位~

三、总结

1.相对定位

相对定位的属性

(1)如果设定了top、right、left、bottom等属性,并且父元素没有设定position属性,元素以其父元素的左上角为原点进行定位。

示例:

css代码:

#first{width: 200px;height: 200px;border: 1px solid red;}
#second{width: 100px;height:100px;border: 1px solid blue;position:relative;left:100px;top:100px;}

复制代码

html代码:


child

复制代码

运行代码复制代码保存代码提示:您可以先修改部分代码再运行!power byW3Cfuns.com

(2)如果设定了top、right、left、bottom等属性,并且父元素设定position属性(无论是absolute还是relative),则以父元素的左上角为原点进行定位,位置由top、right、left、bottom决定,但是如果父元素存在padding属性,则以content的左上角为原点进行定位。

示例:

css代码:

#first{width: 200px;height: 200px;border: 1px solid red;position:absolute;padding:10px;}
#second{width: 100px;height:100px;border: 1px solid blue;position:relative;left:100px;top:100px;}

复制代码

html代码:


child

---虚线框为正常原始位置。

---点线框为content内区域

我们可以看出,元素是以content为原点进行定位的~

以上两点总结:相对定位总是以父元素左上角为原点进行定位的,如果父元素不存在或没有position属性或position属性值为static,则以浏览器左上角进行定位。

2.绝对定位

绝对定位的属性:

(1)如果设定了top、right、left、bottom等属性,并且父元素没有设定position属性,元素以浏览器左上角为原点进行定位,位置由top、right、left、bottom决定。

示例:

css代码:

#first{width: 200px;height: 200px;border: 1px solid red;}
#second{width: 100px;height:100px;border: 1px solid blue;position:absolute;left:100px;top:100px;}

html代码:


child

由图可以看出,是相对于浏览器左上角进行定位的~

(2)如果设定了top、right、left、bottom等属性,并且父元素设定position属性(无论是absolute还是relative),则以父元素的左上角为原点进行定位,位置由top、right、left、bottom决定。但是父元素存不存在padding属性,对定位原点没有影响。

示例:

css代码:

#first{width: 200px;height: 200px;border: 1px solid red;position:absolute;padding:10px;}
#second{width: 100px;height:100px;border: 1px solid blue;position:absolute;left:100px;top:100px;}

html代码:


child

---虚线框为正常原始位置。

---点线框为border内区域

我们可以看出,父元素的padding并没有影响到子元素的定位。

由以上两点可以总结出:

若想把一个定位为absolute的元素定位于其父元素内

必须满足两个条件:

1)至少设定top、right、left、bottom中的一个

2)父元素设定position属性(值非static)

文/丁向明

做一个有博客的web前端自媒体人,专注web前端开发,关注用户体验,加我qq/微信交流:6135833

http://dingxiangming.com

相关推荐

VBA中利用Instr函数(vba int函数)

【分享成果,随喜正能量】每一个在你的生命里出现的人,都有原因,喜欢你的人给了你温暖和勇气,你喜欢的人让你学会了爱和自持,你不喜欢的人教会你宽容与尊重,不喜欢你的人让你自省与成长。。...

Insta360 Link体验:支持4K画质,一款使用场景丰富的AI云台摄像头

记者|王公逸伴随直播、线上会议需求的兴起,网络直播的需求愈发增大,8月2日,影石Insta360正式推出全新产品:Insta360Link,这是一款AI智能云台摄像头。从产品形态来说,Insta3...

VBA技术资料MF299:利用Instr进行文本查找

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VB...

Fabric.js 拖放元素进画布 - 掘金

本文简介点赞+关注+收藏=学会了学习Fabric.js,我的建议是看文档不如看demo。本文实现的功能:将元素拖进到画布中并生成对应的图形或图片。效果如下图所示:...

Vue3为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...

Fabric.js 样式不更新怎么办?(js更改样式)

本文简介带尬猴,我嗨德育处主任不知道你有没有遇到过在使用Fabric.js时无意中一些骚操作修改了元素的样式,但刷新画布却没更新元素样式?如果你也遇到同样的问题的话,可以尝试使用本文的方法。...

Fabric.js 修改画布交互方式到底有什么用?

本文简介点赞+关注+收藏=学会了fabric.js为我们提供了很多厉害的方法。今天要搞明白的一个东西是canvas.interactive。官方文档对canvas.interact...

Rust Web编程:第五章 在浏览器上显示内容

我们现在正处于可以构建一个Web应用程序的阶段,该应用程序可以使用不同的方法和数据管理一系列HTTP请求。这很有用,特别是当我们为微服务构建服务器时。然而,我们也希望非程序员能够与我们的应...

Fabric.js 自由绘制椭圆 - 掘金(canvas画椭圆)

本文简介点赞+关注+收藏=学会了本文讲解在Fabric.js中如何自由绘制椭圆形,如果你还不了解Fabric.js,可以查阅《Fabric.js从入门到精通》。效果如下图所示...

手把手教你实现JS手搓"防抖"优化代码——专业的事用专业的方法!

前言在我们前端编程中,假如我们要给后端发送请求,万一手抖多点了几次,多发送了几遍怎么办?解决方案:防抖!这种事就要交给我们专业的“防抖”先生来处理!今天,我们就来教大家手搓“防抖”...

详解虚拟DOM与Diff算法(虚拟dom一定比实际dom快吗)

vue的虚拟DOM,Diff算法,其中一些关键的地方从别处搬运了一些图进行说明(感谢制图的大佬),也包含比较详细的源码解读。...

走进 React Fiber 的世界(我走进你的世界手势舞视频)

文/阿里淘系F(x)Team-冷卉Fiber设计思想Fiber是对React核心算法的重构,facebook团队使用两年多的时间去重构React的核心算法,在React16以上...

前端新一代框架 Svelte 火了!十个场景带你简单认识它!

近几年听到的主流框架都是Vue、React、Angular,但其实有一个框架在国外非常火,用起来也是很方便,那就是...

借助DeepSeek实现了一个PDF阅读器

1、简介使用pdf.js库加载和显示PDF文件。实现了翻页、缩放功能。提供了基本的错误处理。功能特点:支持选择本地PDF文件。可以逐页查看PDF内容。支持放大缩小功能。界面简洁,易于使...

DeepSeek代码之旅1:卫星地图标记方法之——html语言的实现

最近遇到一个任务,具体功能如下:1、调用高德地图API,图层为卫星图层,根据需要标记兴趣点;2、标记完成后可以保存兴趣点,便于下次加载历史兴趣点。...

取消回复欢迎 发表评论: