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 接口的任务缺省…

android baseactivity,Android应用开发Android通过BaseActivity获取到当前启动的Activity名称...

本文将带你了解Android应用开发Android通过BaseActivity获取到当前启动的Activity名称&#xff0c;希望本文对大家学Android有所帮助。<在BaseActivity的onCreate方法中:public class BaseActivity extends AppCompatActivity { Override protected void onCreate(Nul…

RIP RETE时间获得PHREAKY

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

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

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

洛谷 P2051 [AHOI2009]中国象棋 解题报告

P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关&#xff0c;在一个N行M列的棋盘上&#xff0c;让你放若干个炮&#xff08;可以是0个&#xff09;&#xff0c;使得没有一个炮可以攻击到另一个炮&#xff0c;请问有多少种放置方法。大家肯定很清楚&am…

VirtualDOM与diff(Vue实现)

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

使用Java的RESTful Web服务

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

android 基础应用程序,android应用程序基本实现(基础篇).ppt

《android应用程序基本实现(基础篇).ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《android应用程序基本实现(基础篇).ppt(22页珍藏版)》请在人人文库网上搜索。1、Android应用程序基本实现,复杂的应用,上节课&#xff0c;我们实现了一个基本的android的应用程序…

windows npm安装webpack

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

ThreadLocal如何实现?

这是我上周的帖子的后续文章&#xff0c;在那篇文章中我解释了ThreadLocal用法的动机 。 从帖子中我们可以回想起&#xff0c;如果您希望每个线程都有一个独立初始化的变量副本&#xff0c;则ThreadLocal确实是一个很酷的概念。 现在&#xff0c;好奇的人可能已经开始问“我如何…

WPFの操作文件浏览框几种方式

WPFの操作文件浏览框几种方式 原文:WPFの操作文件浏览框几种方式方式1&#xff1a; 使用win32控件OpenFileDialog Microsoft.Win32.OpenFileDialog ofd new Microsoft.Win32.OpenFileDialog(); ofd.DefaultExt ".xml"; ofd.Filter "xml file|*.xml"; if…

为什么你应该尝试@reach/router

最近react-router的一个作者另外写了一个类react-router的组件 reach/router&#xff0c;尝试后感觉太棒了。如果你的项目只是web端的话我认为可以把你的react-router换掉了。下面是我到目前看到的所有非常好的点。 小&#xff0c;就4kb,压缩后比react-router小40kb左右。 更少…

android 浏览器 div穿透,解决IE 上重叠div 对 mouseover 事件的穿透方法之一

解决IE 下重叠div 对 mouseover 事件的穿透方法之一? ? ? ? 历经一天半的时间&#xff0c;我这前端的白痴终于想到了一个解决IE 下重叠div ?对 mouseover 事件的穿透方法。??现象&#xff1a; 两个并列关系的Div(没有父子关系)&#xff0c;但是两个Div在位置上面有重叠&…

类加载器工作机制

类加载器工作机制&#xff1a;1.装载&#xff1a;将Java二进制代码导入jvm中&#xff0c;生成Class文件。2.连接&#xff1a;a&#xff09;校验&#xff1a;检查载入Class文件数据的正确性 b&#xff09;准备&#xff1a;给类的静态变量分配存储空间 c&#xff09;解析&#xf…

webviewjavascriptbridge android ios,js与ios交互使用WebViewJavascriptBridge如何写多个函数

//js与webview交互初始化function setupWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {return callback(WebViewJavascriptBridge);}if (window.WVJBCallbacks) {return window.WVJBCallbacks.push(callback);}window.WVJBCallbacks [callback];v…

JavaFX中的塔防

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

CSS pointer-events属性的使用

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

海思NB-IOT的SDK看门狗的使用

1. 看门狗需要喂狗&#xff0c;如果自己写的任务一直运行&#xff0c;那么空闲任务无法运行会导致看门狗复位&#xff0c;来看下看门狗的机制&#xff0c;首先系统启动的时候创建了空闲任务 在这个函数里面void vTaskStartScheduler( void )创建了下面的空闲任务 xReturn xTas…

分布式Session框架

分布式Session框架 配置服务器&#xff0c;Zookeeper集群管理服务器可以统一管理所有服务器的配置文件共享这些Session存储在一个分布式缓存中&#xff0c;可以随时写入和读取&#xff0c;而且性能要很好&#xff0c;如Memcache&#xff0c;Tair。封装一个类继承自HttpSession&…

向您的JVM添加一些熵

能否生成真正的随机数取决于系统中的熵。 有人声称&#xff0c;这可以通过掷骰子来保证。 其他人认为&#xff0c;用此主体替换OpenJDK的java.math.Random.nextInt&#xff08;&#xff09;方法将有所帮助&#xff1a; public int nextInt() {return 14; }资料来源&#xff1a…