博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解 CSS 绝对定位
阅读量:6271 次
发布时间:2019-06-22

本文共 3327 字,大约阅读时间需要 11 分钟。

基本定义和用法

CSS 中,position 属性指定一个元素(静态的,相对的,绝对或固定,以及粘性定位)的定位方法的类型。

当设置 position 属性的值为 absolute 时,生成绝对定位的元素,将该元素从文档流中删除,原来的占位不再存在,并相对于 static 定位以外的第一个父元素进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。

  • 如果这个父元素是块级元素,包含块则设置为该元素的 border-box
  • 如果这个父元素是行内元素,包含块则设置为该父元素元素的内容边界。
  • 如果元素没有已定位的父元素,那么它的位置相对于 <html>
.box {    position: relative;    margin: 0 auto;    padding: 10px;    width: 300px;    height: 200px;    background: rgb(66, 98, 104);}.box-item {    position: absolute;    top: 50px;    left: 50px;    width: 100px;    height: 100px;    background: rgb(65, 116, 126);}
我是块级元素。
您可以打开开发者工具对我进行调试。比如取消父元素内边界,查看绝对定位元素的位置变化。

有无定位值的区别

positionabsolute 的元素如果没有设置 left, top 等值与 left:0; top:0; 的的效果一样吗?

答案是不一样的,一个没有设置 leftright 值的绝对定位的元素就像是一个行内块元素,其表现得依旧在 DOM tree 中,对 margin 等属性敏感,但是其实际宽高已经丢失,如果没有设置高度,则其高度由其中的内容决定。

.box {    position: relative;    margin: 0 auto;    width: 200px;    height: 200px;    background: rgb(66, 98, 104);}.container {    margin: 0 auto;    width: 100px;    height: 100px;    background: rgb(68, 155, 172);}.box-item {    position: absolute;    width: 20%;    height:20%;    background: rgb(65, 116, 126);}

对于设置了 left:0; top:0; 的绝对定位的元素,这个元素将会从 DOM 树中脱离,独立于文档流,然后会根据相对于 static 定位以外的第一个父元素进行定位。

所以没有定位值的 absolute 元素可以说是个更加变态(没有实际宽度)的 float 元素(实际占据高度为 0),所以浮动元素干的某些事情绝对定位元素也能做到。

绝对定位元素的百分比定位

CSS 设置绝对定位后 top,bottom 设置百分比定位是按父元素的高度来计算的,同样 left,right 设置百分比定位是按父元素的宽度度来计算的。

.box {    position: relative;    margin: 0 auto;    width: 300px;    height: 200px;    background: rgb(66, 98, 104);}.box-item {    position: absolute;    top: 10%;    left: 10%;    width: 100px;    height: 100px;    background: rgb(65, 116, 126);}
您可以打开开发者工具对我进行查看。

父元素有内边界

如果父元素设置有 padding 值,则子元素定位 top,bottom 设置百分比定位是按父元素的高度 + 垂直内边界来计算的,同样 left,right 设置百分比定位是按父元素的宽度 + 水平内边界来计算的。

/* box-sizing: content-box; */.box {    position: relative;    margin: 0 auto;    padding: 10px 20px;    width: 200px;    height: 200px;    background: rgb(66, 98, 104);}.box-item {    position: absolute;    top: 10%;    left: 10%;    width: 100px;    height: 100px;    background: rgb(65, 116, 126);}
您可以打开开发者工具对我进行查看。

box-sizing: border-box; 时,其计算与内边界无关。

父元素有边框

如果父元素设置有 border 值,则子元素定位设置的百分比定位值的计算与边框无关。

/* box-sizing: content-box; */.box {    position: relative;    margin: 0 auto;    width: 200px;    height: 200px;    background: rgb(66, 98, 104);    border: 10px solid rgb(117, 141, 145);}.box-item {    position: absolute;    top: 10%;    left: 10%;    width: 100px;    height: 100px;    background: rgb(65, 116, 126);}
您可以打开开发者工具对我进行查看。

box-sizing: border-box; 时,如果父元素设置有 border 值,则子元素定位 top,bottom 设置百分比定位是按父元素的高度 - 垂直边框来计算的,同样 left,right 设置百分比定位是按父元素的宽度 - 水平边框来计算的。

绝对定位元素的百分比宽高

绝对定位元素的百分比宽高是相对于其最近的父级别定位元素的 padding-box 的大小来计算的。

/* box-sizing: content-box; */.box {    position: relative;    margin: 0 auto;    padding: 20px;    width: 200px;    height: 200px;    background: rgb(66, 98, 104);    border: 10px solid rgb(117, 141, 145);}.container {    margin: 0 auto;    width: 100px;    height: 100px;    background: rgb(68, 155, 172);}.box-item {    position: absolute;    top: 0;    left: 0;    width: 20%;    height:20%;    background: rgb(65, 116, 126);}

当 box-sizing: border-box; 时,依然遵循上面的原则,所以计算绝对定位元素的百分比宽高时,应由 height - border 作为基础。

写在最后

若是文中有什么错误,欢迎大家指正,希望和大家在交流之中共同进步。

转载于:https://www.cnblogs.com/anani/p/9462927.html

你可能感兴趣的文章
if __name__ == '__main__'
查看>>
CF 375D. Tree and Queries【莫队 | dsu on tree】
查看>>
Maven最佳实践 划分模块 配置多模块项目 pom modules
查看>>
Hadoop学习笔记——WordCount
查看>>
Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 1)
查看>>
Java-Spring-获取Request,Response对象
查看>>
opencv项目报错_pFirstBlock==pHead解决办法
查看>>
MySQL日志
查看>>
Oracle性能优化之Oracle里的执行计划
查看>>
电脑如何连接远程服务器?听语音
查看>>
使用Xcode 查看objective-C的汇编代码
查看>>
Vue.js——60分钟快速入门
查看>>
设计模式 - 模板方法模式(template method pattern) 具体解释
查看>>
mysql判断一个字符串是否包含某子串 【转】
查看>>
a bad dream
查看>>
FD_CLOEXEC用法及原因_转
查看>>
element UI 的学习一,路由跳转
查看>>
RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
查看>>
Spring JavaBean属性值的注入方式( 属性注入, 特殊字符注入 <![CDATA[ 带有特殊字符的值 ]]> , 构造器注入 )...
查看>>
【Linux】Linux下统计当前文件夹下的文件个数、目录个数
查看>>