• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何使用 CSS 逻辑属性来控制布局

css 逻辑属性定义了一种使用布局的新方法。他们的主要目标是帮助开发人员支持不同的书写系统,例如从右到左 (RTL) 和垂直显示的脚本。这些新特性使得通过逻辑而不是物理属性来控制布局成为可能。例如,使用逻辑属性,您可能会描述元素的start与end,而不是元素的left与right边界。看到不同?

即使您不使用非 LTR 语言和多向网站,也值得熟悉新规范。逻辑属性将有助于建立使用 CSS 创建更灵活布局的新理念。

浏览器支持

由于 浏览器支持仍有很大的改进空间,逻辑属性还没有准备好生产。但是,较新版本的 Firefox、chromesafari 已经支持它们,因此您当然可以开始测试。 

旧版本的 Firefox、Chrome 和 Safari 也提供了带有-moz-和-webkit-前缀的部分支持。目前,Internet Explorer 和 Edge 根本不支持该功能。

如何使用 CSS 逻辑属性来控制布局  第1张

CSS中的内容方向

英语是用从左到右 (LTR) 和从上到下 (tb) 的水平文字(拉丁文字)书写的。然而,并不是所有的语言都是这样的。有许多使用从右到左 (RTL) 脚本的语言示例,例如阿拉伯语和希伯来语,以及其他可以垂直显示的示例,例如日语、中文和蒙古语。

“语言没有方向。脚本有一个写作方向,因此以特定脚本编写的语言将按照该脚本的方向编写。” – W3C

direction在 CSS 中,您可以使用和writing-mode属性在页面上设置内容方向。

1.写作模式

该 writing-mode 属性定义块内容(例如段落)在屏幕上的流动方式。它可以取三个值:

  1. horizontal-tb(默认):水平内容,从上到下;

  2. vertical-lr:垂直内容,从左到右;

  3. vertical-rl:垂直内容,从右到左。

2.方向

该direction属性定义内联内容(例如段落中的字符)如何在屏幕上流动。它可以取两个值:

  1. ltr(默认):从左到右

  2. rtl: 右到左

CSS 逻辑属性自动将布局映射到使用 direction 和 writing-mode 属性设置的内容方向。

一种新的布局方法

1. 弹性盒

逻辑布局的新方法始于 flexbox 规范。Flexbox 不考虑物理尺寸,例如左、右、上和下。它使用 和 之类的值flex-start , flex-end这些值依赖于主轴和交叉轴的方向。 

弹性项目是水平流动还是垂直流动还取决于您可以使用该flex-direction属性定义的两个轴的位置。总而言之,像“开始”和“结束”这样的概念在 flexbox 中是完全相关的,可以很容易地翻转。

2.CSS网格

CSS Grid 遵循相同的逻辑。CSS Grid也不知道左、右、上和下。它沿两个非分层轴按行和列布置项目。 

您可以使用属性定义网格项的位置,例如grid-row-start,或使用该grid-template-areas属性命名的网格区域。与 flexbox 类似,CSS Grid 也有逻辑属性而不是物理属性。

3. 逻辑属性

CSS 逻辑属性将这种新方法提升到了一个新的水平。它们改变了我们定义常用属性的方式,例如margin、padding、 width和height。

物理与逻辑维度

上、下、左、右是屏幕的物理尺寸。目前,CSS 将属性映射到这些物理方向。然而,当你有一个 RTL 网站时,你不想从左边开始写。例如,如果要 在文本前添加边距,则需要使用margin-right属性而不是margin-left,您将在 LTR 页面上使用该属性。 

而且,这只是设置一个内容框的边距。如果你想为整个站点添加 RTL 支持,你要么必须重写整个 CSS,要么使用 Sass 或其他 CSS 预处理器执行转换。

逻辑属性改变了这种作案手法。他们使用块和内联尺寸而不是垂直和水平尺寸:

  • 块尺寸是块项目(例如段落)在页面上的布局方式(英文从上到下)。 

  • 内联维度是内联项目(例如段落中的字符)在页面上的布局方式(英文从左到右)。 

以下是英语和其他 LTR/horizontal-tb 语言中逻辑维度映射到物理维度的方式:

逻辑维度物理尺寸(英文) 
块启动最佳
块端底部
内联启动剩下
内联端正确的

如何使用 CSS 逻辑属性来控制布局  第2张

在 RTL/horizontal-tb 脚本(如阿拉伯语)中,逻辑到物理的映射如下所示:

逻辑维度物理尺寸(阿拉伯文字)
块启动最佳
块端底部
内联启动正确的
内联端剩下
如何使用 CSS 逻辑属性来控制布局  第3张

并且,这就是逻辑维度在以tategaki (縦书き)风格编写时如何与像日语这样的垂直 rl 脚本一起使用:

逻辑维度物理尺寸(日语)
块启动正确的
块端剩下
内联启动最佳
内联端底部
如何使用 CSS 逻辑属性来控制布局  第4张

如您所见,CSS 逻辑属性将允许开发人员随心所欲地翻转布局。

CSS 逻辑属性

CSS 逻辑属性目前由1 级规范(编辑草案;提供公开讨论)定义。 

下面,您可以找到最重要的逻辑属性的示例。它们是常用物理属性的逻辑等价物,例如margin和float。如果您对逻辑属性的完整列表感兴趣,也请查看 MDN 的参考指南。

1.文本对齐

您可以 在支持 CSS 逻辑属性的浏览器中将该text-align属性与start和值一起使用。end在显示 LTR 的英语和其他语言中,start等于left; 并end等于right。 

在诸如阿拉伯语之类的 RTL 示例中,它的工作原理相反:start 等于right和end 等于left。

.align-start {

  /* Physical property | English */

  text-align: left;  

   

  /* Logical property */

  text-align: start;

}

.align-end {

/* Physical property | English */

  text-align: right;  

   

  /* Logical property */

  text-align: end;

}

在下面的演示中,您可以测试如果您更改或页面的text-align逻辑属性如何工作 :directionwriting-mode

See the Pen  CSS Logical Properties: text-align by Envato Tuts+ (@tutsplus)  on CodePen.

2. 边距、内边距、边框

您还可以 使用逻辑属性定义margin、padding和。border您需要使用-inline-start后缀来指示内联维度的开始,即left英文和其他 LTR/tb 语言。同样,-inline-end后缀用于内联维度的末尾right,在英语网站上。

-block-start后缀是块维度的开始——英文:top,  -block-end而是块维度的结束——英文:bottom.

.add-border {

  /* Physical properties | English */

  border-left: 0.625rem red solid;

  border-top: 0.625rem blue solid;

  border-right: 0.625rem purple solid;

  border-bottom: 0.625rem green solid;

     

  /* Logical properties */

  border-inline-start: 0.5rem red solid;

  border-block-start: 0.5rem blue solid;

  border-inline-end: 0.5rem purple solid;

  border-block-end: 0.5rem green solid;

}

 

.add-margin {

  /* Physical properties | English */

  margin-left: 0.25rem;

  margin-top: 0.5rem;

  margin-right: 0.75rem;

  margin-bottom: 1rem;

     

  /* Logical properties */

  margin-inline-start: 0.25rem;

  margin-block-start: 0.5rem;

  margin-inline-end: 0.75rem;

  margin-block-end: 1rem;

}

 

.add-padding {

  /* Physical properties | English */

  padding-left: 1.25rem;

  padding-top: 1.5rem;

  padding-right: 1.75rem;

  padding-bottom: 2rem;

     

  /* Logical properties */

  padding-inline-start: 1.25rem;

  padding-block-start: 1.5rem;

  padding-inline-end: 1.75rem;

  padding-block-end: 2rem;

}

下面,您可以测试属于该属性的逻辑属性border。

请注意,您还可以使用普通边框属性的逻辑等价物。例如,border-inline-start-color(而不是border-left-color) 也是一个有效的逻辑属性。

See the Pen  CSS Logical Properties: border by Envato Tuts+ (@tutsplus)  on CodePen.

不过,您可能已经注意到这里缺少一些东西。最有可能的是,您经常使用margin、padding和border速记,而不是诸如padding-top. 逻辑属性如何处理这些速记?目前,他们根本不处理它们。

这些速记的逻辑等价物仍然是一个悬而未决的问题,正在积极讨论中。将来会有解决方案,但是,现在,您需要使用逻辑边距、填充和边框的普通属性。有关更多信息,请查看CSS 工作组的 GitHub 存储库中的Issue 1282 。

3. 浮动

您还可以使用逻辑属性定义浮点数。在 LTR 脚本中,  inline-start等于left和inline-end等于right. 在 RTL 语言中,情况正好相反,因为这里的内联维度从屏幕右侧开始。

.float-inline-start {

  /* Physical property | English */

  float: left;  

   

  /* Logical property */

  float: inline-start;

}

 

.float-inline-end {

  /* Physical property | English */

  float: right;  

   

  /* Logical property */

  float: inline-end;

}

您可以在下面的演示中测试逻辑浮点数:

See the Pen  CSS Logical Properties: float by Envato Tuts+ (@tutsplus)  on CodePen.

4. 宽度和高度

大小调整属性,即width和height,也有它们的逻辑等价物。在自上而下的书写脚本中,inline-size等同于width,因为这是内联元素(例如段落中的字符)在屏幕上流动的维度。并且,block-size等于height,因为这是块元素(例如段落)流动的维度。

在垂直书写脚本中,height是内联尺寸 ( inline-size),因为字符垂直流动,width是块尺寸 ( block-size),因为段落水平流动。

正如您在下面看到的,max-width、max-height、min-width和min-height也有自己的逻辑属性。

.add-dimensions {

   /* Physical property | English */

   width: 600px;

   height: 200px;

   

   /* Logical property */

   inline-size: 600px;

   block-size: 200px;

}

 

.max-dimensions {

   /* Physical property | English */

   max-width: 100%;

   max-height: 300px;

   

   /* Logical property */

   max-inline-size: 100%;

   max-block-size: 300px;

}

 

.min-dimensions {

   /* Physical property | English */

   min-width: 50%;

   min-height: 200px;

   

   /* Logical property */

   min-inline-size: 50%;

   min-block-size: 200px;

}

在下面的演示中,您可以尝试inline-size和block-size属性如何在不同的方向和书写模式下工作:

See the Pen  CSS Logical Properties: width and height by Envato Tuts+ (@tutsplus)  on CodePen.

5.职位

您也可以使用逻辑属性在屏幕上定位元素。逻辑位置替换了物理top、right、bottom和left属性。

块维度的开始(top英文)由inset-block-start逻辑属性定义。同样,内联维度的开始(right英文)由inset-inline-start属性定义。

逻辑位置也有一个很酷的速记属性inset: 

  1. inset-block-start, 

  2. inset-inline-start, 

  3. inset-block-end, 

  4. inset-inline-end 

命令。

.add-position {

   /* Physical properties | English */

   top: 0;

   right: 100px;

   bottom: 200px;

   left: 300px;

    

   

   /* Logical properties | Longhand */

   inset-block-start: 0;

   inset-inline-start: 100px;

   inset-block-end: 200px;

   inset-inline-end: 300px

    

   /* Logical properties | Shorthand */

   inset: 0 100px 200px 300px;

}

inset-block-start下面的演示使用andinset-inline-start属性(英文top和)将 div 粘贴到块轴和内联轴的开头left:

See the Pen  CSS Logical Properties: position by Envato Tuts+ (@tutsplus)  on CodePen.

结论

逻辑属性显然是合乎逻辑且方便的,但要习惯它们并不容易,因为它们需要完全不同的思维方式。毫无疑问,对于需要支持 RTL 和/或垂直语言脚本的开发人员来说,它们将是一个巨大的胜利。 

考虑内联和块尺寸而不是物理方向也会改变我们对布局的看法。让我们希望这种新方法将来也会产生一些有趣的布局和多向网站。


文章目录
  • 浏览器支持
  • CSS中的内容方向
    • 1.写作模式
    • 2.方向
  • 一种新的布局方法
    • 1. 弹性盒
    • 2.CSS网格
    • 3. 逻辑属性
  • 物理与逻辑维度
  • CSS 逻辑属性
    • 1.文本对齐
    • 2. 边距、内边距、边框
    • 3. 浮动
    • 4. 宽度和高度
    • 5.职位
  • 结论