CSS 逻辑属性和值

Avatar of Ollie Williams
Ollie Williams 发布

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费额度!

现在跨浏览器支持已达到临界点,是时候了解一下逻辑属性和值了。如果您正在创建多种语言的网站,逻辑属性和值非常有用。即使您没有,也有一些方便的新速记值得了解。

例如,我记不清有多少次我写过这段代码来居中某个元素

.thing {
  margin-left: auto;
  margin-right: auto;
}

我们可以使用类似 margin: 0 auto; 的方法将其写成一行代码,但这样上下边距也会被包含进来。相反,我们可以使用 margin-inline 逻辑属性仅选择左右边距。

开始将事物视为“内联”或“块级”

最后一个演示非常棒,对吧?margin-inline 属性同时设置了 margin-leftmargin-right。类似地,margin-block 属性同时设置了 margin-topmargin-bottom。而且我们不仅仅是在谈论边距。逻辑属性具有类似的速记来设置 borderpadding。因此,如果您有一个视觉设计要求仅在侧面设置边框,则可以使用 border-inline,而不是单独处理每个物理方向。

Showing border-left and border-right with matching values combined together as border-inline as a single declaration, and another example showing padding-top and padding-bottoms et to 32 pixels combined to padding-block set to 32 pixels.
与其用物理术语(如左和右)思考,不如将事物视为“内联”方向和“块级”方向。

因此,随着我们继续前进,我们现在知道我们正在处理内联和块级方向,而不是物理方向。内联处理左右方向,而块级管理上下方向。

也就是说,直到书写模式改变时,情况才会发生改变。

注意方向和书写模式

我们到目前为止看到的都是 CSS 逻辑属性的示例。这些是 CSS 属性的版本,例如 marginpadding,但以一种新的方式编写,避免了物理方向(即左、右、上、下)。

CSS 的开发是考虑到英语语言的,英语是从左到右书写和阅读。但并非所有语言都是如此。例如,阿拉伯语是从右到左阅读。这就是 HTML 具有 dir 属性的原因。

<html dir="rtl">

CSS 有一个等效的属性(尽管建议使用 HTML 属性以防 CSS 无法加载)

.foreign-language { direction: rtl; }
Two cards, one in english and one in arabic, Both cards have a subtitle in gray above a main heading in a larger black font. The english goes from left to right and indicates the direction with an arrow below the card. The arabic direction is reverse of the english.
鸣谢:Ahmad Shadeed

中文、日文、韩文和蒙文可以从左到右水平书写,也可以从上到下垂直书写。这些语言中的大多数网站都是水平书写的,与英语相同。

相比之下,垂直书写方式在日语网站上更为常见。有些网站同时使用垂直和水平文本。

baroku.co.jp

垂直书写时,中文、日文和韩文以右上角为起点,而蒙古文则从左到右阅读。这正是 CSS 中存在 writing-mode 属性的原因,该属性包含以下值

  • horizontal-tb:这是默认值,将英语或法语等语言的方向设置为从左到右,将阿拉伯语等从右到左的语言的方向设置为从右到左。tb 代表“从上到下”。
  • vertical-rl:这将中文、日文和韩文等语言的方向更改为垂直方向的从右到左。
  • vertical-lr:这用于蒙古语等垂直方向的从左到右的语言。

CSS 逻辑属性提供了一种编写上下文相关的 CSS 的方法。使用逻辑属性时,间距和布局取决于 writing-mode 和方向(无论由 CSS 还是 HTML 设置)。因此,可以在不同的语言之间重用 CSS 样式。例如,BBC 新闻在其 10 多种语言中重建了他们的网站。这比让用户依赖自动翻译提供了更好的体验。这也意味着他们可以更好地为世界不同地区提供特定内容。但是,视觉样式在不同地区之间基本保持相同。

Screenshot of the BBC website. The header is red with the BBC logo aligned to the right of the screen. The navigation is also in red and aligned to the right. There is a featured article with right-aligned text and a large image to the right of it. Below that are four more article cards in a single row, each with an image above a title and date and aligned right.
bbc.com/arabic

让我们看下面的示例,了解物理属性的不足之处。使用物理 margin-left 属性(以红色显示),在英文中一切看起来都很好。如果您要重用 CSS 但将书写模式更改为 rtl(底部显示),则文本和图标之间没有空格,并且文本左侧有额外的空白。我们可以通过使用逻辑属性来避免这种情况。

Two buttons, both with an envelope icon and a label. The left-to-right version of the button on top shows the spacing between the icon and the label. The right-to-left version shows the spacing to the left of both the label and icon.

逻辑属性和值之所以如此有用,是因为它们会自动适应语言的上下文。在像英语这样的从左到右的语言中,margin-inline-start 将设置左侧边距。对于像阿拉伯语、乌尔都语或希伯来语这样的从右到左的语言,它将设置右侧边距——这 解决了上述示例中的布局问题。从右到左的问题解决了。如果您有垂直文本,margin-inline-start 也会适应该上下文,在顶部添加边距,这是您在任何垂直语言中开始阅读的位置(这就是它被称为 margin-inline-start 的原因——只需考虑您从哪个方向开始阅读)。inline 的方向根据元素的 writing-mode 更改。当设置垂直 writing-mode 时,它处理垂直方向的上下。看到事情是如何发生变化的吗?

蒙古语书写方向的一个示例。(鸣谢:W3C

逻辑属性和值的完整列表

有几十个 CSS 属性具有逻辑替代语法。Adrian Roselli 创建了一个方便的可视化工具,您可以在我们常用的物理 CSS 属性及其逻辑属性等效项之间切换。这是一种很好地可视化逻辑属性及其在方向为 ltrwriting-modehorizontal-tb 时映射到的物理属性的方式。

让我们更进一步地分解这些内容,并将每个物理 CSS 属性与其逻辑对应项并排映射。本文中显示的表格在左侧列显示传统的物理 CSS,在右侧列显示其逻辑等效项(使用从左到右的水平映射)。但是请记住,逻辑属性的全部意义在于它们会根据上下文发生变化!

大小

在水平书写模式下,inline-size 设置元素的宽度,而 block-size 设置高度。在垂直书写模式下,情况正好相反:inline-size 设置高度,block-size 设置宽度。

物理属性逻辑属性
widthinline-size
max-widthmax-inline-size
min-widthmin-inline-size
heightblock-size
max-heightmax-block-size
min-heightmin-block-size

用于大小调整的逻辑属性具有 良好的跨浏览器支持

边框

此处的所有内容在现代浏览器中都具有可靠的 跨浏览器支持

物理属性逻辑属性
border-topborder-block-start
border-bottomborder-block-end
border-leftborder-inline-start
border-rightborder-inline-end

以下是用英语、阿拉伯语和中文显示的 border-inline-start 的示例。

以下是一个将 border-block-start 设置为点状,并将 border-block-end 设置为虚线的示例

还有一些逻辑属性可以分别设置边框颜色、宽度和样式

物理属性逻辑属性
border-top-colorborder-block-start-color
border-top-widthborder-block-start-width
border-top-styleborder-block-start-style

因此,再次强调,关键在于用“内联”和“块级”来思考,而不是用物理方向,例如 lefttop。我们还有一些边框的逻辑速记属性

物理属性逻辑属性
border-top 和 border-bottomborder-block
border-left 和 border-rightborder-inline

外边距

以下是所有单独的逻辑margin属性

物理属性逻辑属性
margin-topmargin-block-start
margin-bottommargin-block-end
margin-leftmargin-inline-start
margin-rightmargin-inline-end

这些逻辑属性具有全面的现代跨浏览器支持,包括三星互联网,并且从 Safari 12.2 开始就得到支持。

并且,请记住,我们也有简写形式

物理属性逻辑属性
margin-top 和 margin-bottommargin-block
margin-left 和 margin-rightmargin-inline

填充

填充与外边距非常相似。将margin替换为padding,我们就得到了相同的属性列表。

物理属性逻辑属性
padding-toppadding-block-start
padding-bottompadding-block-end
padding-leftpadding-inline-start
padding-rightpadding-inline-end
padding-top 和 padding-bottompadding-block
padding-left 和 padding-rightpadding-inline

与外边距一样,填充的逻辑属性也具有良好的跨浏览器支持

定位

需要在特定方向上偏移元素的位置?我们也可以以逻辑方式声明这些位置。

物理属性逻辑属性
topinset-block-start
bottominset-block-end
leftinset-inline-start
rightinset-inline-end
topbottominset-block
leftrightinset-inline

在水平书写模式(从左到右或从右到左)中,inset-block-start 等效于设置 top,而 inset-block-end 等效于设置 bottom。在水平书写模式下,从左到右的方向,inset-inline-start 等效于 left,而 inset-inline-end 等效于 right,反之亦然,适用于从右到左的语言。

相反,对于垂直书写模式,inset-inline-start 等效于 top,而 inset-inline-end 等效于 bottom。如果 writing-mode 设置为 vertical-rl,则 inset-block-start 等效于 right,而 inset-block-end 等效于 left。如果 writing-mode 设置为 vertical-lr,则情况相反,因此 inset-block-start 等效于 left

逻辑属性书写模式等效于
inset-block-start水平 LTRtop
inset-block-start水平 RTLtop
inset-block-start垂直 LTRleft
inset-block-start垂直 RTLright

以下是如何在四个不同的书写方向中查看相同的绝对定位 CSS 代码的示例

定位的逻辑属性在所有现代浏览器中都受支持,但最近才在 Safari 中推出。

还有一种新的简写形式,可以在一行代码中设置所有四个偏移量。以下是如何使用inset作为简写形式,在一举设置topbottomleftright以创建全屏覆盖层的示例

我听说inset被错误地称为逻辑属性。但是,在 DevTools 中快速查看一下就会发现,它实际上是物理的简写形式,而不是逻辑属性

它实际上是在定义物理偏移量(即左、右、上和下),而不是逻辑偏移量(即内联、块、开始和结束)。显然,如果您希望为所有四面设置相同的值,如上例所示,则无关紧要。

inset: 10px 20px 5px 8px; /* shorthand for physical properties not logical properties  */

文本对齐

文本对齐的逻辑值拥有良好的浏览器支持,并且已经存在多年。在使用英语时,text-align: starttext-align: left相同,而text-align: endtext-align: right相同。如果您将dir属性设置为rtl,则它们会切换,text-align: start将文本对齐到右侧。

物理值书写模式等效于
startLTRleft
startRTLright
endLTRright
endRTLleft

圆角

到目前为止,我们所查看的所有内容都具有不错的浏览器支持。但是,还有一些其他逻辑属性的支持仍在开发中,圆角就是其中之一。换句话说,我们可以使用逻辑属性为元素的不同角设置不同的border-radius值,但浏览器支持并不理想。

物理属性逻辑属性
border-top-left-radiusborder-start-start-radius
border-top-right-radiusborder-start-end-radius
border-bottom-left-radiusborder-end-start-radius
border-bottom-right-radiusborder-end-end-radius

值得注意的是,规范不包括简写属性,如border-start-radiusborder-end-radius。但是,就像我说的,我们现在还处于早期阶段,所以这可能是一个值得关注的领域。

浮动

在撰写本文时,逻辑浮动的流相关值具有糟糕的浏览器支持。只有 Firefox 支持inline-startinline-end作为float值。

物理值逻辑值
float: leftfloat: inline-start
float: rightfloat: inline-end
clear: leftclear: inline-start
clear: rightclear: inline-end

其他逻辑属性

已提出用于overflowresize的逻辑属性,但它们当前的浏览器支持非常糟糕。

物理逻辑
resize: verticalresize: block
resize: horizontalresize: inline
overflow-yoverflow-block
overflow-xoverflow-inline

深入了解

我们探讨了将属性视为“逻辑”属性的含义,然后将所有新的逻辑属性和值映射到它们的物理对应项。这很棒!但是,如果您想更深入地了解 CSS 逻辑属性和值,则有一些值得查看的资源。

  • “RTL 样式 101”(Ahmad Shadeed):如果您正在处理阿拉伯语或其他从右到左的语言,这是一个很棒的资源。Ahmad 涵盖了所有内容,从逻辑属性到使用特定布局技术(如 flexbox 和网格)时的注意事项。
  • text-combine-upright(CSS-Tricks):如果您正在处理垂直文本,您是否知道此属性可以旋转文本并将多个字符挤压到单个字符的空间中?在某些情况下,一些字符需要放在一起但仍然与垂直书写模式一起流动,这是一个很好的改进。

如果您想查看网络上一些不错的垂直排版实际示例,请查看水平和垂直书写网络奖项。里面有很多很棒的东西。

总结

您是否需要急于将所有物理属性从您的代码库中替换掉?不用。但这也不妨开始在您的工作中使用逻辑属性和值。正如我们所看到的,浏览器支持已经到位了。即使您正在处理一个仅使用英语的网站,也没有理由使用它们。