0

0

一篇通俗易懂的CSS层叠顺序与层叠上下文研究

高洛峰

高洛峰

发布时间:2016-10-13 14:11:28

|

1091人浏览过

|

来源于php中文网

原创

层叠顺序和层叠上下文是两个概念,但它们又有着密不可分的关系,层叠顺序很简单^_^,认真思考即可,而堆栈上下文更是不值一提,我只需要迁根红线你就懂了,所有说,都太简单。第一段说难懂,主要是有了这篇文章,才化解位移。废话少说,看剑。

在考虑到两个元素可能重合的情况下,W3C提出了层叠这个概念,层叠是指如何去层叠另一个元素,比如两个元素重合的时候应该让谁在前面,谁在后面。那它们的规则又是什么?先来试水。

层叠顺序篇

当两个元素都是块级元素时,默认情况越后面的元素层级越高

<style>
    div{        width:100px;        height:100px;
    }    .item1{        color:red;        background-color:pink;
    }    .item2{        margin-top:-100px;        background-color:orange;
    }</style><div class="item1">item11111</div><div class="item2">item22222</div>

1.png

可以看到item2把item1给盖住了,说明越后面的元素层级越高,另外item1的文字还是隐隐约约的可以看到,这说明了背景的层级比文字小。

另外我们可以这样

立即学习前端免费学习笔记(深入)”;

<style>
    div{        width:100px;        height:100px;
    }    .item1{        color:red;
    }    .item2{        margin-top:-100px;
    }</style><div class="item1">item11111</div><div class="item2"></div>

1.png

可以看到好像没有item2这个元素一样,主要原因是,在没有设置背景的情况下,元素的背景是透明的(transparent),并且允许后面的元素透上来。

在这种条件下,你会发现一个很搞笑的事,如下:

<style>
    div{        width:100px;        height:100px;
    }    .item1{        color:red;
    }    .item2{        background-color:orange;        margin-top:-100px;
    }</style><div class="item1">我是item2</div><div class="item2"></div>

1.png

如果不看代码,就好像这段代码真的是item2的。

当两个元素为行内块时

<style>
    div{        display:inline-block;        width:100px;        height:100px;
    }    .item1{        background-color:pink;
    }    .item2{        background-color:orange;        margin-left:-108px;
    }</style><div class="item1">item1111</div><div class="item2">item2</div>

1.png

也是后一个元素的层级比前一个元素的层级高,不过和两个块级元素不同的是行内块元素的背景层级比文字高。

当两个元素为行内元素时

<style>
    div{        display:inline;        width:100px;        height:100px;
    }    .item1{        background-color:pink;
    }    .item2{        margin-left:-48px;        background-color:orange;
    }</style><div class="item1">item1</div><div class="item2">item2</div>

1.png

和行内块的行为一样,背景层级比文字高,并且也是后一个元素比前一个元素层级高。

小总结

当两个元素为正常流时,默认情况下后一个元素比前一个元素层级高,并且允许后面的元素透上来。

如果两个元素是块级元素,文字比背景层级高(因此不管是否设置背景文字始终会透上来)。

如果是行内或行内块,背景比文字层级高(因此只要设置背景,后一个元素将透不上来)。

当一个元素为块级元素,另一个为行内块时

<style>
    div{        width:100px;        height:100px;
    }    .item1{        display:inline-block;        background-color:pink;
    }    .item2{        margin-top:-100px;        background-color:orange;
    }</style><div class="item1">item1</div><div class="item2">item2</div>

1.png

行内块比块级元素层级高,依然是文字比背景层级高。

如果另外一个元素是行内元素和这个效果也是一样的,代码如下:

<style>
    div{        width:100px;        height:100px;
    }    .item1{        display:inline;        background-color:pink;
    }    .item2{        margin-top:-30px;        background-color:orange;
    }</style><div class="item1">item1</div><div class="item2">item2</div>

1.png

当一个元素是行内块另一个是行内元素时

<style>
    div{        width:100px;        height:100px;
    }    .item1{        display:inline-block;        background-color:pink;
    }    .item2{        display:inline;        margin-left:-100px;        background-color:orange;
    }</style><div class="item1">item1</div><div class="item2">item2</div>

1.png

行内元素层级比行内块元素高,背景比文字层级高。

浮动系列

浮动和浮动,后一个比前一个层级高。

浮动和块元素,浮动层级高。

浮动和行内块,行内块层级高。

LLaMA
LLaMA

Meta公司发布的下一代开源大型语言模型

下载

浮动和行内,行内层级高。

效果如下:

1.png1.png1.png1.png1.png1.png

层叠顺序总结

当两个元素类型一样时,默认情况下后一个元素层级比前一个元素层级高。

在没有设置背景的情况下,元素的背景是透明的,并且允许后面的元素透上来。

块元素和其他任意除定位元素以外,文字层级比背景层级高。

浮动和块元素,浮动层级高。

浮动和行内块,行内块层级高。

浮动和行内,行内层级高。

定位和定位,后一个元素层级高。

定位比所有元素层级高。

它们的前后顺序:小于0的z-index

层叠上下文

如果你认真看完上一节,会不会奇怪一个问题,那就是在无特殊情况下为什么定位元素总是比普通元素层级高,另外一点就是,大部分情况下为什么总是后一个元素比前一个元素层级高,而罪魁祸首就是层叠上下文。

在HTML中有一个三维概念,也就是我们面向电脑屏幕的这一端为Z轴。

1.png

而凡是拥有层叠上下文的元素,将离用户最近,也就是越靠在Z轴前面。默认情况下只有根元素HTML会产生一个层叠上下文,并且元素一旦使用了一些属性也将会产生一个层叠上下文,如我们常用的定位属性。如两个层叠上下文相遇时,总是后一个层叠前一个,除非使用z-index来改变。如下:

1.png

<style>
    .box1{
        width:100px;
        height:100px;
        background-color:red;
    }
    .box1 .item{
        position:relative;
        height:100px;
    }
    .box2{
        margin-top:-50px;
        width:100px;
        height:100px;
        background-color:orange;
    }
</style>
<div class="box1">box1
    <div class="item"></div>
</div>
<div class="box2">box2</div>

虽然item产生了一个层叠上下文,但并不影响它父元素。它的父元素依然被box2层叠了。另外上面还说只要是产生层叠上下文的元素总是比其他元素层高,如下:

1.png

只需要给item加上一个背景即可,上一个案例只所以没看到item元素是因为背景默认是透明的,并且允许后面的元素透上来。

除了定位元素可以创建层叠上下文以外,还有如下几个属性也可以做到。以下来自MDN

根元素 (HTML),

z-index 值不为 "auto"的 绝对/相对定位,

一个 z-index 值不为 "auto"的 flex 项目 (flex item),即:父元素 display: flex|inline-flex,

opacity 属性值小于 1 的元素

transform 属性值不为 "none"的元素,

mix-blend-mode 属性值不为 "normal"的元素,

filter值不为“none”的元素,

perspective值不为“none”的元素,

isolation 属性被设置为 "isolate"的元素,

position: fixed

在 will-change 中指定了任意 CSS 属性,即便你没有直接指定这些属性的值

-webkit-overflow-scrolling 属性被设置 "touch"的元素

这里再拿opacity试水。

1.png

<style>
    .box1{        opacity:.9;        width:100px;        height:100px;        background-color:red;
    }    .box2{        margin-top:-50px;        width:100px;        height:100px;        background-color:orange;
    }</style><div class="box1">opacity</div><div class="box2">box2</div>

原本应该是box2层叠box1的,但因为box1创建了一个层叠上下文,所以把box2层叠了。

知道层叠上下文有什么用?

最大的好处就是当你想要改变元素的层级又不想用定位时,你还可以用很多其他的方法。如下:

1.png

原本浮动比块元素层级高,但当使用了opacity之后,块元素层级比浮动层级高,代码如下:

<style>
    .box1{
        float:left;
        width:100px;
        height:100px;
        margin-right:-20px;
        background-color:red;
    }
    .box2{
        overflow:hidden;
        width:100px;
        height:100px;
        background-color:orange;
        opacity:.99;
    }
</style>
<div class="box1">float</div>
<div class="box2">opacity</div>

总结

创建了层叠上下文的元素比其他元素层级高。

两个层叠上下文相遇时,后一个层级高。如果想改变层级可以使用z-index

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号