CSS原理解析之模型篇

写在前面:

尝试回答几个问题:
  1. 什么是盒模型,控制盒模型的属性有哪些?
  2. Margin、Padding、Border、Width、Height这些属性改变/影响盒模型,但每个属性都会在所有元素上生效么?
  3. 如果存在区别,那么和元素类型或者元素定位有关系么?
  4. 浮动元素是什么?位置如何确定?如果去掉浮动?
  5. 层叠关系如何判断优先级?越大就越靠近用户么?
盒模型是我们每天都在接触的,但盒子模型到底如何计算排列的,总是一知半解。本文尝试从W3C规范和实例入手,解决上述问题。

目录

包含块(containing block)
盒模型(Box model)
定位模式(Positioning schemes)
层叠关系(Layered presentation)

包含块

概念
每个盒子会变成他后代盒子的包含块,后代盒子的大小和位置会根据他包含块的矩形边框进行计算。但是不会受到包含块的限制,可能会溢出。
确定包含块的方法
  1. 对于根元素、position=fixed的元素,包含块都是视窗
  2. 如果元素是relative或者static,则是他最近的块形父元素的内容区(content)——注:规定了父元素必须是block container
  3. 如果元素是absolute,包含块是最近的非static的父元素的Padding区——注:父元素的类型未规定
举例
包含块最直观的判断是一个元素对大小设置百分比时,相对的元素是哪一个,这个元素就是他的包含块
1. 最基本的例子
示例代码
2. 当em变成absolute定位
示例代码

盒模型

Margin
  1. 宽度。分为四个方向,都支持百分比和具体的像素。并且margin的百分比是根据元素的包含块(containing-block)的width来计算。并不是margin-top/ bottom对应height。示例代码
  2. 内联元素(display: inline)的margin-top和margin-bottom失效。浏览器不允许设置。
  3. 合并。
    • 水平的margin不会合并(inline-block和inline都支持) 示例代码
    • 都属于常规流内(in flow)块级盒,处于同一个上下文的兄弟元素 解决方法:将其中一个块盒变成BFC,阻止margin的合并 示例代码
    • 块级父元素和其子元素,在没有padding,border,height,空隙将之隔开时,子元素的margin会渗透到父元素上。简单讲,父元素和子元素之间没有其他元素。示例代码
  4.  允许设置负值。
    • 对于position=static元素,负值相当于将元素向负值方向移动覆盖,但是只会覆盖颜色,不会覆盖文字。示例代码
    • 对于position=relative元素, 负值还是会把下面的元素粘着一起移动,但会完全覆盖前一个元素。示例代码
    • 对于position=absolute元素,因为元素脱离了文档流,所以负值只会自己发生偏移,对前后元素没有任何影响。示例代码
    • 对于float元素,可以通过负值进行覆盖,最常见的应用是三栏应用。示例代码
Padding
  1. 宽度。同Margin。
  2. 内联元素(display: inline)的padding生效,但是top和bottom并不会推挤,只会覆盖其他元素,覆盖情况遵循z-index原则。示例代码
  3. 合并。Padding不存在合并情况示例代码
  4. 不允许负值。
Border
  1. 宽度。只有px,不支持百分比。
  2. 合并。inline元素左右不合并,上下会合并。inline-block&block元素四个方向都不会合并示例代码
Width
  1. 内联元素不能设置width和height。
  2. 非内联元素百分比设置(见上文包含块)
    • 根据包含块的content box宽度计算
    • 如果当前元素是绝对定位,那么相对父元素的padding box的宽度定位
Height
计算方式同width

定位模式

常规流
流内元素有几大模型。CSS2.1中定义了IFC(Inline Formatting Contexts)与 BFC(Block Formatting Contexts)。CSS3中增加了GFC(GridLayout Formatting Contexts)和FFC(Flex Formatting Context)。后两个后续文章会详细讲解,这里暂且不提。
BFC(Block formatting contexts)块格式化上下文
  1. 什么情况产生BFC(四选一)
    • 浮动
    • 绝对定位
    • 非块盒的块容器(inline-block)
    • overflow不为visible的块盒
   2. 特性
    • 从包含块顶部竖直方向排列
    • BFC内部兄弟盒子之间的margin会合并——可以通过把兄弟之一变成BFC解决合并
    • BFC可以阻止margin合并
IFC(Inline formatting contexts)内联格式化上下文
  1. 如何产生:只有在一个块级元素中仅仅包含内联级别元素时才会生成
  2. 特性
    • 从包含块顶部水平方向排列
    • 排列情况和浮动与否会改变行盒的高度
    • 当一个行盒被分割,margin,border,padding都不会再有视觉效果了
浮动
  1. 概念:float CSS属性指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。该元素从网页的正常流动中移除,尽管仍然保持部分的流动性
  2. 位置:
    • 当一个元素浮动之后,它会被移出正常的文档流,然后向左或者向右平移,一直平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素
    • 浮动元素会根据上一个元素的类型判断位置,如果上一个是浮动的,则跟随他,放不下就挤到下一行
    • 如果上一个是标准流的元素,则浮动元素的相对垂直高度不变,顶部和上一个元素的底部对齐。
   3. 清除浮动
    • 引入空隙,父元素使用::after伪元素
    • 浮动元素限制成BFC,使用overflow:hidden
    • clear属性
   4. 代码: 示例代码
绝对定位
position=absolute设置元素绝对定位,会导致元素变成绝对定位,脱离文档流,并且元素此时是BFC布局,Margin不会进行合并。使用top/bottom/left/right(下面简写成TBLR)控制位置的变动,具体像素和百分比都参照包含块进行偏移。
比较其他position属性值
  1. position=static 常规流布局,无法通过TBLR控制位置
  2. position=relative 盒子相对于其常规流位置进行偏移,兄弟元素相对其偏移前的位置定位。使用TBLR控制时,如果是固定像素,那盒子相对于自身边界偏移,如果是百分比,则参照包含块偏移。
  3. position=fixed 包含块是视窗,使用TBLR控制都是相对包含块偏移
  4. 对于百分比:left/right 相对于包含块的width,top/bottom相对于包含块的height

层叠关系

在一个层叠上下文中一共可以有7种层叠等级,列举如下:示例代码
  1. 背景和边框 —— 形成层叠上下文的元素的背景和边框。 层叠上下文中的最低等级。
  2. 负z-index值 —— 层叠上下文内有着负z-index值的子元素。
  3. 块级盒 —— 文档流中非行内非定位子元素。
  4. 浮动盒 —— 非定位浮动元素。
  5. 行内盒 —— 文档流中行内级别非定位子元素。
  6. z-index: 0 —— 定位元素。 这些元素形成了新的层叠上下文。
  7. 正z-index值 —— 定位元素。 层叠上下文中的最高等级。
当对某一个元素的z-index赋值了除了auto以外的值,就创建了一个新的层叠上下文,独立于其他的层叠上下文。
比较顺序变成,先比较各个层叠上下文的z-index。然后在层叠上下文中比较子元素的优先级。

总结

  1. 本文解释包含块,以及基于包含块确定的盒模型,对盒模型的四个边界的计算方式做了总结。
  2. 对元素的定位方式和不同定位方式引起的元素之间位置变化做了总结。
  3. 后续会继续以总结形式梳理CSS中常见但迷惑的地方。
  4. 如有错误,请指出,大家一起共同进步~




更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quartz遇到的问题

本文首次发布于My Blog,作者张琦(Ian),转载请保留原文链接。 有状态和无状态 使用有状态(StatefulJob)还是无状态的任务(Job) 在 Quartz 中,基本来说,任务分为有状态和无状态两种。实现 Job 接口的任务缺省…

RIP RETE时间获得PHREAKY

我刚刚完成了我称为PHREAK的新规则算法的一些高级文档,这是混合推理中的一个文字游戏。 它仍然有点粗糙和高水平,但希望仍然很有趣。 它建立在ReteOO之上,非常好阅读。 ReteOO算法 ReteOO是在3、4和5系列发行版中开发的。 它采用RETE算法并应…

Hadoop自学笔记(三)MapReduce简单介绍

1. MapReduce Architecture MapReduce是一套可编程的框架,大部分MapReduce的工作都能够用Pig或者Hive完毕。可是还是要了解MapReduce本身是怎样工作的,由于这才是Hadoop的核心,而且能够为以后优化和自己写做准备。 Job Client, 就是用户 Job …

VirtualDOM与diff(Vue实现)

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出。文章的原地址:https://github.com/answershuto/learnVue。在学习过程中,为Vue加上了…

使用Java的RESTful Web服务

REST代表“代表性状态转移”,由Roy Fielding于2000年在其论文“建筑风格和基于网络的软件体系结构设计”中首次提出。 REST是一种建筑风格。 HTTP是一种协议,其中包含一组REST体系结构约束。 REST基础 REST中的所有内容都被视为资源。 每个资源都由UR…

windows npm安装webpack

Webpack: Webpack 是一个前端资源加载/打包工具。 它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。 参考下图: 安装Webpack: 1.首先需要安装node.js(npm) 下载地址:node.js dow…

JavaFX中的塔防

我想长时间使用我的游戏引擎来编写《塔防》游戏,但是由于另一个小组努力创建JavaFX《塔防》游戏,所以我认为我宁愿创建另一款游戏。 从邮件列表中,我了解到不再开发其他游戏。 因此,我决定尝试一下。 塔防是一款非常适合基于图块…

CSS pointer-events属性的使用

楔子 在前端的开发中,我们都是直接与用户接触,应该尽量让用户感到操作畅快愉悦,获得类似native的感觉。其中动画是最常用的方法。 这里的需求是,弹层的设计,这个弹层希望可以像 native 上的弹层一样,点击…

深入理解JavaScript之Event Loop

前言 最近阅读《高性能JavaScript》时,第六章谈到“通过定时器将JavaScript执行代码的控制权先让给浏览器用于更新UI状态,然后再将控制权交回给JavaScript代码,这样就可以使得页面更为流畅”,就联想到了之前理解的事件循环。 这…

使用EasyPoi导出Excel

Excel模板来自自己写死的一个excel模板,相当于是用户查询数据,数据填充到一个模板的Excel里,再导出Excel /*创建模板*/String a request.getSession().getServletContext().getRealPath("/resource/河南能源化工集团安全监控系统联网系统…

Hazelcast入门

7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置并且可以互相通信。 这意味着可以通过编写很少的代码行在VM之间同步数据。 如果您…

android手机最低内存,原神手机端需要哪些配置 手机端最低配置要求介绍

原神是一款由米哈游自主研发的全新开放世界冒险游戏,游戏最近迎来了pc端的首次测试,而且在不久之后就会开启原神手机端的公测版本,那么手机端需要什么配置呢?小编带来了详细的介绍。移动端预下载:9月25日下午16&#x…

AnswerOpenCV一周佳作欣赏(0615-0622)

一、How to make auto-adjustments(brightness and contrast) for image Android Opencv Image Correctionim using OpenCV for Android. I would like to know,how to make image correction(auto adjustments of brightness/contrast) for image(bitmap) in android via Open…

所有其他指标均无用

对于队列,无论是实现为JMS ,数据库表(即Ruby的Delayed :: Job用于队列的什么),甚至是Amazon的SQS ,用于评估队列状态的最常见指标是其长度。 从本质上讲,可以基于在任何给定时间队列中驻留多少消…

类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...

随着智能手机日益发展,辅助智能手机的数据线配件也越来越多样。现在我们最常见的无非就是标准Micro usb口、正反随便插的Type-c接口、还有苹果Lightning数据线,那么除了这些类型数据线,你知道如今市面上还有哪些更方便好用的手机数据线吗&…

canvas入门实战--邀请卡生成与下载

1.前言 写了很多的javascript和css3的文章,是时候写一篇canvas的了。canvas是html5提供的一个新的功能!至于作用,就是一个画布。然后画笔就是javascript。canvas的用途非常的广,特别是html5游戏以及数据可视化这两个方面。现在can…

Apache ActiveMQ 5.9发布

Apache ActiveMQ团队刚刚发布了新的ActiveMQ 5.9版本 。 Apache ActiveMQ 5.9发布 自从先前的5.8版本以来,此版本是8个月的辛苦工作。 在此发行版中,我们将像往常一样对代理进行增强,并使用最新的协议(例如AMQP和MQTT&#xff…

android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

前言上次我写了一遍文章《Android 关于美颜/滤镜 从OpenGl录制视频的一种方案》,里面利用ImageReader来从获取Surface上获取数据,但是经过熊皮皮的提醒,我发现多PBO的确可以实现跟ImageReader一样的效果,并且版本要求仅为Android4…

Java对象到对象映射器

我在该项目上使用了Dozer一段时间。 但是,最近我遇到了一个非常有趣的错误,它促使我环顾四周,并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表: 推土机:推土机是Java Bean到Java Bean的映射器&#xff…

android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer

在之前的项目中用到了视频播放的功能,在网上看了看使用了大家用的比较多的一个开源项目JiaoZiVideo可以迅速的实现视频播放的相关功能。JiaoZiVideo的简单使用集成了JiaoZiVideo后仅需这几行代码就可以实现播放视频JZVideoPlayerStandard jzVideoPlayerStandard (J…