关于CSS定位中的位置


刚刚学习了定位,一开始还是比较晕的,特别是关于里面的各种相对位置,不知道它们的坐标具体是怎么算的。所以这里特别的记录一些影响到定位当中位置的一些东西。


一、盒模型

在聊位置之前,我们先来看看之前说过的盒模型。


盒模型

我们从内到外来看看这个盒模型。

  • Content edge:它也叫做inner edge,它所围成的区域代表的是具体的内容,所确定的范围叫做content box,也就是盒模型计算方法box-sizing的默认值content-box的范围。
  • Padding edge:它所确定的就是内边距padding的区域。
  • Border edge:确定border的区域。
  • Margin edge:确定margin,也就是外边距的区域。

二、定位中“位置”的计算

  • relative和absolute联合使用的情况
    在定位当中,我们经常把position: relative;position: absolute;配合使用,这就相当于建立了一个坐标系,根据坐标来进行偏移,那么这个坐标系具体长什么样,原点又在哪里呢?
    这里的坐标系和数学当中的有一定的差别,它们的X轴方向都是水平向右,但是这里的Y轴方向是垂直向下的。
    我们都知道设置了绝对定位的元素,它的位置偏移是相对于最近的设置了定位(static定位除外)的祖先元素(如果没有满足的祖先元素,则相对body进行位置偏移。)的左上角,这个左上角到底具体指什么,是margin内边界或外边界、border内边界或外边界、还是padding内边界或者外边界呢?那我们来看看它的坐标原点到底是在是在哪里。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
    <title>定位</title>
    <style>
    .container{
        position: relative;
        width: 200px;
        height: 200px;
        margin: 40px;
        padding: 40px;
        background: pink;
        border: 5px dashed;
    }
    .box{
        position: absolute;
        width: 100px;
        height: 10px;
        margin: 20px;
        padding: 20px;
        background: yellow;
        border: 5px dashed;
        top: 0px;
        left: 0px;

    }
    </style>
</head>
<body>
    <div class="container">
        <div class="box"></div>
    </div>
</body>
</html>

定位的坐标原点

在上面的例子当中,我们把box的坐标设为(0,0)。通过上面的效果图可以知道,container和box的border距离为20px,这就是box的margin。所以可以得出的结论是,在relative和absolute结合使用的情况下,构成坐标原点的是padding edge的左上角,这就是我们经常说的相对于祖先元素的左上角的那个角进行的偏移。而我们给绝对定位设置的坐标就是这个元素的margin edge的左上角。所以如果对定位元素设置了坐标(left、top、bottom、right)的话,一般不要设置margin,不然很难进行精确的定位。

  • 单一定位的情况
    当我们使用单一的定位时,比较容易理解。它的坐标原点就是margin edge的左上角,所有的位移都是根据这个原点进行偏移。比如说设置为相对定位,它就是根据自己左上角的margin edge进行偏移。

三、包含块

如果祖先元素能为后代生成包含块的情况下,构成XY相对坐标系的准确来说其实是包含块,不一定是父级元素。我们先来看看包含块的定义:

CSS包含块是CSS的视觉可视化模型的一个重要的基本概念,因为每个元素都是相对于其包含块摆放的。也就是说,元素的包含块为元素的尺寸和位置的计算提供了参考,是元素的“定位上下文”。

元素的包含块与它的定位方式相关,定位方式不同,包含块也不一样,下面分情况进行说明。

  • 根元素
    根元素的包含块叫做初始包含块,初始包含块是一个视口大小的矩形。在HTML当中,根元素就是html元素。默认条件下,html元素为包含块,其中一些浏览器也会把body设为包含块。
  • 非定位元素和相对定位元素
    对于没有设置绝对定位(position: absolute)的非根元素,例如:position: staticposition: relative,包含块设置为最近的块级元素祖先的内容区的边缘,而不是margin和padding边缘。
  • 绝对定位元素
    设置了绝对定位的元素,它的包含块是距离它最近的设置了定位的祖先元素(static除外)。祖先元素可以是块级元素,也可以是行内元素,具体来说分为以下几种情况:
  • 如果祖先元素为块级元素,那么包含块为该元素的内边距边界,也就是padding edge。
  • 如果祖先元素为行内元素,那么包含块为该祖先元素的内容边界,也就是content edge。
  • 如果没有上述符合条件的定位祖先元素,那么包含块就是初始包含块
  • 固定定位元素
    对于固定定位元素position: fixed,它的包含块就是视口本身

四、定位当中的一些小知识点

  • position: relative不会改变行内元素的display属性,而position: absolute会改变行内元素的display属性,它将会由inline变成block。所以如果设置了absolute,可以不将元素display改成block。
  • 块级元素在设置了position(relative/static)的情况下width为100%,但是如果设置了position: absolute,width将会变成auto,它会受到父元素的宽度影响。
  • 元素设置了定位之后,如果没有设置top、bottom、left、right属性的话,定位将不会起作用。
  • 上下margin不会在绝对定位的元素上进行边距合并。
  • 重叠
    如果有重叠,就要考虑覆盖关系。定位(absolute和fixed)、浮动、普通流的覆盖位置从下到上依次为:
  • z-index为负的定位元素。
  • 普通流的非行内元素。
  • 浮动元素。
  • 普通流的行内元素。
  • z-index为auto或0的定位元素。
  • z-index为正值的定位元素。

感觉定位这一块还有许多要学习的东西,以后再来慢慢积累吧。


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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,744评论 1 92
  • 前言 CSSOM全称CSS对象模型,涉及两部分内容,第一部分和操作样式表相关,第二部分和元素尺寸相关,本文介绍第二...
    江枫阅读 2,982评论 1 10
  • 作者:ACGTOFE原文地址:http://acgtofe.com/posts/2015/10/xyz-in-cs...
    IT程序狮阅读 502评论 1 4
  • 以下文章是我在网上收集的内容,为了记录自己的学习以及为了以后不到处找而记录下来,如果对你有用,请感谢写这些文章的前...
    DCbryant阅读 931评论 0 2
  • CSS 定位 CSS有三种基本的定位机制:普通流,浮动,绝对定位(absolute, fixed):普通流是默认定...
    _空空阅读 5,727评论 0 15