CSS 定位布局 - 相对、绝对、固定三种定位

仅供学习,转载请注明出处

文档流

文档流,是指盒子按照html标签编写的顺序依次从上到下,从左到右排列,块元素占一行,行内元素在一行之内从左到右排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置。

关于定位

我们可以使用css的position属性来设置元素的定位类型,postion的设置项如下:

  • relative 生成相对定位元素,元素所占据的文档流的位置保留,元素本身相对自身原位置进行偏移。

  • absolute 生成绝对定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相对于上一个设置了定位的父级元素来进行定位,如果找不到,则相对于body元素进行定位。

  • fixed 生成固定定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相对于浏览器窗口进行定位。

  • static 默认值,没有定位,元素出现在正常的文档流中,相当于取消定位属性或者不设置定位属性。

  • inherit 从父元素继承 position 属性的值。

定位元素的偏移

定位的元素还需要用left、right、top或者bottom来设置相对于参照元素的偏移值。

看了上面关于定位的一些概念,下面就可以手写几个示例来看看。

relative 相对定位的示例

relative 生成相对定位元素,元素所占据的文档流的位置保留,元素本身相对自身原位置进行偏移。

首先使用三个div来看看文档流部署的情况,如下:

从上面的三个div来看,就是正常的文档流布局的情况,绿色的div直接再黄色的div上方,而黄色由于有绿色的div占据了上面的文档流布局的位置,导致黄色被挤到了下方。

而相对定位的布局是不会影响文档流布局的。假设我想要使用相对定位对绿色的div进行偏移,那么就是根据绿色div的文档流布局的位置进行相对偏移的。

假设想要达到上图的偏移效果,该怎么做呢?

从代码看出,只要在绿色div的样式属性设置了position:relative;之后,就可以使用lefttop 设置与原来文档布局位置的偏移量。

实现代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .outside{
            width: 500px;
            height: 600px;
            border: 1px solid #000;
            margin: 50px auto 0;
        }

        .outside div{
            width: 200px;
            height: 100px;
        }

        .box1{
            background-color: green;
            position: relative;
            left: 50px;
            top: 50px;
        }

        .box2{
            background-color: gold;
        }
    </style>
</head>
<body>
    <div class="outside">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
</body>
</html>

absolute绝对定位示例

absolute 生成绝对定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相对于上一个设置了定位的父级元素来进行定位,如果找不到,则相对于body元素进行定位。

在上面相对定位的示例中,元素相对定位是基于文档流原来的位置进行偏移定位的。那么,绝对定位是基于什么的呢?

将刚才关于设置相对定位的代码改为绝对定位看看。

当设置绿色的div为绝对定位之后,发现黄色的div不见了。
其实,黄色的div并不是不见了,而是跟绿色的div重叠了。因为当绿色div设置为绝对定位之后,就会脱离文档流布局,此时绿色的div就相当于漂浮了起来,黄色的div就没有被绿色div挤下来,自然就上去与绿色div重叠在一起了。

那么下面来设置一下偏移看看。

此时绿色的div并不是基于最外层的div进行偏移的,简单来看是根据浏览器进行偏移的,也就是body。

这是为什么呢?可以放大浏览器再来看看绿色div的偏移,可能更加直观。因为上面我缩放了浏览器的宽度一半。

那么为什么绿色的div是与body进行偏移呢?因为绿色div的父级元素外层div没有设置定位。

如果我给外层div设置一下绝对定位,或者相对定位,是不是就可以以外层的div进行偏移呢?

先给外层div设置相对定位来看看:

好了,从浏览器的呈现来看,设置相对定位就可以让绿色div以外层div进行相对偏移。下面再来看看绝对定位。

父元素div设置了绝对定位之后,的确绿色div就以外层div进行偏移了。但是同时父级div也与body进行了定位,需要重新设置偏移量才可以居中。

但是这样写死肯定很不方便,所以还是直接用相对定位比较合适。

fixed固定定位

fixed 生成固定定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相对于浏览器窗口进行定位。

上面已经测试使用了绝对定位,绝对定位基本是与父级元素进行偏移定位的。那么fixed固定定位按照描述应该就直接是基于body进行偏移定位的。

那么这个怎么去验证呢?先看看原来基于父级定位的绝对定位的div情况如下:

将绿色div的绝对定位改为固定定位,如下:

从上面的结果来看,固定定位是完全不管父级元素是否设置了定位属性的,直接就与body进行定位偏移。

这种定位方式最适合用于放广告了。

定位元素层级 z-index

定位元素是浮动的正常的文档流之上的,可以用z-index属性来设置元素的层级。

为什么需要元素的层级呢?例如当在做一个弹框的时候,需要弹框不被其他任何元素覆盖,那么则可以设置弹框的元素的层级为最高即可。

下面写个示例来理解一下:

从上图可以看出最后写的红色div就是层级最高的,没有被其他div覆盖。

实现代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .outside{
            width: 500px;
            height: 500px;
            border: 1px solid #000;
            margin: 50px auto;
            position: relative;
        }

        .outside div{
            width: 200px;
            height: 200px;
            position: absolute;
        }

        .box1{
            background-color: blue;
            left: 20px;
            top:20px;
        }

        .box2{
            background-color: green;
            left: 40px;
            top:40px;
        }

        .box3{
            background-color: pink;
            left: 60px;
            top:60px;
        }

        .box4{
            background-color: red;
            left: 80px;
            top:80px;
        }


    </style>
</head>
<body>
    <!-- div.outside>(div.box$)*4 -->
    <div class="outside">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
        <div class="box4"></div>
    </div>
</body>
</html>

那么如果,我想要将第一个蓝色div不被覆盖,那么就可以设置蓝色div的层级为10(因为默认元素的层级小于10)

当然,如果设置弹框不知道其他元素的层级到底多少,则可以设置999之类的最大数值即可,那样就不用被其他元素覆盖了。

定位元素特性

绝对定位和固定定位的块元素和行内元素会自动转化为行内块元素

理解练习

制作如下布局:


首先写两个div出来,如下

将数字5的div定位到第一个div的右上角

设置圆角属性

border-radius: 14px;这里的 14px 代表圆半径就是 14px。所以,设置后div直接就是一个圆了。

那么下面看看外部的大div设置圆角会怎么样?

可以看出只要设置的圆角半径小于div的长宽,就是一个小圆角的形状。

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .outside{
            width: 100px;
            height: 100px;
            background-color: gold;
            margin: 50px auto;

            position: relative;

            border-radius: 14px;
        }
        .box1{
            width: 28px;
            height: 28px;
            background-color: red;
            color: #fff;
            text-align: center;
            line-height: 28px;

            position: absolute;
            right: -14px;
            top: -14px;

            border-radius: 14px;
        }
    </style>
</head>
<body>
    <div class="outside">
        <div class="box1">5</div>
    </div>
</body>
</html>

2019年全套Java、Android、HTML5前端、Python、大数据视频,价值数万资源大放送

寻找资源的地址如下:

扫描微信公众号

寻找价值数万的视频资源

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,630评论 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,112评论 1 45
  • CSS 是什么 css(Cascading Style Sheets),层叠样式表,选择器{属性:值;属性:值}h...
    崔敏嫣阅读 1,444评论 0 5
  • CSS 定位 CSS有三种基本的定位机制:普通流,浮动,绝对定位(absolute, fixed):普通流是默认定...
    _空空阅读 5,649评论 0 15
  • 北方固不是我的旧乡, 但南来又只能算一个客子, 无论那边的干雪怎样纷飞, 这里的柔雪又怎样的依恋, 于我都没有什么...
    苏清舟阅读 640评论 1 7