CSS 中 position 属性详解

CSS中position 属性对应的值有 static、relative、absolute、fixed、sticky,在开发页面过程中会遇到元素的定位问题,那么如果我们了解了 position 属性的用处,在理清个值之间的区别之后,遇到需要定位处理的地方就不至于摸不清头脑了。

这里需要说明的是,如果设置了 position 属性,并且值不为 static ,那么元素可以设置对应的坐标属性 top | right | bottom | left 和 z-index ,记住哦,坐标属性只有在设置了 position 属性且值不为 static 的元素身上起作用。接下来我们将一一攻破 position 各项值的作用。

1. Static

position:static是元素默认的定位设置。不管开发者有没有设置此属性,元素都会在正常的布局流中。
注意看下面的代码

<body>
  <div class="block-red"></div>
  <div class="block-blue"></div>
</body>
<style>
    body {
      margin: 0;
    }
    .block-red{
      position:static;
      width:100px;
      height:100px;
      background-color:red;
    }
    .block-blue{
      width:100px;
      height:100px;
      background-color:blue;
    }
  </style>
不管是否设置了 position:static 结果都是一样的

其实在没有定位需求的时候写不写 position:static都是无关紧要的。他只是元素定位的一个默认值而已。既然写不写都无所谓那就不写了吧,hiahia。

2.Relative

position:relative,元素相对于其自身最初位置的定位。元素不会从正常的布局流中删除。下面我们来给设置了 relative 属性的红色模块添加附加的属性top:100px和 left:100px设置。

.block-red{
      position:relative;
      width:100px;
      height:100px;
      background-color:red;
      top:100px;
      left:100px;
    }
红色方块相对于原来的位置分别移动了x=100px,y=100px,而蓝色方块位置不变

我们会发现设置了relative定位的红色方块原来的占位不变,而且蓝色方块并没有被其定位所影响。

3.Absolute

position:absolute,他的参考点是最接近的一个设置了 position 属性的父元素(除了 position:static 的父元素),如果没有父元素或者没有被设置position 属性的父元素,html 元素会被当做参考点。当设置了 absolute 属性,那么此元素会从正常布局流中删除,其他元素的位置也会跟着受影响我们看一下下面的例子

现在我们将红色方块position 设置成 absolue观察一下

.block-red{
      position:absolute;
      width:100px;
      height:100px;
      background-color:red;
    }
<body>
  <div>
    <div class="block-red"></div>
    <div class="block-blue"></div>
  </div>
</body>
红色方块的坐标顶点会移到父元素的顶点,这里的父元素是 html

我们发现蓝色模块不见,而事实蓝色模块并没有消失,只是被红色模块遮挡,红色方块原来的占位不见了,它已经不在正常的布局流中,所以红色模块的定位设置影响了其他元素的正常布局。

这时我们再修改一下代码,在外围添加一个 div wrapper,并修改红色方块的left属性left:0px:

   .wrapper{
      background-color:#000;
      width:300px;
      height:300px;
      margin-left:100px;
    }
    .block-red{
      position:absolute;
      width:100px;
      height:100px;
      background-color:red;
      left:0px;
    }
    .block-blue{
      width:100px;
      height:100px;
      background-color:blue;
    }
<body>
  <div class="wrapper">
    <div class="block-red"></div>
    <div class="block-blue"></div>
  </div>
</body>
image.png

我们发现,即使在添加了父级div 的情况下,红色方块并没有将父级div 当做参考点,而是把html当做参考点。
我们再修改一下代码,给父级 div 添加 position 属性 position:relative

.wrapper{
      position:relative;
      background-color:#000;
      width:300px;
      height:300px;
      margin-left:100px;
    }
image.png

此时我们会发现,设置了position 属性的 div 变成了红色方块的参考点了。

4.Fixed

fixed 和 absolute 类似,元素会从正常的布局流中删除。设置了 position:fixed 的元素参考点是浏览器窗口,他的位置不会随着页面的滚动而发生变化,在日常的开发中也是很常用的。我们看一下代码

.wrapper{
      background-color:#000;
      width:300px;
      height:3000px;
      margin-left:100px;
    }
    .block-red{
      width:100px;
      height:100px;
      background-color:red;
    }
    .block-blue{
      position:fixed;
      top:0px;
      left:200px;
      width:100px;
      height:100px;
      background-color:blue;
    }
flex.gif

我们发现不管页面如何滚动,蓝色方块的位置都不会改变,颇有一种管你们怎么变,反正我就在这里了你拿我也我没本法得感觉。

5.Sticky

position:sticky 属性,相当于 absolute 和 fixed 的叠加,我们来用实际代码来理解一下。

修改一下代码红色方块和黑色方块不加 position 属性,给黑色方块设置一个可以滚动的高度,再给蓝色方块设置 position:sticky属性,再来观察一下:

.wrapper{
      background-color:#000;
      width:300px;
      height:3000px;
      margin-left:100px;
    }
    .block-red{
      width:100px;
      height:100px;
      background-color:red;
    }
    .block-blue{
      position:sticky;
      top:0px;
      width:100px;
      height:100px;
      background-color:blue;
    }
    .block-green{
      width:100px;
      height:100px;
      background-color:green;
    }
<div class="wrapper">
    <div class="block-red"></div>
    <div class="block-blue"></div>
    <div class="block-green"></div>
 </div>
sticky.gif

我们发现在页面没有滚动时,蓝色方块没什么变化,定位规则遵循 position:relative设置。当我们滚动页面至蓝色方块时,我们会发现,这时蓝色方块定位遵循 position:fixed设置,是不是很神奇呀。因为该属性比较新,浏览器兼容方面还不是很好,所以很少有人用,有兴趣的可以自己试一下。

说到这里,有没有对 position 属性有一个清晰认识呢?当然如果想要更好的理解,还是要自己去实际操作。花不了半个小时,就会弄清楚的,为何不试试呢,对吧?

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

推荐阅读更多精彩内容