CSS - 布局 - position - 定位

介绍

定位允许你从正常的文档流布局中取出元素,并使它们具有不同的行为,例如放在另一个元素的上面,或者始终保持在浏览器视窗内的同一位置。

有许多不同类型的定位,你可以对 HTML 元素生效。要使用特定类型的定位,我们使用position属性。

属性 position

语法:
position = 
  static      |
  relative    |
  absolute    |
  sticky      |
  fixed       
取值
  • static:静态定位,指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。默认值
  • relative:相对定位。
  • absolute:绝对定位。
  • fixed:固定定位。
  • sticky:粘性定位。

 
 

属性 topbottomleftright

  • position设置为absolutefixed时,`属性指定了定位元素各外边距边界与其包含块各边界之间的偏移。

  • position设置为relative时,属性指定了元素的各边界离开其正常位置的偏移。

  • position设置为sticky

    • 如果元素在viewport 里面,属性的效果和 positionrelative等同;
    • 如果元素在 viewport 外面,属性的效果和 positionfixed等同。
  • 当position设置为static时,属性无效。

注意:

  • 1、非定位元素设置这些属性无效。
  • 2、当topbottom同时指定时,并且 height没有被指定或者指定为auto的时候,topbottom 都会生效,在其他情况下,如果 height被限制,则top属性会优先设置,bottom属性则会被忽略。
  • 3、当leftright同时指定时,元素的位置会被重复指定。当容器是从左到右时,left的值会被优先设定;当容器是从右到左时,right的值会被优先设定。
语法:
left | right | top | bottom = 
  auto                 |
  <length-percentage>  

<length-percentage> = 
  <length>      |
  <percentage>  
取值:
  • <length>:可以是负的,正的 或者 null表示:

  • <percentage>:代表元素包含块的宽度的百分比。

  • auto:这个关键字表示:

    • 对于 绝对定位absolute元素,元素将忽略此属性而以right属性为准,如果此时设置width: auto,将基于内容需要的宽度设置宽度;如果right也为auto的话,元素的水平位置就是它假如作为静态 (即 static) 元素时该在的位置。

    • 对于** 相对定位**relative元素,元素相对正常位置的偏移量将基于right属性;如果right也为auto的话,元素将不会有偏移。

  • inherit:这个关键字表示该值与其父元素 (可能不是它的包含块) 的计算值相同。

 
 

静态定位 static

是每个元素属性positison属性的默认值。即,将元素放入它在文档布局流中的正常位置。是默认行为!

就不做过多的解释了。

 
 

相对定位 relative

它与静态定位非常相似,占据在正常的文档流中,需要使用topbottomleftright属性,来修改元素的位置。

示例:

HTML:
<div class="d1">
    <p class="p1">I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>
    <p class="p2">By default we span 100% of the width of our parent element, and we are as tall as our child content. Our total width and height is our content + padding + border width/height.</p>
</div>
CSS:
.d1{
    width: 50%;
    border: 2px solid black;
}
p{
    margin: 10px;
    border: 2px solid green;
}
.p1{
    background-color: aqua;
    position: relative;
    top: 20px;
    left: 10px;
    bottom: 10px;
    right: 10px;
}
.p2{
    background-color: antiquewhite;
}

效果:

 
 

绝对定位 absolute

元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。

示例1:设置元素 为 绝对定位,未设置 leftrighttopbottom
HTML:
<div class="d1">
    <p class="p1">I am a basic block level element. </p>
    <p class="p2">By default we span 100% of the width of our parent element, </p>
    <p class="p3">By default we span 100% of the width of our parent element, and we are as tall as our child content. Our total width and height is our content + padding + border width/height.</p>
</div>

CSS:
.d1{
    width: 50%;
    border: 2px solid black;
}
p{
    border: 2px solid green;
    margin: 0px;
}
.p1{
    background-color: aqua;
}
.p2{
    background-color: antiquewhite;
    position: absolute;
}
.p3{
    background-color: blueviolet;
}

效果:

代码分析:

  • 绝对定位的元素不再存在于正常文档布局流中,它坐在它自己的层独立于一切,有了 层级 的关系,自己创建了个单独的块级格式化上下文。

  • 显示的位置是其原本的位置。

 
 

示例2:给 祖先元素全部是static定位 或 没有 祖先元素的 绝对定位元素 分别设置 leftrighttopbottom
CSS:
html{
    border: 5px solid orange;
}
body{
    width: 500px;
    border: 5px solid red;
    margin: 10px;   
}
.d1{
    width: 0 auto;
    border: 5px solid black;
    margin: 10px;
}
p{
    border: 5px solid green;
    margin: 0px;
}
.p1{
    background-color: aqua;
}
.p2{
    background-color: antiquewhite;
    position: absolute;
    left: 0px;
    top: 0px;
}
.p3{
    background-color: blueviolet;
}

效果:
.p2{
    background-color: antiquewhite;
    position: absolute;
    right: 0px;
    bottom: 0px;
}

效果:

代码分析:

  • 如果所有的父元素都没有显式地定义 position 属性,那么所有的父元素默认情况下 position 属性都是 static。结果,绝对定位元素会被包含在 初始块容器 中。这个初始块容器有着和浏览器视口一样的尺寸,并且<html>元素也被包含在这个容器里面。简单来说,绝对定位元素会被放在<html>元素的外面,并且根据浏览器视口来定位。

 
 

示例3:当绝对定位的元素 的 祖先元素 有 非static定位,未设置 leftrighttopbottom
.d1{
    width: 0 auto;
    border: 5px solid black;
    margin: 10px;
    position: relative;
}
.p2{
    background-color: antiquewhite;
    position: absolute;
}

效果:

代码分析:跟static 时 一样。

 
 

示例4:当绝对定位的元素 的 祖先元素 有 非static定位,设置 leftrighttopbottom
.d1{
    width: 0 auto;
    border: 5px solid black;
    margin: 10px;
    position: relative;
}
.p2{
    background-color: antiquewhite;
    left: 0px;
    top: 0px;
}

效果:

代码分析:祖先元素有 relative 定位,那么绝对定位元素 则以最近一级的有定位祖先元素为参考点移动位置。

 
 

属性 z-index

当有很多的绝对定位元素开始重叠,那么什么来决定哪些元素出现在其他元素的顶部。这个时候需要用到属性z-index

z-index设定了一个定位元素及其后代元素的 或 flex 项目的z-order,当元素之间重叠的时候,z-index 较大的元素会覆盖较小的元素在上层进行显示。

语法:
z-index = 
  auto       |
  <integer>  |
  inherit    
取值:
  • auto:在当前堆叠上下文中生成的盒子的堆叠层级和父级盒子相同。盒子不会创建一个新的本地堆叠上下文。

  • <integer>:是生成的盒子在当前堆叠上下文中的堆叠层级。
    此盒子也会创建一个堆叠层级为 0 的本地堆叠上下文。这意味着后代(元素)的 z-indexes 不与此元素的外部元素的 z-indexes 进行对比。

 
 

固定定位 fixed

与绝对定位的工作方式几乎相同,但是,固定定位的元素则是相对于 浏览器视口本身

示例:调整浏览器的窗口大小,并修改body的宽高。
body{
    width: 800px;
    height: 500px;
    border: 5px solid red;
    margin: 10px;   
}
.p2{
    background-color: antiquewhite;
    position: fixed;
    left: 0px;
    top: 0px;
}

效果:

 
 

粘性定位 sticky

它基本上是相对位置和固定位置的混合体,它允许被定位的元素表现得像相对定位一样,直到它滚动到某个阈值点(例如,从视口顶部起 10 像素)为止,此后它就变得固定了。例如,它可用于使导航栏随页面滚动直到特定点,然后粘贴在页面顶部。

sticky不脱离文档流。

示例:
.p2{
    background-color: antiquewhite;
    position: sticky;
    left: 0px;
    top: 0px;
}

效果:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容