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. 时间的玫瑰+但斌的投资思维
  2. MySQL 5.5单实例 编译安装
  3. 记一次Weblogic连接池泄露的修复过程
  4. PCA主成分分析_特征创建(数据挖掘入门与实践-实验8)
  5. 华为鸿蒙系统学习笔记2-生态系统介绍
  6. 给公司的电脑配置theano
  7. JavaScript 为何会成为最受欢迎的编程语言?
  8. 如何消灭 Android 应用中的广告?
  9. 十种最受前辈宠爱的职场新人
  10. 2018-2019-1 20165208 《信息安全系统设计基础》第5周学习总结
  11. 日处理20亿数据,实时用户行为服务系统架构实践
  12. 分子动力学模拟软件VMD的安装与使用
  13. 基于web的小区物业管理系统
  14. 在Mac下使用PanDownload完美下载BD云盘资源
  15. 计算机无法识别银行usb是,电脑不能识别USB设备(加密设备、网银U盾等)的解决方法...
  16. CentOS开机简要流程
  17. (附源码)springboot企业合同管理系统 毕业设计 161456
  18. 微信小程序九宫格预览+单张图片预览
  19. 类选择器和ID选择器的区别
  20. web前端html实例-Html5实现的语音搜索功能

热门文章

  1. MapboxGL——marker轨迹动画效果,自定义速度。暂停继续轨迹运动
  2. html 动态修改列名,FineUI之动态增加列及修改列的实现
  3. 超全船cc0高清摄影图片素材网站整理
  4. 成佩涛——成功做好软件项目的20个要点
  5. Fincy新社交,让社交独而不孤
  6. healthkit 之前的计步方案
  7. 安娜堡计算机工程光学专业,美国排名前12的电气电子工程专业研究生院校
  8. 1.4语言媒介的选用2
  9. MATLAB阈值图像分割系统
  10. ZSW 展示了制造钙钛矿电池的更环保方式