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是最直观的。假设,我们有以下结构:1234这是一段正常顺序的文字
简单的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值:
凉州词
葡萄酒夜光杯,
如果你想喝琵琶,马上提醒我。
大莫萧,醉沙场,
古来多少人征战。