CSS的逻辑属性对盒模型带来的变化

栏目: CSS · 发布时间: 5年前

内容简介:在《为什么这么说呢?来举个例子。假设你的网站上的内容是从右到左(

在《 理解CSS的逻辑属性和值 》一文中,我们对 CSS逻辑属性和值(CSS Logical Properties and Values Level 1) 有所了解。事实上对于广大前端开发者而言,自从Web诞生以来,就习惯了使用用物理CSS属性。比如上、右、下和左,映射到 CSS的盒模型 就是 marginpaddingbordertoprightbottomleft 设置元素。但随着CSS的 书写模式特性 的出现, 的概念在某种程度上已经失去了其意义。

为什么这么说呢?来举个例子。

假设你的网站上的内容是从右到左( dir:rtl )排列(比如说一个阿拉伯语种的网站),此时你的左边可能是物理上的右边。因此,如果你使用 margin-left: 100px 来设置在间距,就需要使用 margin-right: 100px 来替代,否则出现的效果刚好是你意想的相反。

CSS的逻辑属性对盒模型带来的变化

但有的时候你的网站可能是既有从左到右( ltr )和从右到左( rtl )混合排版的内容,那么就需要根据不同的情况设置 *-left*-right 的值。如果你的排版中还混合有垂直排版的模式,那么问题就会变得更为复杂,因为内容是物理的顶部或底部。

CSS的逻辑属性规范 的出现将从此改变这一现状,它定义了一组逻辑(而不是物理)属性和值,主要用来防止上述提到的相关问题。因此,当你想设置内容的方向和书写模式无关的话,可以采用 margin-left:100px 这样的方式,反之你就可以使用逻辑属性 margin-inline-start: 100px ,这样可以让整个排版变得更为智能。《 理解CSS的逻辑属性和值 》一文中就详细的介绍了这方面的特性和应用( 你可以阅读@Rachel Andrew写的原文 )。比如下图所示的一个效果:

CSS的逻辑属性对盒模型带来的变化

文章开头也提到过,广大的前端开发者,大部分情况下只熟悉物理属性,而对逻辑属性相关的并不太清楚。这也引发了一个新问题。逻辑属性的出现,对于我们已经熟悉的CSS的盒模型又有何不同呢?或者说, CSS逻辑属性的出现,对CSS的盒模型又将带来什么样的变化呢 ?这也就是我们今天需要了解和深入探究的。如果你感兴趣的话,欢迎继续往下阅读。

回忆CSS的盒模型

既然我们要聊CSS的盒模型,那么我们就很有必要的先快速的回忆CSS中盒模型相关的概念和特性。

CSS规范中把盒模型单独的列为一个模块来进行维护,现在已经进入到了Level 3的时代( CSS Box Model Module Level 3 )。

CSS合模型是一组规则的集合。主要用于确定Web页面中每个元素的尺寸。

CSS中的每个元素都可以比作是一个盒子(Box)。

既然元素是一个盒子,那么我们就可以通过CSS属性( 物理属性 )来决定盒子的大小。而决定盒子的尺寸大小主要由四个属性来决定:

  • Content :元素中的文本、图像或其他媒体内容
  • padding :盒子内容和边框之间的空间
  • border :盒子的边框
  • margin :盒子与其他盒子之间的距离

如果我们用一张图来描述的话,可以类似下面这样的:

CSS的逻辑属性对盒模型带来的变化

总之,上面提到的几个属性就是浏览器渲染元素盒子所需要的一切。内容是你在HTML中编写的内容,其余部分纯粹是展示性的,主要由CSS规则来决定的。而且对于CSSer来说,都喜欢用下图来阐述元素的盒模型:

CSS的逻辑属性对盒模型带来的变化

而在浏览器调试器中“Computed”可以看到它是怎么来解释一个元素的盒模型:

CSS的逻辑属性对盒模型带来的变化

拿个简单的示例来展示:

.box {
    width: 200px;
    height: 200px;
    background-color: darkviolet;
    border: 5px solid hotpink;
    padding: 25px;
    margin: 20px;
}

.box 对应的盒子如下图所示:

CSS的逻辑属性对盒模型带来的变化

上面聊到的是我们最早接触到的CSS盒模型,自从 CSS Intrinsic & Extrinsic Sizing Module Level 3规范 的出现, 其中的 box-sizing 属性 可以帮助我们更好的控制盒子的大小:

CSS的逻辑属性对盒模型带来的变化

用个实例来解释,下图可以更为明了:

CSS的逻辑属性对盒模型带来的变化

有关于盒模型更多的内容可以阅读下面的相关资料:

CSS逻辑属性对盒模型带来新的思考

正如上面所述,前端开发者讨论盒模型的时候,都习惯使用下图来阐述它:

CSS的逻辑属性对盒模型带来的变化

不管是以前,还是现在,以上图来阐述CSS盒模型的概念都不存在任何的错误。不同的是,上图我们围绕的还是以物理特性来进行阐述,但随着CSS的逻辑属性的出现,或许这也是最后一天来来阐述盒模型。或许哪一天面试官问你如何阐述盒模型时,要是你再使用上图来进行阐述的话,可能就要开始丢分了。因为逻辑属性的介入,我们应该开始停止物理物性 *-top*-right*-bottom*-left 来阐述,而应该改用 *-inline-start*-inline-end*-block-start*-block-end 来重新定义盒模型。用图来阐述的话,应该类似下图这样:

CSS的逻辑属性对盒模型带来的变化

在了解上图每个属性的具体含义之前,我们有几个概念需要先做一个简单的了解。

首先,让我们了解Web页面的两个方向(两个轴)。您应该记住,页面上有两个垂直的轴( x 轴和 y 轴),页面上的内容沿着他们进行排版。其中一个轴是内联轴,它是每行文本动行的轴。默认情况下,在Web页面上,如果不指定任何书写模式,内联轴是水平的,从左到右(书写模式对其会有一定的影响,后续会提到)。另一个轴是块轴,块轴是沿着这个轴堆积。同样,默认情况下,这个轴是垂直的,从上到下。如下图所示:

CSS的逻辑属性对盒模型带来的变化

  • 内联轴(Inline axis) :拿英文网站为例。阅读方向是从左到右。好比多个内联元素一样,从左向右一次排开,也类似于在块元素中使用 display:inline 。每一项都出现在同一行
  • 块轴(Block axis) :大家应该都知道,对于块元素不做任何的处理的话,他的排列顺序是将从上到下依次堆积在一起。好比对内联元素采用了 display:block

其实这两个概念理解起来比较费劲。大家是否记得在Flexbox布局中,我们有一个主轴和侧轴一说,如下图所示:

CSS的逻辑属性对盒模型带来的变化

在书写模式默认情况之下,我们的内联轴好比主轴,而块轴好比侧轴。事实上,这两个概念如果我们运用到网格布局中来就更易于理解。因为在网格布局中,我们总是使用块和内联轴,所以下面的示例都将使用网格来写案例。

块维度对应于在页面上布局块的顺序。比如你页面中的文本内容,每一段都在另一段下面排列,这些排列的方向是块的维度,所以在网格布局中,这是块轴(Block Axis)。在CSS网格布局中,块轴也称为行轴,这就是为什么块轴属性是 grid-row-startgrid-row-end

CSS的逻辑属性对盒模型带来的变化

因此,内联轴将会穿过块轴,沿着词在句子中的方向分布。在英文语句中,这个轴从左到右。在网格布局中,内联轴属性是 grid-column-startgrid-column-end

CSS的逻辑属性对盒模型带来的变化

前面也提到过了,内联轴和块轴和书写模式有较大的关联,书写模式不同时,内联内和块轴会随之改变。还是拿网格中的布局来举例:

CSS的逻辑属性对盒模型带来的变化

这两个概念除了在逻辑属性中很有作用,在 CSS Box Alignment Module Level 3 也有很大的作用。比如在Grid和Flexbox布局中,元素的对齐方面就很有意义:

CSS的逻辑属性对盒模型带来的变化

回到逻辑属性中。对于内联轴中的 padding-inline-start 在不同的语言中对应的 padding 方向是不一样的,比如:

padding-inline-start = padding-left
padding-inline-start = padding-right
padding-inline-start = padding-top

而在块轴中 padding-block-start 对于的 padding 也会有不同,比如:

padding-block-start = padding-top
padding-block-start = padding-right

如此一来,根据不同的语种,盒模型中的 marginborderpadding 对于的内联轴和块轴也不一样。拿英文网站来说:

margin

margin-block-start = margin-top
margin-block-end = margin-bottom
margin-inline-start = margin-left
margin-inline-end = margin-right

padding

padding-block-start = padding-top
padding-block-end = padding-bottom
padding-inline-start = padding-left
padding-inline-end = padding-right

border

border-block-start = border-top
border-block-end = border-bottom
border-inline-start = border-left
border-inline-end = border-right

逻辑尺寸

从前面的图可以看出,平时大家熟悉的 widthheight 也将被 inline-sizeblock-size 取替。

一旦我们理解了内联和块轴的概念,就更容易理解逻辑尺寸。比如在英文网站中, inline-size 替换了 widthblock-size 将替换 height

简单地说:

  • block-size :定义一个元素块的水平或垂直方向的尺寸,这主要取决于它的书写模式。如果书写模式是垂直方向的,则 block-size 与元素的 width 有关,否则,它与元素的 height 有关。
  • inline-size :定义一个元素的块的水平或垂直尺寸,这取决于它的书写模式。其对应于任一 widthheight 属性,这取决于的值 writing-mode 。如果写作模式是垂直定向的,则 inline-size 与元素的 height 有关;否则,则与元素的 width 有关。

比如英文或阿拉伯语网站:

width = inline-size
height = block-size

而在日文网站中:

height = inline-size
width = block-size

在我们的理解中,除了 widthheight 之外,还有 min-widthmax-widthmin-heightmax-height 一说。那么在 inline-sizeblock-size 中同样存在,相应的也是在其前面添加 minmax 。比如: min-inline-size: 100pxmax-block-size: 100px

如果将CSS逻辑属性引入进来,我们的盒模型的说法就变了。下图是以前的盒模型和新的盒模型的对比:

CSS的逻辑属性对盒模型带来的变化

既然盒模型变了,那么我们以前的很多东西都将会带来变化,比如我们以前的 position 属性,是通过 toprightbottomleft 来控制一个定位元素的位置。在逻辑属性中,我们将依次使用 inset-block-startinset-inline-endinset-block-endinset-inline-start 替代(当然和书写模式也是有很大关联的,这里默认是水平书写模式 ltr )。

CSS的逻辑属性对盒模型带来的变化

上图对应的是我们平时最为常见的书写模式,比如英文网站的 ltr 书写模式。

那我们写 position 的时候可能就会由下面这种方式转换为另一种方式

/* 老的方式 */
.popup{
    position:fixed;  
    top:130px;
    bottom:130px;
    left:130px;
    right:130px;
}
/* 新的方式 */
.popup{
    position:fixed;
    inset-block-start:130px;  /* top */
    inset-block-end:130px;    /* bottom */
    inset-inline-start:130px; /* left */
    inset-inline-end:130px;   /* right */
}

对于 inset-* 相关的属性也可以像 border 这样的属性一样简写:

.popup{
    position:fixed;
    inset:130px 130px 130px 130px;   /* top, right, bottom, left */
}

CSS的逻辑属性对盒模型带来的变化

大家可能也应该会想到,在CSS中还有一些和方向属性有关,比如 floattext-alignresize 等。那么引入CSS逻辑属性之后,这些也将都会得到相应的变化:

float

float: left = float: inline-start
float: right = float: inline-end

text-algin

text-align: left = text-align: start
text-align: right = text-align: end

resize

resize: horizontal = resize: inline
resize: vertical = resize: block

注意,上述列的都是书写模式为 ltr 的方式。如果书写模式做出相应的变化,那么最终的值也将会做出相应变化。

总结

起初,CSS的逻辑属性似乎给我们的工作带来更多的麻烦和复杂度,但事实上它们却很容易,使用也简单。在写样式的时候,不需要担心跨语言的问题。我们只需要使用CSS的逻辑属性,就可以更轻易的匹配到相应的语言网站中。而不会像物理属性一样,针对不同的语言网站需要做出相应的调整。好比阿拉伯语网站,距左的距离反而要用 margin-right 来设置。

当然,CSS的逻辑属性的出现,也让开发者面临新的问题。比如: margin: 10px 20px 30px 40px ,开发者将无法预测它将如何被渲染。如果是英文网站,这些物理属性将会正常被解释为 margin-top: 10pxmargin-right: 20pxmargin-bottom:; 30pxmargin-left: 40px 。但如查网站使用的是新的逻辑属性,其值应该对应的是 margin-block-start: 10pxmargin-inline-end: 20pxmargin-block-end: 30pxmargin-inline-start: 40px 。从前面的的内容中我们可以了解到,在英文网站中如果书写模式是默认的 ltr ,那么我们以前所掌握的物理属性和逻辑属性是相同的。然而,在其他语言中,比如阿拉伯语或者日语网站中,当我们写简写的物性属性,比如 margin ,那么实际渲染出来的效果就需要根据书写模式来定了。反之,如果我们不使用物理属性,直接使用逻辑属性,就不会有这么的痛苦的事情,也不需要去担心渲染出来的结果和我们意想的不一样。


以上所述就是小编给大家介绍的《CSS的逻辑属性对盒模型带来的变化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的自我修养

程序员的自我修养

陈逸鹤 / 清华大学出版社 / 2017-5 / 49.00

程序员作为一个职业、也作为一个群体,正逐渐从幕后走向前台,并以他们自己的能力加速改变着世界,也改变着人们生活的方方面面。然而,对于程序员,特别是年轻程序员们来说,如何理解自己的职业与发展,如何看待自己的工作与生活,这些问题往往比那些摆在面前的技术难题更让他们难以解答。 这本书从一个成熟程序员、一名IT管理者的角度,以杂记的形式为大家分享关于国内程序员职业生涯、个人发展、编程中的实践与认知乃至......一起来看看 《程序员的自我修养》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试