当前位置: 首页 > 科技观察

CSS世界中方向和顺序的规则和演变

时间:2023-03-12 09:43:42 科技观察

在CSS中,我们经常会处理各种方向。比如margin,padding,它们会有margin-left,margin-right或者padding-left,padding-right。positioning中还有left、top、right、bottom,分别代表上、下、左、右的不同方位。另一种情况是从x-position到x-position,比如writing-mode,direction,代表一个序列,表示块流的方向,或者文字书写的方向等,这篇文章就先看看orientation并在CSS世界中排序并探索一些有趣的点。writing-mode&direction&unicode-bidi在CSS的世界里,这三个属性都是和排版顺序相关的,它们相互关联但作用不同。writing-mode:定义块级元素中文本的水平或垂直排列以及文本的行进方向。direction:设置文字排列的方向。rtl表示从右到左(如希伯来语或阿拉伯语),ltr表示从左到右。unicode-bidi:和direction很像,两者经常会一起出现。在现代计算机应用中,最常用的处理双向文本的算法是Unicode双向算法。unicode-bidi属性用于覆盖此算法。光看定义有点乱,简单看几张应用图:writing-mode表示writing-mode基本上只需要关注最常见的horizo??ntal-tb、vertical-lr、vertical-rl。指示文本的行进方向。下图是浏览器完全支持writing-mode时输出的样子:direction表示OK,那direction呢?它指示文本排列的方向。方向:ltr:默认属性。可设置文本和其他元素的默认方向是从左到右。direction:rtl:文本和其他元素的默认方向,可以设置为从右到左。有点乱,所以demo是最直观的。假设,我们有以下结构:

  • 1
  • 2
  • 3
  • 4
  • 这是一段正常顺序的文字

    简单的CSS如下:p,ul{background:#ff00ff50;padding:10px;}ul{display:flex;justify-content:space-between;&>li{border:1pxsolid#333;}}正常的样式如下:我们分别在两组元素的父容器

      中添加direction:ltr和direction:rtl,最终效果如下:可以看到,direction可以改变子元素的排列方向,但是不能改变单段文字(或者内联元素)中每段文字的书写顺序。那么如果,我希望这是一段正常顺序的文字,这段文字不是从左到右写的,而是反过来,从右到左写的,怎么设置呢?unicode-bidi表示这个需要outofunicode-bidi。使用方向:单独使用rtl无法改变单段文本(或内联元素中)的文本从右到左的书写顺序。需要unicode-bidi。CSS中的unicode-bidi属性与方向属性一起决定了如何处理文档中的双向文本。还是上面的代码,我们修改一下:

      Thisisatextinnormalorder

      p{??direction:rtl;unicode-bidi:bidi-override;}结果如下:放在一起比较:here除了unicode-bidi:bidi-override,unicode-bidi:isolate-override也可以达到同样的效果。这里涉及到一个很重要的知识——Unicode双向算法。Unicode双向算法双向文本是指一个字符串包含两种文本,既包括从左到右的文本,也包括从右到左的文本。对于书写习惯,分为:大部分书写习惯是从左到右:如拉丁文(英文字母)和汉字;少数书写是从右到左,如阿拉伯语(ar)和希伯来语通讯(he)。在现代计算机应用中,处理双向文本最常用的算法是Unicode双向算法。一个区域中有一个总体方向,它决定了从该区域的哪一侧开始写文字,通常称为基本方向。浏览器会根据您的默认语言设置默认的基本方向。例如,英语和汉语的基本方向是从左到右,阿拉伯语的基本方向是从右到左。在Web中,我们有3种方式来控制文本方向:html实体——和)标签和dir属性CSS属性direction+unicode-bidi本文介绍了CSS中的direction+unicode-bidi方法控制文本的书写方向。关于UnicodeBidirectionalAlgorithm本身还是很复杂的,本文只是简单提一下,更详细的内容可以参考UNICODEBIDIRECTIONALALGORITHM的一些应用[1]writing-mode&direction&unicode-bidi除了各自的功能,让我们看看他们的一些其他应用场景。使用writing-mode进行创意排版Layoutwriting-mode非常适合一些有创意的排版。一些类似于中国古诗词的基本竖屏显示:

      凉州词

      葡萄酒夜光杯

      我想喝琵琶马上提醒。

      大莫萧,醉沙场,

      古来多少人征战。

    将writing-mode:vertical-rl或writing-mode:vertical-lr添加到.g-wrap以获得不同的效果:.rl{writing-mode:vertical-rl;}.lr{writing-mode:vertical-lr;}CodePenDemo--以writing-mode[2]或类似的方式显示诗歌,使用writing-mode:vertical-rl实现标题竖排,搭配内容组成有趣的报纸布局:

    TitleLoomings

    CallmeIshmael.Someyearsago-nevermindho....

    div{width:750px;padding-left:150px;}h2{position:absolute;writing-mode:vertical-rl;}得到这样一个排版布局:CodePenDemo--writing-modeLayoutDemo[3]改变文字溢出和省略号的位置,使其在头部被省略。我们都知道这篇文章超长,溢出来省略,pass都在文末。像这样:

    MakeCSSEllipsisBeginningofString

    p{??overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}在这里,我们可以使用方向将虚线位置从尾部移动到头部:p{direction:rtl;}结果如下:我尝试在多行省略号中使用,多行省略号的点会出现在最后一行的左侧,不符合要求。CodePenDemo--CSSEllipsisBeginningofString[4]使用writing-mode改变元素的方向。这个小技巧是从张老师的博客中学来的:改变CSS世界的垂直和水平规则的writing-mode属性[5]我们可以使用writing-mode:vertical-rl,将元素转成90°角:
    ?
    div:hover{writing-mode:vertical-rl;}看效果,悬停的时候,把箭头从右移到??改成下🔽:当然,这个功能现在完全可以用transform代替,但是需要兼容IE系列的时候,这是一个有趣的小技巧。CSS中的逻辑属性在下一章中,我们将讨论CSS中的逻辑位置。我们知道,当我们使用像margin和padding这样的东西时,我们可以单独控制每个方向,比如margin-top,padding-left。但是这种由上/左/下/右物理方向维度定义的属性在不同的排版规则下很容易出问题。考虑下面的DEMO,我们想在古诗词的标题顶部添加一个padding值:

    凉州词

    葡萄酒夜光杯,

    如果你想喝琵琶,马上提醒我。

    大莫萧,醉沙场,

    古来多少人征战。

    凉州词

    葡萄酒夜光杯,

    想喝琵琶,马上称呼。

    大莫萧,醉沙场,

    古来多少人征战。

    .pt{padding-top:100px;}.rl{writing-mode:vertical-rl;}可以看到无论writing-mode是什么,padding-top都是指物理方向上方。基于这种不同的排版规则,物理方向可能会造成一些麻烦。CSS在CSSLogicalPropertiesandValuesLevel1[6]规范中引入了CSSLogicalProperties。CSSLogicalPropertiesandValues是CSS的一个新模块,它引入了从逻辑角度而不是物理、方向或维度控制来控制布局的属性和值。还是上面的DEMO,我们可以用padding-block-start代替padding-top。关键点:使用padding-block-start代替padding-top:.pt{-padding-top:100px;+padding-block-start:100px;}.rl{writing-mode:vertical-rl;}看看这次又是效果:padding的位置从物理上变到逻辑上。完整的Demo可以点这里:CodePenDemo--物理方向和逻辑方向的显示[7]Margin,padding,border,relative物理属性到逻辑属性的映射类似这个属性,在规范中有很多定义,简单列出具体的映射规则:物理属性到逻辑属性的margin映射:物理属性到逻辑属性的padding映射:物理属性到逻辑属性的border映射:物理属性到逻辑属性的relative映射:etc...(完成为列表,可以戳这里:MDN-CSSLogicalPropertiesandValues[8])逻辑属性中没有方向性的概念,只有开始(start)和结束(end),块(block)和内联(inline)的概念。例如,在从左到右(LTR)中,起点在左,但在从右到左(RTL)中,起点在右。logical属性下的盒模型考虑到了不同布局带来的逻辑问题,整个盒模型也可以相应改变。下图中,左边是物理盒子模型,右边是逻辑属性下的盒子模型。左:物理框|右图:逻辑框的物理方向与逻辑方向重叠当然还有一种情况是设置的逻辑方向与物理方向重叠。比如我们给一个正常从左到右,从上到下的元素,同时设置padding-top和padding-block-start,看看会发生什么:div{padding-top:120px;padding-block-start:100px;}这里如果物理方向设置的padding与逻辑方向重叠,则取两者定义的值中较晚的一个。这里,由于padding-block-start是在padding-top之后定义的,所以padding的值为100px。margin和border是一样的。我这里的理解是同一个方向margin\padding\border只能有一个,不管是逻辑方向还是物理方向,以后面定义的值为准。CodePenDemo--物理方向和逻辑方向重叠DEMO展示[9]综上所述,当项目开始国际化,当越来越多的国内业务开始出海,国际兼容和适配会越来越重要。幸运的是,CSS一直在与时俱进,推陈出新。当您的排版布局需要考虑不同的书写模式时,您需要开始考虑使用逻辑属性而不是物理属性!最后,本文到此结束,希望对大家有所帮助:)有什么问题或者建议可以多多交流。原创文章文笔有限,知识匮乏。如果文章中有任何不准确的地方,请告诉我。参考文章【bidi(双向文本)和RTL布局总结】(https://www.cnblogs.com/dojo-lzz/p/4289423.html》bidi(双向文本)bidi(双向文本)andRTLlayoutsummary")SummaryoflayoutwithRTL")Changethewriting-modepropertyoftheverticalandhorizo??ntalrulesoftheCSSworld[10]CSSLogicalPropertiesandValuesLevel1[11]GraphicalCSS:CSSLogicalProperties[12]CSSLogicalPropertiesAretheFutureoftheWeb&I18N[13]References[1]UNICODEBIDIRECTIONALALGORITHM:https://unicode.org/reports/tr9/[2]CodePenDemo--按writing-mode显示诗歌:https://codepen.io/Chokcoco/pen/ExmmbeY[3]CodePenDemo--writing-modeLayoutDemo:https://codepen.io/Chokcoco/pen/OJmmJmj[4]CodePenDemo--CSSEllipsisBeginningofString:https://codepen.io/Chokcoco/pen/BaWBELx[5]改变CSS世界纵横规则的writing-mode属性:https://www.zhangxinxu.com/wordpress/2016/04/css-writing-mode/[6]CSSLogicalPropertiesandValuesLevel1:https://drafts.c??sswg.org/css-logical/[7]CodePenDemo——物理方向和逻辑方向展示:https://codepen.io/Chokcoco/pen/BaRRmgx[8]MDN——CSS逻辑属性和值:https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Logical_Properties[9]CodePenDemo--物理方向和逻辑方向重叠DEMO展示:https://codepen.io/Chokcoco/pen/dyWReQV[10]改变CSS垂直和水平规则的writing-mode属性world:https://www.zhangxinxu.com/wordpress/2016/04/css-writing-mode/[11]CSSLogicalPropertiesandValuesLevel1:https://drafts.c??sswg.org/css-logical/[12]IllustratedCSS:CSSLogicProperties:https://www.w3cplus.com/css/css-logical-properties.html[13]CSSLogicalPropertiesAretheFutureoftheWeb&I18N:https://dev.to/yuschick/css-logical-properties-are-the-future-of-the-web-i18n-11i1