1.要想理解层叠上下层,首先要先从文档流和盒模型说起

文档流

在CSS中,文档流是一个很基础也是很重要的一个概念。很多时候她被称为Document Flow,但在CSS的标准被称为Normal Flow,即普通流常规流。大家更喜欢称之为文档流。那么CSS的文档流是怎么一回事呢?

在HTML中任何一个元素其实就是一个对象,也是一个盒子。在默认情况下它是按照出现的先后顺序来排列,而这个排列的顺序就是文档流。

而页面中的文档流主要包括三部分:块、内联、内联块

流动方向

  • inline元素从左到右,到达页面最右边才会换行
  • block元素从上到下,每一个都会另起一行
  • inline-block元素也是从左到右,但是但页面最右面的宽度不够存放一个inline-block元素的宽度,整个元素就会一起换行

宽度

  • inline元素的宽度为内部inline元素的和,不能用width指定
  • block元素的宽度默认自动计算宽度,可以用width指定
  • inline-block元素的宽度为内部元素的和,可以用width指定

高度

  • inline元素的高度是有line-height间接确定的,与height无关
  • block元素的高度有内部文档流元素决定,可以设置height
  • inline-block元素的高度与block类似

盒模型

在一个文档中,每一个元素都被抽象成一个盒子,每一个盒子又包括四部分(从内到外):内容(content),内填充(padding),边框(border),外边距(margin)。

1.我们一直都知道一个盒模型的background包括content和padding,那下面我们考虑一下,background的范围是从border的外边缘围成的区域还是从border的内边缘围成的区域呢?

代码验证:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>JS Bin</title><style>div {width: 200px;height: 200px;background: pink;border: 10px solid rgba(255, 255, 255, 0.5);}</style>
</head>
<body><div></div>
</body>
</html>

效果图:

所以能看出background的范围是从border的外边缘围城的区域,也得出一个结论:border是在background上面。

2.下面我们试着想一下从右边看这个盒子是什么样的,谁在上面,谁在下面,下面我们代码验证一下

代码验证:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>.parent {width: 200px;height: 200px;border: 5px solid pink;}.child {height: 20px;background: skyblue;margin-top: -14px;       /* 将块级元素向上移动14px */}.float {width: 50px;height: 50px;background: orange;float: left;             margin-top: -20px;       /* 将元素向上移动20px */}</style>
</head>
<body><div class="parent">我是内联元素                 <!-- 内联元素 --><div class="child"></div>    <!-- 块级元素 --><div class="float"></div>    <!-- 浮动元素 --></div>
</body>
</html>

显示效果:

结论:内联元素高于浮动元素高于块级元素

用图片可以直观的看出一个盒模型中元素的高低关系

3.下面我们加入定位试试看

代码验证:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>.parent {width: 200px;height: 200px;border: 5px solid pink;}.child {height: 20px;background: skyblue;margin-top: -14px;       /* 将块级元素向上移动14px */}.float {width: 50px;height: 50px;background: orange;float: left;             margin-top: -20px;       /* 将元素向上移动20px */}.relative {width: 50px;height: 50px;background: orangered;position: relative;      /* 将元素相对定位 */left: 25px;top: -20px;}</style>
</head>
<body><div class="parent">我是内联元素                  <!-- 内联元素 --><div class="child"></div>     <!-- 块级元素 --><div class="float"></div>     <!-- 浮动元素 --><div class="relative"></div>  <!-- 定位元素 --></div>
</body>
</html>

显示效果:

换绝对定位和固定定位效果同上,所以我们由得出一个结论:

除了静态定位(static),以上三种定位元素,都会处在其他元素之上。

4.最后验证一下定位元素加上z-index:

先正常排放,不用z-index

代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>div {width: 300px;height: 100px;}.relative {background: pink;position: relative;}.absolute {background: skyblue;position: absolute;left: 40px;top: 40px;}.fixed {background: orange;position: fixed;left: 80px;top: 80px;}</style>
</head>
<body><div class="relative">相对定位</div><div class="absolute">绝对定位</div><div class="fixed">固定定位</div>
</body>
</html>

显示效果:

当元素都加定位且没有z-index时,它们的层叠顺序是按照HTML中元素的顺序排列的,即后面的元素要比前面的元素高一点。

加上z-index

代码验证:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>div {width: 300px;height: 100px;}.relative {background: pink;position: relative;z-index: 3;}.absolute {background: skyblue;position: absolute;left: 40px;top: 40px;z-index: 2;}.fixed {background: orange;position: fixed;left: 80px;top: 80px;z-index: 1;}</style>
</head>
<body><div class="relative">相对定位</div><div class="absolute">绝对定位</div><div class="fixed">固定定位</div>
</body>
</html>

显示效果:

相对定位元素(pink)z-index为3,绝对定位元素(skyblue)z-index为2,固定定位元素(orange)z-index为1

所以当设置了 z-index 属性之后,这三种定位为元素的高低就根据 z-index 的值变化,值越大,层级越高,越靠上。

5.上面已知定位元素高于文档中其他元素,那定位元素加上-z-index与文档中元素相比呢?

代码验证:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>.parent {width: 200px;height: 200px;border: 10px solid pink;background: #ccc;}.child {width: 100px;height: 100px;background: skyblue;position: relative;left: 150px;top: 150px;z-index: -1;         /* 将z-index设置为-1 */}</style>
</head>
<body><div class="parent"><div class="child"></div></div>
</body>
</html>

显示效果:

所以设置了z-index值为负数的定位元素,会处于块级元素之下。

2.所以这就是所说的层叠上下文

简单来说,就是比谁层级高,比谁父元素层级高

元素盒子放入层叠顺序上下文的顺序,从层叠的底部开始,共有七种层叠等级:

  • 背景和边框:形成层叠上下文的元素的背景和边框。 层叠上下文中的最低等级。
  • z-index:层叠上下文内有着负z-index值的子元素。
  • 块级盒:文档流中非行内非定位子元素。
  • 浮动盒:非定位浮动元素。
  • 行内盒:文档流中行内级别非定位子元素。
  • z-index: 0:定位元素。 这些元素形成了新的层叠上下文。
  • z-index:定位元素。 层叠上下文中的最高等级。

文档根元素(<html>)就是一个默认的层叠上下层

每一个层叠上下层就是一个小世界,只有在同一个小世界的z-index才可以相互比较。

文档中的层叠上下文由满足以下任意一个条件的元素形成:

  • 文档根元素(<html>);
  • position 值为 absolute(绝对定位)或 relative(相对定位)且 z-index 值不为 auto 的元素;
  • position 值为 fixed(固定定位)或 sticky(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);
  • flex (flexbox) 容器的子元素,且 z-index 值不为 auto
  • grid (grid) 容器的子元素,且 z-index 值不为 auto
  • opacity 属性值小于 1 的元素;
  • 以下任意属性值不为 none 的元素:
    • transform
    • filter
    • perspective
    • clip-path
    • mask / mask-image / mask-border

层叠上下文​developer.mozilla.org

负的z-index也在层叠上下层的小世界里,不会逃出这个小世界。

总结

对于学习CSS来说,阅读CSS的规范和理解相关的概念都是枯燥无味的。而且CSS不正交,当你改变其中一个属性时,另一个属性也会变化。所以理解一些概念会比较吃力。比如这篇文章中提到的相关概念: 文档流(Normal Flow)、、层叠上下文(Stacking Context)层叠水平(Stacking Level)层叠顺序(Stacking Order)

虽然这些概念是CSS的基础,但很多同学都一直不愿去触碰,因为它们看起来简单,事实上还是较为复杂的。如查我们花一定的时间理解了这些概念,能帮助我们更好的理解CSS中其他相关的概念和知识点,特别是z-index的运用。

css如何让两个div上下排列_深入了解CSS层叠上下层相关推荐

  1. css如何让两个div上下排列_CSS层叠上下文

    在理解层叠上下文之前,我们先谈一谈CSS的z-index属性. 通常情况下,HTML页面可以被认为是二维的,因为文本,图像和其他元素被排列在页面上而不重叠. 然而其实CSS 允许你在现有的渲染引擎上层 ...

  2. 实现让两个DIV横向排列方法揭秘

    你对如何定义让两个DIV横向排列的方法是否熟悉,这里和大家分享一下,主要有两种方法,一种是把display换成inline,另一种就是使用float:right属性,相信本文介绍一定会让你有所收获的. ...

  3. 如何定义让两个div横向排列

    方法一: 一般情况,默认的div是写一个换一行,那么如何定义两个div横向排列而不换行呢? div默认的display属性是block.所以每一个div都是新的一行,现在把display换成inlin ...

  4. div横排 html_HTML+CSS-如何定义让两个div横向排列

    方法一: 一般情况,默认的div是写一个换一行,那么如何定义两个div横向排列而不换行呢? div默认的display属性是block.所以每一个div都是新的一行,现在把display换成inlin ...

  5. 两个div横向排列,顶端对齐的方式。

    2019独角兽企业重金招聘Python工程师标准>>> 两个div横向排列,顶端对齐的方式. 博客分类: div css 两个div横向排列,顶端对齐的方式. 1.左右两个div都设 ...

  6. div 左右并排,使用CSS如何让两个div并排显示

    用CSS如何让两个DIV盒子并排体现呢? 各人知道默认情况下DIV是独占一排的,DIV不设置任何CSS格局,这个DIV盒子都邑独有一行踊跃换行. 运用CSS让两个DIV并排闪现,排成一排显示思空见贯方 ...

  7. html div左中右布局,求助css。 一个div包含两个div,左右布局,左边css宽30%,右边div宽70%。高度均自...

    求助css. 一个div包含两个div,左右布局,左边css宽30%,右边div宽70%.高度均自以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让 ...

  8. html中如何div转换下一行,css如何让两个div不换行显示?

    css如何让两个div不换行显示?让两个div并列显示?下面本篇文章就来给大家介绍一下使用CSS让两个div并列在一行显示的方法,希望对大家有所帮助. 在HTML中,div是块状元素,div盒子本身默 ...

  9. html怎么使两个div模块并列居中,css怎样让两个div重叠,怎么让整个div居中

    css怎样让两个div重叠CSS如何使两个div重叠,css使两个div重叠的方法:首先,使用[position:absolute]属性为div设置绝对定位:然后使用z-index属性确定哪个div在 ...

最新文章

  1. sd.js 2.0封装:更加简化请求传参内容
  2. PHP中不被注意但是比较重要的函数用法集合
  3. uwsgi gevent
  4. Python 存储模型
  5. Python JS Jquery Json 转换关系
  6. DNN 4.6.2的中文语言包
  7. windows配置gitlab秘钥并测试_你了解多少Linux系统GitLab安装与环境配置?
  8. kotlin学习之类的扩展(四)
  9. android应用框架与原理之应用框架
  10. r与python自然语言处理_Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器 | 我爱自然语言处理...
  11. 使用两个队列实现一个栈
  12. uricode(GET参数) 转 object
  13. sketchup 计算机配置,草图大师2020对电脑配置要求
  14. php微积分难吗,两句话让你学好微积分
  15. ssh 登录linux xsell 登录Linux 提示用户密钥登录怎么解决
  16. 方波、三角波、正弦波信号发生器
  17. 计算机二级vbf资源百度云,2018年计算机二级考试考前冲刺卷
  18. RHCA学习记录之RH318(一)-环境准备
  19. 十问旷视印奇、唐文斌:AI企业都在经历「死亡之谷」
  20. Python学习手册 - 基础知识汇总(精简版)

热门文章

  1. OkHttp官方教程解析-彻底入门OkHttp使用
  2. day01-【复习回顾、继承、抽象类、模板设计模式】
  3. 林志玲结婚,给程序员送加班
  4. 【bzoj2563】阿狸和桃子的游戏 脑洞
  5. vue封装自己的组件库 02.封装dialog组件
  6. AI视频超分工具,720P视频一键转8K!
  7. 微信小程序:纯头像微信小程序源码下载,多分类头像自动采集无需服务器和域名
  8. 自从有了企业WiFi管家,老板们都省心了
  9. WebShell and Threat Intelligence
  10. (六)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:上篇(全局照明GI和局部照明)