因为周会要做分享,赶鸭子上架,简单了解了一下。了解完发现可能没什么用。。。但是既然付出了时间成本,就顺便写下来吧,
物理属性
我们一般使用物理属性(left、right、top、bottom)来描述盒模型。但这些属性受制于书写模式,书写模式改变,物理属性也会改变。
- 书写模式,也就是writting mode属性定义了文本水平或垂直排布以及在块级元素中文本的行进方向。此属性指定块流动方向,即块级容器堆叠的方向,以及行内内容在块级容器中的流动方向。
水平流动方向也受脚本方向的影响。- 从右到左(ltr,英语及大多数语言)
- 从左到右(rtl,希伯来语或阿拉伯语)
逻辑属性
逻辑属性,一般以*-start、*-end结尾的一类css属性。
CSS逻辑属性中没有方向性的概念,也不基于物理、方向和维度,不受书写模式的干扰。
逻辑属性定义了
逻辑属性使用抽象概念block和inline来描述元它们流的方向,这些词语的物理含义取决于书写模式。
-
Block dimension(块维度) 块轴垂直于一行内文本流,即水平书写模式下的垂直维度、垂直书写模式下的水平维度。
-
Inline dimension(行内维度) 行内轴平行于一行内的文本流,即水平书写模式下的水平维度、垂直书写模式下的垂直维度。
之所以叫逻辑属性,因为其最终的渲染方向表现出逻辑判断。举例:如果文字的排列方向是从左向右的(ltr),那么此时margin-start就与margin-left表示的含义相同;如果文字排列的方向是从右向左的(rtl),那么此时margin-start就与margin-right表示的含义相同。
物理属性到逻辑属性的映射
- 最常见的从左向右,从上到下
- 从右向左
- 从右向左,从上到下
在这里block和inline不再表示块元素或行内元素,而是代表了方向。在应用的时候根据文本流的方向判断block和inline轴的方向,以start或end代替top和bottom等物理方向的值。
- 物理属性与逻辑属性重叠
div {
padding-top: 120px;
padding-block-start: 100px;
}
取后定义的值,在这里会生效的是100px。
和物理属性一样,逻辑属性也可以缩写
- margin的缩写
{
margin-inline-start: 4ch;
margin-inline-end: 2ch;
}
{
margin-inline: 4ch 2ch;
}
- inset的缩写
{
position: absolute;
top: 10px;
bottom: 10px;
}
{
position: absolute;
inset-block: 10px;
}
未来
CSS将会提供更多的逻辑属性,虽然在缩写上还有很大的不足,但是新的方案已经在解决中了。
草稿中有个临时方案,如果你想把一个盒子的样式都以逻辑属性设置,可以这样:
{
margin: 1px 2px 3px 4px;
margin: 1px 2px;
margin: 2px;
}
{
margin: logical 1px 2px 3px 4px;
margin: logical 1px 2px;
margin: logical 2px;
}
也就是给每个缩写前面都加个logical,这样子也不好看,也不好写。
所以还有其他提议对块和页面层级的物理和逻辑属性进行修改,但这会将逻辑属性泄露到仍旧应用了物理属性的部分。可以用flow-mode来设置整个文档采用哪种属性。
html {
flow-mode: physical;
/* or */
flow-mode: logical;
/* now all margin/padding/etc references are logical */
}
简单应用
除了可以适应(兼容)不同语言下的书写习惯,还可以实现卡片的翻转。 比如下面的例子:
如果用平时的写法,得分别设置标题和段落的padding值。
.card-1 {
h1 {
padding: 30px 60px 0px 40px;
}
p {
text-indent: 2em;
padding: 0px 50px 40px 20px;
}
}
.card-2 {
writing-mode: vertical-rl;
h1 {
padding: 40px 30px 60px 0px;
}
p {
text-indent: 2em;
padding: 20px 0px 50px 40px;
}
}
使用逻辑属性可以更简单,而且无论卡片的方向如何变,你也不需要去调整标题和段落的样式
h1 {
padding-block: 30px 0px;
padding-inline: 40px 60px;
}
p {
text-indent: 2em;
padding-block: 0px 40px;
padding-inline: 20px 50px;
}
总结:CSS逻辑属性,不仅可以让前端的布局在逻辑上更加严谨,而且能让开发者以更少的代码写出兼容性更好的页面。(😓没用的知识又增加了!我其实并没有见过这玩意的实际应用场景)
参考
web.dev/logical-pro…
css-tricks.com/late-to-log…
developer.mozilla.org/zh-CN/docs/…
webdesign.tutsplus.com/tutorials/h…