Code前端首页关于Code前端联系我们

新旧CSS逻辑属性和盒子模型对比

terry 2年前 (2023-09-27) 阅读数 68 #数据结构与算法

为什么Flex boxGrid box是基于start 、结束 是排列规则,而不是常规的 toprightbottom 后接

先别急着往下看,先想想。

这个问题,鱼头将在文章中给出答案。欢迎您继续阅读这个问题。如果你已经知道答案,你还可以看看它与你知道的答案是否一致。

CSS 逻辑属性

2017 年 5 月 18 日,W3C CSS 工作组发布了 CSS 逻辑属性和值第一个工作草案​​​​​Level 1(第一个公共工作草案)。在不同的书写模式下,可以提取一般的抽象概念(例如起始位置或行)。这些逻辑抽象概念需要在不同的书写方式下映射到左、右、上、下等物理概念。某些 CSS 布局可能依赖于这些常见的逻辑概念。这个CSS模块提供了逻辑属性和值来以逻辑方式管理布局(而不是基于物理坐标、书写方向、尺寸分配等)。该模块源自与逻辑属性和值相关的 CSS21 函数。

以上是W3C中国的内容复制粘贴的。

对于前面,我们习惯使用顶部底部 , 定义我们的 HTML元素,这符合我们的物理概念。但对于CSS这种原本用于图形和文本渲染的语言来说,实际上是不匹配的。为什么这么说?

写入模式

写入模式:定义文本的水平或垂直排列以及文本在块级元素中移动的方向。

写入模式以下HTML文本写入规则的值总共有5个变化(有几个也用于SVG) ,这是可能发生的本文不讨论):

写入模式:horizo​​ntal-tb;

写入模式:horizo​​ntal-tb定义内容从左到右水平流动,从上到下垂直流动。下一条水平线位于上一条水平线的下方。

写入模式:vertical-rl;

写入模式:vertical-rl定义内容从上到下垂直流动,从右到左水平流动。下一条垂直线位于上一条垂直线的左侧。

写入模式:vertical-lr;

写入模式:vertical-lr定义内容从上到下垂直流动,从左到右水平流动。下一条垂直线位于上一条垂直线的右侧。

书写模式:sideways-rl; (仅限 Firefox41+)

书写模式:sideways-rl 定义从上到下垂直流动的内容,所有字形,甚至垂直脚本中的字形,都放置在右侧。

书写模式:side-lr; (仅 Firefox41+ 实现)

书写模式:sideways-lr内容从上到下垂直流动,所有字形,即使是垂直脚本的字形,都放置在左侧。

如上效果请参见DEMO

源码如下:

.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>
复制代码

图标如下:

CSS新旧逻辑属性对比与盒子模型如上图所示,当我们设置 padding-right 时: 100px;,这是不同的。书写规则和显示效果不同。

一开始,HTMLCSS仅服务于英语国家。然而,随着互联网的发展,不同书写规则的国家逐渐流行起来。

我们原创的CSS逻辑属性是按照上、右、下、左物理逻辑来划分的。

那么当你按照这个规则改变文本属性时,就会出现上述不符合语法规则的状态。

可能正是因为这个原因,W3C 发布了新的逻辑属性和值。

新旧逻辑属性对比

CSS新旧逻辑属性是两种完全不同的模型。 ?逻辑属性

新逻辑属性 margin-topmargin-block-startmargin-rightmargin-inline-endmargin-bottommargin-block -end 左边缘边缘内联开始边框顶部边框块开始边框右边框内联结束边框机器人 Tom 边框块结束左边框边框内联开始填充顶部填充块开始填充右填充内联结束填充底部填充块结束填充左侧填充内联开始宽度内联大小高度 块大小

从上表可以看出,Y轴方向的属性已更改为X轴的属性方向更改为内联

对于不同语系的国家,书写顺序可能会有很大不同,这意味着内联的方向不同。例如:英语国家中的

  • 阿拉伯语中的 padding-inline-start = padding-left
  • padding-inline-start = 填充- 对
  • 在日本padding-inline-start = padding-top

这意味着旧的逻辑属性在某些国家将变得不合理。

CSS 定位

CSS 的定位属性更改如下:

旧逻辑属性 新逻辑属性
topinset-block-start
inset-Block-enderlinksinset-inline-Start
rechtsinset-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新旧逻辑属性对比与盒子模型
CSS新旧逻辑属性对比与盒子模型

CSS float

floatfloat属性也已更改。

旧逻辑属性 新逻辑属性
float:左float:内联开始
float:右float:内联结束

文本对齐 的texttext-align 的属性也已更改。

旧逻辑属性 新逻辑属性
文本对齐:左文本对齐:开始
文本对齐:右文本对齐:结束

方向 除了写入模式还有一个排版属性,即方向后接写入模式 G 相似,但不同 书写模式 决定网页的布局方向,而 direction 决定文本对齐的方向。属性如下:

方向:ltr;

默认值会导致文本和其他元素从左到右显示。

方向:rtl;

导致文本和其他元素从右向左显示。

来吧,如果你看到这里的剪纸,赶紧跑开重构它。等有一天这个属性正式启用,那就真的GG了。但我认为需要有一个属性来选择性地启用物理属性或逻辑属性,否则这对前端来说将是一场灾难!

CSS盒模型

基本盒模型(CSS Basic Box Model)

当浏览器显示渲染树时,浏览器的渲染引擎使用 基本盒子模型(CSS基本盒子模型) 将所有元素划分为矩形盒子。这些盒子的外观和属性由 CSS 决定。

如果我们在浏览器控制台中输入以下代码,我们可以看到页面的每个元素都被一个矩形包围。这些是盒子

$$('*').forEach(e => {
  e.style.border = '1px solid';
})
复制代码

,示意图如下:

CSS新旧逻辑属性对比与盒子模型
每个盒子由四部分组成:

Content(内容物)

Box(盒子) 内容该框显示标签内的任何文本、图案或其他内容。

padding

box中的padding是透明的,主要负责增加box内部区域的大小。

Margin(边距)

Box(盒子) 外部区域,设计为透明,负责隔离相邻元素。

border

box的边框负责隔离外边距和内边距。

盒模型的值

盒模型共有三个值:

content-box

content-box是默认的盒模型。盒子的宽度高度仅包括盒子的宽度和盒子自己。 高度

属性。

计算规则:

width = width

height = height

border-box

border-box是盒模型的可选特性之一。盒子的宽度高度包括内容物垫叮跟随边缘。这也是文档处于 Quirks 模式时 Internet Explorer 使用的盒模型。

计算规则:

width = width + border + padding

height = height + border + padding

padding-box

padding-box为非标准属性。 在 Firefox 中实现,但在 Firefox 50 中被删除。 padding-boxwidthheight 属性包括内容和填充,但不包括边框和边距。

插图:

CSS新旧逻辑属性对比与盒子模型 我要在这里投诉。我不知道为什么没有边距框。虽然意义不大,但如果真正实施的话,效果很可能会很奇怪。但作为一名晚期强迫症患者,却缺少一个特征。我感觉很不舒服。

视觉样式表

CSS 视觉样式表 基于 基本盒模型 (CSS)(基本盒模型) 实际算法将文档中的元素一一转换成盒子。

官方的说法是:它指定了客户端如何处理媒体中的文档树(Document Tree)。

每个盒子的布局由以下因素决定:

  • 盒子的尺寸
  • 盒子的类型: 内联盒子(内联) 内联水平仪盒(内联级别) 原子内联级别框(原子内联级别) 块框
  • 定位: 正常当前 、 ​​ 浮动、 绝对定位
  • 子元素同级元素
  • the文档树中当前框的视口 大小 位置
  • 框中图像的大小
  • 其他一些外部因素

视觉样式表的计算一切都取决于矩形的边界。该矩形称为 ,包含块 。一般来说,(一个元素)生成的盒子将扮演其子元素的包含块的角色;我们说:(元素的)盒子是用其子节点的块构建的。包含块是一个相对的概念。

示例如下:

<div>
    <table>
        <tr>
            <td>hi</td>
        </tr>
    </table>
</div>
复制代码

以上述代码为例:divtable都包含块。 divtable的包含块,而table又是的包含块td

不是绝对的。

插图:(图片来自 w3help):

CSS新旧逻辑属性对比与盒子模型

Box 生成

Box 生成是 CSS 视觉样式表 的一部分,用于从文档元素生成框架。框的类型取决于 CSS 外观 属性。

  • 块级元素
    • 如果元素的视图list -ite m 当或表时,它是一个块 水平元件。
  • 块级框
    • 块级框用于描述块与其父元素和姐妹元素之间的关系。
    • 每个块级框将参与创建块格式化上下文
    • 每个块级元素至少生成一个块级框,即: 块级主框(块级主框)
    • 块级主框包含生成的框和内容由后代,也将参与定位计划。
    • 块级盒子,同时也是块容器盒子,称为块盒子(块盒子)
  • 匿名框在某些需要可视化格式的情况下,需要添加一些额外的框。这些框无法使用 CSS 选择器(即所有可继承的 CSS 属性)进行选择。这些值都是 inherit,所有不可继承的 CSS 属性都是 initial 。这就是为什么这些被称为**匿名盒子**。
  • 行内元素
    • 当元素行内显示时,行内 - block 当inline-table时,这个是内联级别元素。
    • 可以与其他内联内容一起显示为多行。
  • 内联框
    • 内联级别元素生成内联级别框,这些框还将参与创建内联标记上下文
  • 匿名内联框
    • 与块框一样,CSS引擎有时会自动创建一些内联框。这些内联框无法由选择器选择,因此是匿名的。它们从父元素继承可继承的属性,并将其他属性保留为默认值initial
  • 行框
    • 行框由内联格式化上下文创建,用于显示一行文本。在块框内,行框始终从块框的一侧延伸到另一侧。如果有浮动元素,则行框从左浮动元素的右边缘延伸到右浮动元素的左边缘。
  • run-in box(在CSS 2.1标准中被删除)
    • run-in box可以通过display: run-in来设置,它可以是块盒子或行内盒子,取决于随后的盒子类型。
  • 定位规则

    一旦盒子形成,CSS 引擎必须定位它们以完成布局。

    定位规则如下:

    • 正常流程
      • 正常流程中,盒子是连续放置的。
      • 块布局上下文 中,框一个接一个地垂直排列。
      • 内联格式化上下文中,框水平排列。
    • 浮动:当盒子的浮动不是不是位置时 是 静态相对 ,盒子悬浮放置。
      • 悬停:左:盒子放置在当前行盒子的起始位置(左侧)。
      • 悬停:右:盒子放置在当前盒子行的末尾(右侧)。
    • 绝对定位:如果元素的位置绝对固定 ,该元素是绝对定位的。
      • 通过绝对定位,盒子完全从流中移除,不再与其有任何连接。 ? 包含块)

        结论

        本文主要介绍CSS的新旧逻辑属性的现状以及盒模型的具体情况。文章中还有一些内容没有介绍太多,比如blockformattingcontext(块格式化上下文)inlineformattingcontext(内联格式化上下文)以及其他一些具体名称。后续文章会介绍,届时会进行详细说明。希望大家多多关注我的【Hello CSS】系列

        一开始我问了大家一个问题,即:

        为什么Flex boxGrid box是基于 开始

      end是排列规则,而不是常规的toprightbottom 与

      通过分享这篇文章你能回答这个问题吗?

      作者:陈大鱼头
      来源:掘金

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门