新旧CSS逻辑属性和盒子模型对比
为什么Flex box和Grid box是基于start 、结束 是排列规则,而不是常规的 top 、 right 、bottom 后接 左?
先别急着往下看,先想想。
这个问题,鱼头将在文章中给出答案。欢迎您继续阅读这个问题。如果你已经知道答案,你还可以看看它与你知道的答案是否一致。
CSS 逻辑属性
2017 年 5 月 18 日,W3C CSS 工作组发布了 CSS 逻辑属性和值第一个工作草案Level 1(第一个公共工作草案)。在不同的书写模式下,可以提取一般的抽象概念(例如起始位置或行)。这些逻辑抽象概念需要在不同的书写方式下映射到左、右、上、下等物理概念。某些 CSS 布局可能依赖于这些常见的逻辑概念。这个CSS模块提供了逻辑属性和值来以逻辑方式管理布局(而不是基于物理坐标、书写方向、尺寸分配等)。该模块源自与逻辑属性和值相关的 CSS21 函数。
以上是W3C中国的内容复制粘贴的。
对于前面,我们习惯使用 写入模式:定义文本的水平或垂直排列以及文本在块级元素中移动的方向。 如上效果请参见DEMO 源码如下: 图标如下: 一开始, 我们原创的 那么当你按照这个规则改变文本属性时,就会出现上述不符合语法规则的状态。 可能正是因为这个原因,W3C 发布了新的逻辑属性和值。 CSS新旧逻辑属性是两种完全不同的模型。 ?逻辑属性 从上表可以看出,Y轴方向的属性已更改为块,X轴的属性方向更改为内联。 对于不同语系的国家,书写顺序可能会有很大不同,这意味着 这意味着旧的逻辑属性在某些国家将变得不合理。 示例如下: 图片:(介质照片): float 默认值会导致文本和其他元素从左到右显示。 导致文本和其他元素从右向左显示。 来吧,如果你看到这里的剪纸,赶紧跑开重构它。等有一天这个属性正式启用,那就真的GG了。但我认为需要有一个属性来选择性地启用物理属性或逻辑属性,否则这对前端来说将是一场灾难! 当浏览器显示渲染树时,浏览器的渲染引擎使用 基本盒子模型(CSS基本盒子模型) 将所有元素划分为矩形盒子。这些盒子的外观和属性由 如果我们在浏览器控制台中输入以下代码,我们可以看到页面的每个元素都被一个矩形包围。这些是盒子 ,示意图如下: Box(盒子) 内容该框显示标签内的任何文本、图案或其他内容。 box中的padding是透明的,主要负责增加box内部区域的大小。 Box(盒子) 外部区域,设计为透明,负责隔离相邻元素。 box的边框负责隔离外边距和内边距。 盒模型共有三个值: 计算规则: 计算规则: 插图: 官方的说法是:它指定了客户端如何处理媒体中的文档树(Document Tree)。 每个盒子的布局由以下因素决定: 视觉样式表的计算一切都取决于矩形的边界。该矩形称为 ,包含块 。一般来说,(一个元素)生成的盒子将扮演其子元素的包含块的角色;我们说:(元素的)盒子是用其子节点的块构建的。包含块是一个相对的概念。 示例如下: 以上述代码为例:顶部,右,底部 , 不是绝对的。 左 定义我们的 HTML元素,这符合我们的物理概念。但对于CSS这种原本用于图形和文本渲染的语言来说,实际上是不匹配的。为什么这么说? 写入模式
写入模式以下HTML文本写入规则的值总共有5个变化(有几个也用于SVG) ,这是可能发生的本文不讨论):属性。 写入模式:horizontal-tb;
写入模式:horizontal-tb定义内容从左到右水平流动,从上到下垂直流动。下一条水平线位于上一条水平线的下方。 写入模式:vertical-rl;
写入模式:vertical-rl定义内容从上到下垂直流动,从右到左水平流动。下一条垂直线位于上一条垂直线的左侧。 写入模式:vertical-lr;
写入模式:vertical-lr定义内容从上到下垂直流动,从左到右水平流动。下一条垂直线位于上一条垂直线的右侧。 书写模式:sideways-rl; (仅限 Firefox41+)
书写模式:sideways-rl 定义从上到下垂直流动的内容,所有字形,甚至垂直脚本中的字形,都放置在右侧。 书写模式:side-lr; (仅 Firefox41+ 实现)
书写模式:sideways-lr内容从上到下垂直流动,所有字形,即使是垂直脚本的字形,都放置在左侧。 .wm-htb {
writing-mode: horizontal-tb;
}
.wm-vrl {
writing-mode: vertical-rl;
}
.wm-vlr {
writing-mode: vertical-lr;
}
.wm-srl {
writing-mode: sideways-rl;
}
.wm-slr {
writing-mode: sideways-lr;
}
.text-content {
width: 200px;
padding: 20px;
border: 1px solid;
display: inline-block;
vertical-align: top;
padding-right: 100px;
}
<div class="text-content wm-htb">writing-mode: horizontal-tb;</div>
<div class="text-content wm-vrl">writing-mode: vertical-rl;</div>
<div class="text-content wm-vlr">writing-mode: vertical-lr;</div>
<div class="text-content wm-srl">writing-mode: sideways-rl;</div>
<div class="text-content wm-slr">writing-mode: sideways-lr;</div>
复制代码如上图所示,当我们设置
padding-right 时: 100px;,这是不同的。书写规则和显示效果不同。 HTML和CSS仅服务于英语国家。然而,随着互联网的发展,不同书写规则的国家逐渐流行起来。 CSS逻辑属性是按照上、右、下、左物理逻辑来划分的。 新旧逻辑属性对比
新逻辑属性 margin-top margin-block-start margin-right margin-inline-end margin-bottom margin-block -end 左边缘 边缘内联开始 边框顶部 边框块开始 边框右 边框内联结束 边框机器人 Tom 边框块结束 左边框 边框内联开始 填充顶部 填充块开始 填充右 填充内联结束 填充底部 填充块结束 填充左侧 填充内联开始 宽度 内联大小 高度 块大小 块和内联的方向不同。例如:英语国家中的 padding-inline-start = padding-leftpadding-inline-start = 填充- 对padding-inline-start = padding-topCSS 定位
CSS 的定位属性更改如下: 旧逻辑属性 新逻辑属性 top inset-block-start 下 inset-Block-enderlinks inset-inline-Start rechts inset-inline-end /* 旧的逻辑属性 */
.popup{
position:fixed;
top:0;
bottom:0;
left:0;
right:0;
}
/* 新的逻辑属性 */
.popup{
position:fixed;
inset-block-start:0; /*top - in English*/
inset-block-end:0; /*bottom - in English*/
inset-inline-start:0; /*left - in English*/
inset-inline-end:0; /*right - in English*/
}
/* 新的逻辑属性支持简写 */
.popup{
position:fixed;
inset:0 0 0 0; /*top, right, bottom, left - in English*/
}
复制代码
CSS float
float属性也已更改。 旧逻辑属性 新逻辑属性 float:左 float:内联开始 float:右 float:内联结束 文本对齐 的text
text-align 的属性也已更改。 旧逻辑属性 新逻辑属性 文本对齐:左 文本对齐:开始 文本对齐:右 文本对齐:结束 方向 除了
写入模式还有一个排版属性,即方向后接写入模式 G 相似,但不同 书写模式 决定网页的布局方向,而 direction 决定文本对齐的方向。属性如下: 方向:ltr;
方向:rtl;
CSS盒模型
基本盒模型(CSS Basic Box Model)
CSS 决定。 $$('*').forEach(e => {
e.style.border = '1px solid';
})
复制代码
每个盒子由四部分组成: Content(内容物)
padding
Margin(边距)
border
盒模型的值
content-box
content-box是默认的盒模型。盒子的宽度和高度仅包括盒子的宽度和盒子自己。 高度width = widthheight = heightborder-box
border-box是盒模型的可选特性之一。盒子的宽度和高度包括内容物,垫叮跟随边缘。这也是文档处于 Quirks 模式时 Internet Explorer 使用的盒模型。 width = width + border + paddingheight = height + border + paddingpadding-box
padding-box为非标准属性。 在 Firefox 中实现,但在 Firefox 50 中被删除。 padding-box 的 width 和 height 属性包括内容和填充,但不包括边框和边距。 我要在这里投诉。我不知道为什么没有边距框。虽然意义不大,但如果真正实施的话,效果很可能会很奇怪。但作为一名晚期强迫症患者,却缺少一个特征。我感觉很不舒服。
视觉样式表
CSS 的 视觉样式表 基于 基本盒模型 (CSS)(基本盒模型) 实际算法将文档中的元素一一转换成盒子。 <div>
<table>
<tr>
<td>hi</td>
</tr>
</table>
</div>
复制代码div和table都包含块。 div是table的包含块,而table又是的包含块td
插图:(图片来自 w3help):
Box 生成
Box 生成是 CSS 视觉样式表 的一部分,用于从文档元素生成框架。框的类型取决于 CSS 外观 属性。
- 块级元素
- 如果元素的
视图是块,list -ite m 当或表时,它是一个块 水平元件。
- 如果元素的
- 块级框
- 块级框用于描述块与其父元素和姐妹元素之间的关系。
- 每个块级框将参与创建块格式化上下文。
- 每个块级元素至少生成一个块级框,即: 块级主框(块级主框)
- 块级主框包含生成的框和内容由后代,也将参与定位计划。
- 块级盒子,同时也是块容器盒子,称为块盒子(块盒子)。
- 匿名框在某些需要可视化格式的情况下,需要添加一些额外的框。这些框无法使用
CSS 选择器(即所有可继承的 CSS 属性)进行选择。这些值都是inherit,所有不可继承的 CSS 属性都是initial。这就是为什么这些被称为**匿名盒子**。
- 当元素
行内的显示时,行内 - block 当或inline-table时,这个是内联级别元素。 - 可以与其他内联内容一起显示为多行。
- 内联级别元素生成内联级别框,这些框还将参与创建
内联标记上下文。
- 与块框一样,CSS引擎有时会自动创建一些内联框。这些内联框无法由选择器选择,因此是匿名的。它们从父元素继承可继承的属性,并将其他属性保留为默认值
initial。
- 行框由内联格式化上下文创建,用于显示一行文本。在块框内,行框始终从块框的一侧延伸到另一侧。如果有浮动元素,则行框从左浮动元素的右边缘延伸到右浮动元素的左边缘。
- run-in box可以通过
display: run-in来设置,它可以是块盒子或行内盒子,取决于随后的盒子类型。
定位规则
一旦盒子形成,CSS 引擎必须定位它们以完成布局。
定位规则如下:
- 正常流程
- 正常流程中,盒子是连续放置的。
- 在 块布局上下文 中,框一个接一个地垂直排列。
- 在内联格式化上下文中,框水平排列。
- 浮动:当盒子的
浮动不是不是且位置时 是静态或相对,盒子悬浮放置。悬停:左:盒子放置在当前行盒子的起始位置(左侧)。悬停:右:盒子放置在当前盒子行的末尾(右侧)。
- 绝对定位:如果元素的
位置为绝对或固定 ,该元素是绝对定位的。、- 通过绝对定位,盒子完全从流中移除,不再与其有任何连接。 ? 包含块)
结论
本文主要介绍
CSS的新旧逻辑属性的现状以及盒模型的具体情况。文章中还有一些内容没有介绍太多,比如blockformattingcontext(块格式化上下文)和inlineformattingcontext(内联格式化上下文)以及其他一些具体名称。后续文章会介绍,届时会进行详细说明。希望大家多多关注我的【Hello CSS】系列。一开始我问了大家一个问题,即:
为什么
Flex box和Grid box是基于 开始
end是排列规则,而不是常规的top,right,bottom 与左?通过分享这篇文章你能回答这个问题吗?
作者:陈大鱼头
来源:掘金 - 通过绝对定位,盒子完全从流中移除,不再与其有任何连接。 ? 包含块)
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网