【CSS in Depth 2 精譯】3.1.2 邏輯屬性 + 3.1.3 用好邏輯屬性的簡寫形式

當前內容所在位置(可進入專欄查看其他譯好的章節內容)

  • 第一章 層疊、優先級與繼承(已完結)
    • 1.1 層疊
    • 1.2 繼承
    • 1.3 特殊值
    • 1.4 簡寫屬性
    • 1.5 CSS 漸進式增強技術
    • 1.6 本章小結
  • 第二章 相對單位(已完結)
    • 2.1 相對單位的威力
    • 2.2 em 與 rem
    • 2.3 告別像素思維
    • 2.4 視口的相對單位
    • 2.5 無單位的數值與行高
    • 2.6 自定義屬性
    • 2.7 本章小結
  • 第三章 文檔流與盒模型
    • 3.1 常規文檔流(已完結)
      • 3.1.1 內容水平居中
      • 3.1.2 邏輯屬性 ??
      • 3.1.3 用好邏輯屬性的簡寫形式 ??
    • 3.2 盒模型
      • 3.2.1 避免魔術數值(精譯中 ?)

3.1.2 邏輯屬性

過去,文檔流的默認行為會給需要翻譯成特定語言的網站造成困難。常規流是按從左至右、從上到下的方向流動的,這是因為包括英語在內的絕大多數語言都是這樣書寫的。但是,為了讓“萬維”網(“world-wide” web)能夠真正名符其實地對全世界開放,就必須兼容書寫方式各不相同的其他語言,包括從右向左閱讀的語言(如阿拉伯語、希伯來語),以及垂直書寫的語言(如日語、繁體中文)。W3C 聯盟為此投入了大量工作,最終為 CSS 成功引入了 邏輯屬性(logical properties 的概念。

定義

邏輯屬性 為元素流向的處理提供了一種新的思路。它是針對塊級元素和行內元素對應的方向而言的,而這些方向又是隨不同語言的書寫習慣而動態變化的。這樣就無需生硬地指定元素上、下、左、右的尺寸以及寬高的具體大小了。

使用邏輯屬性時,之前的水平方向與垂直方向的概念,分別被 行內基準方向(即 inline base direction,表示文字在行內的流動方向)和 塊級流動方向(即 block flow direction,也就是段落等盒型元素自然堆疊的方向)所取代。要設置的屬性不再是 width,而是 inline-size。二者雖然在水平書寫模式下效果完全相同,但在垂直書寫模式下 inline-size 可用于指定高度;同理,高度 height 也無需設置了,取而代之的是 block-size 屬性:它也可以在垂直書寫模式下設置寬度。

邏輯屬性還將以往的 “上(top)、右(right)、下(bottom)、左(left)” 換成了 開始(start結束(end。因此,padding-leftpadding-right 分別變為 padding-inline-startpadding-inline-endborder-topborder-bottom 則分別變為 border-block-startborder-block-end——這些屬性的含義會根據書寫模式的不同而重新動態調整。

圖 3.5 列舉了塊級方向與行內方向在各種書寫模式下的文檔流向。箭頭從每個維度方向的“開始(start)”指向“結束(end)”。圖中用 border-inline-start 加粗了每個示例中的某一個邊框,以強調其行為特征。

圖 3.5 行內元素與塊級元素在各種書寫模式下的文檔流方向圖 3.5 行內元素與塊級元素在各種書寫模式下的文檔流方向

要適應這些邏輯屬性,關鍵是得熟悉這些新的叫法。改變原有的頁面布局大可不必,換掉那些習以為常的術語即可。至于適應多種書寫模式及語言的問題,還是留到真要翻譯頁面內容的時候再說吧;在使用邏輯屬性的前提下,如果布局方案能在從左到右書寫的、熟悉的語言中奏效,那么一旦書寫模式改變,該布局方案也會隨之調整。

工作中只用到一種語言,是否還需要邏輯屬性?

這取決于您的工作和生活環境。創建可以支持其他書寫模式的網站,這樣的場景可能并不多見。即便如此,理解邏輯屬性的工作原理仍然非常重要,原因有三——

  1. 邏輯屬性是 flexbox 布局和 grid 布局中眾多核心概念不可或缺的前期儲備知識(本書將在后續兩章中深入探討這些布局概念);
  2. 一些邏輯屬性是沒有對應的傳統屬性的,但有時用起來往往更加方便;
  3. 隨著邏輯屬性在行業中的應用日益廣泛,正確理解遇到的新樣式寫法也尤為重要。

實際工作中,如果正在開發的網站無需切換書寫模式,那么究竟是用邏輯屬性還是傳統屬性,亦或是將二者有機結合,都完全可以由您自行決定。即使是在多語言場景下,有時可能也需要用到一些傳統屬性,例如要讓新增的樣式效果在任何書寫方向上都保持一致的時候。

如果您一直在用瀏覽器的 DevTools 工具檢查頁面元素,可能都已經注意到了,用戶代理樣式表在處理默認外邊距時用到了邏輯屬性;處理列表元素時也使用了 inline-start 風格的內邊距;類似的情況還出現在了其他一些屬性中。

在層疊規則中,傳統屬性及其對應的邏輯屬性可以相互覆蓋。因此,如果對列表設置了左內邊距 padding-left,則會覆蓋用戶代理樣式中的 padding-inline-start 樣式;相反,也可以使用 margin-block-start 和優先級更高的選擇器來覆蓋優先級較低的 margin-top 樣式。也就是說,這兩種方法可以在樣式表中相互交換,并且仍然可以獲得可預測的效果。

幾乎所有與垂直或水平樣式相關的 CSS 屬性(property)都有對應的邏輯屬性。這樣一來,您就可以基于當前語言的具體特征來定義頁面布局。以下羅列了部分常見的傳統屬性和取值、及其對應的邏輯屬性的寫法和取值情況:

  • width / inline-size
  • height / block-size
  • margin-top / margin-block-start
  • margin-bottom / margin-block-end
  • margin-left / margin-inline-start
  • margin-right / margin-inline-end
  • text-align: left / text-align: start
  • text-align: right / text-align: end
  • border-top-left-radius / border-start-start-radius
  • border-top-right-radius / border-start-end-radius
  • border-bottom-left-radius / border-end-start-radius
  • border-bottom-right-radius / border-end-end-radius

以上列表只展示了一部分情況,但足以清楚演示這種新的寫法了。通過使用 block/inlinestart/end,您所熟悉的傳統樣式屬性寫法都可以切換成對應的等效邏輯屬性。關于邏輯屬性的全面介紹,請參閱 https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Logical_Properties。

3.1.3 用好邏輯屬性的簡寫形式

某些邏輯屬性恰巧為常見的樣式設置提供了簡寫形式。例如,margin-inline 可以一次性設置起始(左側)和結束(右側)外邊距、而無需設置上下兩側的外邊距。使用 margin-inline: 2rem 可以將起止外邊距(即左外邊距與右外邊距)同時設為 2rem;或者使用 margin-inline: 2rem 4em 將開始(左)外邊距設為 2rem,并將結束(右)外邊距設為 4em。同理,margin-block 也可以通過設置塊級元素外邊距的起止樣式來簡化傳統的上下外邊距,類似的屬性還包括 padding-inlinepadding-blockborder-inline 以及 border-block。傳統的經典 CSS 屬性是沒有這樣的行為特征的。

這種寫法能讓之前介紹的雙容器模式更加簡潔。按照代碼清單 3.4 更新樣式表,注意代碼還包括將 max-width 屬性替換為對應的邏輯屬性 max-inline-size

代碼清單 3.4 將邏輯屬性應用于雙容器模式

.page-header h1 {max-inline-size: var(--column-width); /* max-width 的等效邏輯屬性 */margin-inline: auto; /* 將左右外邊距設為 auto,而無需指定上下外邊距 */
}
.container {max-inline-size: var(--column-width); /* max-width 的等效邏輯屬性 */margin-inline: auto; /* 將左右外邊距設為 auto,而無需指定上下外邊距 */
}

這些更改不會給頁面帶來任何視覺變化,僅僅是方便了頁面樣式的編寫。我發現這些樣式簡寫非常有用,因為我經常要為外邊距或其他樣式屬性單獨指定上下或左右兩邊的值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45126.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45126.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入探討:CPU問題的深度分析與調優

引言 你是否曾經遇到過這樣的情況:系統運行突然變慢,用戶抱怨不斷,檢查后發現CPU使用率居高不下?這時候,你會如何解決?本文將詳細解析CPU問題的分析與調優方法,幫助你在面對類似問題時游刃有余。 案例分析:一次CPU性能瓶頸的解決過程 某知名互聯網公司在一次促銷活動…

《Python數據科學之一:初見數據科學與環境》

《Python數據科學之一:初見數據科學與環境》 歡迎來到“Python數據科學”系列的第一篇文章。在這個系列中,我們將通過Python的鏡頭,深入探索數據科學的豐富世界。首先,讓我們設置和理解數據科學的基本概念以及在開始任何數據科學項…

實變函數精解【4】

文章目錄 說明點集與測度可數集定義性質示例與有限集的關系應用 可列集定義種類不可列集性質應用與意義 有限集性質示例與無限集的區別應用 可數集(Countable set)和可列集(Countably infinite set 或 Enumerable set)可數集可列集…

怎樣把pptx課件轉換成word文檔

如果你還沒有安裝python-pptx和python-docx,請先運行以下命令: pip install python-pptx python-docx from pptx import Presentation from docx import Document import re# 函數:清理文本,移除特殊字符和控制字符 def clean…

每日Attention學習11——Lightweight Dilated Bottleneck

模塊出處 [TITS 23] [link] [code] Lightweight Real-Time Semantic Segmentation Network With Efficient Transformer and CNN 模塊名稱 Lightweight Dilated Bottleneck (LDB) 模塊作用 改進的編碼器塊 模塊結構 模塊代碼 import torch import torch.nn as nn import to…

qt 添加一個圖片控件

在Qt中,要添加一個圖片控件,你通常會使用QLabel或者QGraphicsView來顯示圖片。下面是使用QLabel來顯示圖片的一種方法: 使用 QLabel 顯示圖片 在Qt Designer中添加QLabel 打開你的Qt Designer。從工具箱中找到QLabel控件,并將其拖…

C#如何進行深度學習對行人進行識別?

C#通常不是用于深度學習的主要語言,但是通過一些庫和框架,你可以輕松地在C#中實現深度學習。以下是使用C#進行深度學習的一些更詳細的步驟: 選擇合適的庫: ML.NET:這是微軟推出的一個機器學習庫,它很容易集成到.NET應用程序中。ML.NET支持廣泛的機器學習任務,包括深度學…

使用DeepWalk 和Word2Vec實現單詞Embedding

0、準備“邊”數據集Wiki_edgelist import pandas as pddf pd.read_csv(./data/wiki/Wiki_edgelist.txt, sep , headerNone, names["source", "target"]) df.head() 1、讀入 起點-終點 邊數據,構建圖 # 1、讀入 起點-終點 邊數據&#xff0c…

GIS就業相關問題快問快答

目錄 前言1.現在處于經濟下行期,GIS就業崗位是否減少了?2.我未來的打算是進體制內研發崗,這方面需要掌握哪些技能呢?3.GIS前端需要掌握哪些知識?4.GIS后端需要掌握哪些知識?5.不論是前端還是后端&#xff0…

編程語言都是哪些人開發出來的?為什么都是國外較小國家的人

編程語言都是哪些人開發出來的? 編程語言的開發者通常是來自計算機科學、軟件工程、數學、物理學等領域的專家、學者和工程師。這些開發者具備深厚的編程技能、算法知識、系統設計能力以及創新思維,他們致力于創造出能夠解決特定問題或滿足特定需求的編…

Docker入門(清晰認識)

為什么學習Docker? 再學完linux后,我們需要遠程對Linux虛擬機下載一些軟件,如果在Linux里直接用命令下載軟件會十分麻煩,所以我們需要通過使用Docker將軟件直接下載到Docker中,這樣更方便下載和卸載等操作。 一張圖弄…

javaScript的面試重點--預解析

目錄 一.前言 二.預解析案例 一.前言 關于預解析,我們通過今天學習就能夠知道解析器運行JS分為哪兩步;能夠說出變量提升的步驟和運行過程;能夠說出函數提升的步驟和運行過程。 二.預解析案例 預解析,簡而言之,也就是…

7.13實訓日志

上午 學習網絡安全的過程中,我們深入了解了網絡的不同層面和技術,從表層網絡到深網再到暗網,以及涉及的產業分類和技術工具。這些知識不僅幫助我們理解網絡的復雜性,還揭示了如何應對和防范各種網絡威脅。 首先,我們…

簡易秒表的實現

目錄 描述 輸入描述: 輸出描述: 參考代碼 描述 請編寫一個模塊,實現簡易秒表的功能:具有兩個輸出,當輸出端口second從1-60循環計數,每當second計數到60,輸出端口minute加一,一直…

當在多線程環境中使用 C++進行編程時,怎樣確保線程安全以及如何處理線程之間的同步和通信?

在C中確保線程安全性和處理線程之間的同步和通信有多種方法。下面是一些常用的技術和技巧: 互斥鎖:使用互斥鎖可以確保只有一個線程可以訪問共享資源。在訪問共享資源之前獲取鎖,在完成后釋放鎖。這可以防止多個線程同時訪問同一份數據&#…

007-端口隔離

端口隔離配置 端口隔離簡介 為了實現報文之間的二層隔離,可以將不同的端口加入不同的VLAN,但會浪費有限的VLAN資源。采用端口隔離特性,可以實現同一VLAN內端口之間的隔離。 設備支持以下方式進行端口隔離: 基于隔離組的端口隔…

中介子方程五十七

XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXαXXpXeXXkXyXWXOXiXXbXXpXXiXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXα…

理解JavaScript中的對象傳遞與賦值操作

在JavaScript中,對象傳遞和賦值操作是兩個非常重要的概念。它們在日常開發中扮演著關鍵角色,但也常常會讓人感到困惑。本文將通過兩個簡單的例子,更好地理解它們的區別和實際應用。 示例代碼1:修改對象屬性 我們先來看第一段示例…

【數據結構】順序表的應用

目錄 一.引言 二.順序表概念 三.順序表的實現 1.定義順序表 2.順序表初始化 ?編輯 3.檢查空間,如果滿了,進行增容 4.順序表尾插 5.順序表尾刪 6.順序表頭插 7.順序表頭刪 ?編輯 8.順序表查找 9.順序表在pos位置插入x 10.順序表刪…

展開說說:Android頁面繪制流程源碼解析

說到Android系統View的繪制流程,大家一定知道是分為測量(Measure)、布局(Layout)和繪制(Draw)三個階段,這篇文章主要聊一聊在這三個步驟之前的源碼執行流程,頁面啟動后是…