• CSS – Logical Properties


    前言

    上一篇介绍了各种语言的阅读方向. 这一篇来讲一下 Logical Properties. 它与 left to right, right to left, horizontal, vertical 息息相关.

    参考:

    Youtube – Write better CSS using logical properties

    CSS-Tricks – CSS Logical Properties

    The Problem

    p {
      padding-left: 30px;
      writing-mode: horizontal-tb;
      direction: ltr;
      /* unicode-bidi: bidi-override; */
    }

    加上一个 padding-left: 30px

    效果

    现在把 direction 换成 rtl

    p {
      direction: rtl;
    }

    效果

    padding-left 依然是左边. 但绝大部分情况下, 我们会希望它在右边. 

    这就类似使用 Flex 的 align-items 那样, 它的值是 flex-start, flex-end, 而不是 left, right. 因为它会依据 flex-direction 而变化. 

    flex-direction: row 时, flex-start 指的是 top

    flex-direction: column 时, flex-start 指的是 left

    很多地方都可以看到 start / end 取代 left / right 的影子. Angular Material 前几年也是一点一点换掉 API 接口的.

    Logical Properties – inline / block - start / end

    为了解决问题, 就有了所谓的 Logical Properties

    我们依然用回 padding 的例子.

    padding-left 对应 padding-inline-start

    padding-right 对应 padding-inline-end

    padding-top 对应 padding-block-start

    padding-bottom 对应 padding-block-end

    padding-inline / padding-block 是 shorthand property.

    start / end 比较好理解, 毕竟 Flex 也是 start / end.

    inline / block 呢? 

    我是这样记住它的, 上面是 inline 的效果, 东西是横向摆放一排的. 如果用手比划, 那么 2 只手是左右来形容一个 box, 那么就是 left right 咯.

    反之形容 block 的 box, 2 只手是上下的, 因为 block 的摆放是往下一个一个 row 的.

    所以就对应了, inline = left / right, block = top / bottom.

    padding / border / margin / width / height / position

    但凡之前有 "方向" 概念的都可以替换成 Logical Properties.

    div {
      padding-inline: 1rem; /* padding-left/right */
      padding-block: 1rem; /* padding-top/bottom */
      border-inline: 1rem;
      border-block: 1rem;
      margin-inline-start: 1rem;
      margin-block-end: 1rem;
    
      inline-size: 100px; /* width */
      max-inline-size: 100px; /* max-width */
      block-size: 100px; /* height */
      inset-inline-start: 1rem; /* left (for position) */
      inset-block-start: 1rem; /* top (for position) */
    }

    除了 padding, margin, border, 还有 width, height, position 的 top, right, bottom, left 都算有 "方向" 的概念哦.

    关于 shorthand property 和 inset

    padding-inline = padding-inline-start padding-inline-end

    padding-block = padding-block-start padding-block-end

    padding = top/bottom right/left 这可不是 logical 的哦, 它叫 physical (logical 的反义词是 physical), logical 没有一次性写完的 shorthand. 参考: This issue.

    另外, inset 是 position top, right, bottom, left 的 shorthand property. 它和 margin 是等价的. 它也不是 logical 的.

    inset-inline = inset-inline-start inset-inline-end (这个就是 logical)

    要不要用呢?

    参考: Medium – Why CSS Logical Properties Aren’t Ready for Use!

    至于要不要用呢? 其实绝大部分项目是没有需求的. 

    完全支持也是不久前的事情. 但是网站不可能只支持 model browser 吧. 至少也要顾虑到 3-5 年前的设备丫. 

     Can i use...

    像流行框架 Tailwind CSS 就没有 build-in 支持, 只是有 plugin 而且.

    还有 shorthand property 到现在草案都还不确定. 所以总结来看, 目前 2022 年用的话还有点早.

    个人建议, 如果项目有 logical 需求, 肯定得用. 

    如果没有, 那么混用也是可以的, 就是写来 for future 或者美观而已. 但不要认为它支持 logical. 这样的 trade-off 也是 ok 的.

  • 相关阅读:
    JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
    Java内部类详解 2
    内部类详解(很详细)
    《JAVA与模式》之简单工厂模式
    《JAVA与模式》之适配器模式
    多态
    java Final关键字
    java实例初始化块
    tween.js
    three.js 之旅 (三)
  • 原文地址:https://www.cnblogs.com/keatkeat/p/15967877.html
Copyright © 2020-2023  润新知