摘要:目前為止,支持類似這種多方向網(wǎng)站的最佳方式,依然是使用和變量。在英文網(wǎng)站,寬度屬性用表示,高度屬性用表示。在英文網(wǎng)站中更多常用于,它的值升級(jí)為代替。在英文網(wǎng)站中,物理屬性與邏輯屬性的表現(xiàn)是一致的。
原文鏈接:https://medium.com/@elad/new-...
原文作者:Elad Shechter
在過去,大多數(shù)程序猿在思考布局時(shí)總是習(xí)慣于從“上下左右”的角度出發(fā)。這是因?yàn)樵谠缙?,互?lián)網(wǎng)主要用于上傳文檔,而不是為了實(shí)現(xiàn)我們現(xiàn)在熟知的復(fù)雜網(wǎng)站架構(gòu)。
這也是為什么沒有人思考多語言網(wǎng)站的需求。
目前為止,支持類似 RTL/LTR 這種多方向網(wǎng)站的最佳方式,依然是使用 SASS 和 SASS 變量。
(如果你希望了解更多內(nèi)容,可以閱讀我的另一篇文章《The Best Way to RTL Websites with SASS!》)。
這些新的邏輯屬性讓我們能夠在改動(dòng)最少樣式的情況下控制我們的網(wǎng)站,而不用擔(dān)心網(wǎng)站使用的是何種語言(無論是英語、阿拉伯語、日語還是其他語言)。
現(xiàn)在讓我們開始吧!
思考 CSS 邏輯屬性的方式當(dāng)我們討論盒模型時(shí),我們已經(jīng)對(duì)下面這張圖很熟悉了:
盒模型物理屬性(舊方案)
它在以前和現(xiàn)在一直是正確的,但類似 margin-left, padding-right, border-top 等經(jīng)典物理特性其實(shí)已經(jīng)時(shí)日不多了。
在你開始使用新的邏輯屬性之前,你需要停止從 left/right 或者 top/bottom來思考問題,而是使用 inline-start/inline-end 和 block-start/block-end 來替代它們。
邏輯屬性(新方案)
讓我們用英文作為例子,英文的閱讀方向是從左到右,這是屬性的內(nèi)聯(lián)部分。當(dāng)我們想要把一系列元素排在同一行時(shí),我們通常會(huì)使用 display: inline,照這個(gè)思路就很容易記住 inline axis 的含義了。
舉例來說,padding-inline-start 會(huì)在當(dāng)前語句開始位置的旁邊設(shè)置一個(gè)內(nèi)邊距:
在英語中:?????? padding-inline-start = padding-left
在阿拉伯語中:padding-inline-start = padding-right
在日語中: ????? padding-inline-start = padding-top
讓我們忘掉 top 和 bottom 相關(guān)屬性的含義(不再表示“上下”),而是把 top 當(dāng)做網(wǎng)站的開始,把 bottom 當(dāng)做網(wǎng)站的結(jié)束。只要想像幾個(gè) display:block 的元素首尾相連,就很容易記住這點(diǎn)了。
到這時(shí)你仍然會(huì)問自己,難道這不是一貫的做法嗎?
這個(gè)問題解釋起來有點(diǎn)復(fù)雜。因?yàn)槟壳安]有其他解決方案,所以目前所有的網(wǎng)站,不管是使用的是什么語言,都是這么處理的。
要知道使用日文或者其他東方語言的網(wǎng)站(按布局方向)可能是從右到左,而非從上到下的!為了理解這種網(wǎng)站的表現(xiàn),我們可以想象一下將瀏覽器向右旋轉(zhuǎn)90度,我們會(huì)發(fā)現(xiàn)網(wǎng)站的滾動(dòng)條不再是垂直方向了,它變成了水平方向!
舉個(gè)例子(block cases):
在英語和阿拉伯語中: padding-block-start = padding-top
在日語中:??????padding-block-start = padding-right
(日文網(wǎng)站)
(margin, padding and border)
在理解了 inline 和 block axis 之后,你就可以根據(jù)需要來使用它們了。
用英文網(wǎng)站舉例來說:
margin
margin-block-start = margin-top
margin-block-end = margin-bottom
margin-inline-start = margin-left
margin-inline-end = margin-left
padding
padding-block-start = padding-top
padding-block-end = padding-bottom
padding-inline-start = padding-left
padding-liline-end = padding-right
border
border-block-start = border-top
border-block-end = border-bottom
border-inline-start = border-left
border-inline-end = border-right
Width 和 Height 被 inline-size 和 block-size 所取代。
Width 和 Height 屬性同樣需要適應(yīng)新的尺寸表達(dá)方法。一旦我們理解了 inline/block 方法,就非常容易理解它們的尺寸要如何用新屬性來表示。在英文網(wǎng)站,寬度屬性用 inline-size 表示,高度屬性用 block-size 表示。
舉個(gè)栗子(inline/block size):
在英文與阿拉伯語中(LTR/RTL)
width = inline-size
height = block-size
在一個(gè)閱讀順序是每行里自上而下的語言中,比如日語,我們會(huì)看到相反的表達(dá)方式:
inline-size = height,block-size = width。
對(duì)于 min/max 屬性,只需要把 min/max 書寫在屬性前面:min-inline-size: 300px; max-block-size: 100px;。
新舊盒模型屬性對(duì)比
top/right/bottom/left這些舊的位置屬性已經(jīng)發(fā)展出了一組新的屬性名,它們都帶有 inset 前綴,分別是:
inset-block-start / inset-inline-end / inset-block-end / inset-inline-start
在英文網(wǎng)站中(LTR):
top = inset-block-start
bottom = inset-block-end
left = inset-inline-start
right = inset-inline-end
/* OLD TECHIQUE */ .popup { position: fixed; top: 0; bottom: 0; left: 0; right: 0; } /* NEW TECHIQUE */ .popup { position: fixed; inset-block-start: 0; /*top - in English*/ inset-block-end: 0; /*bottom - in English*/ inset-inline-start: 0; /*left - in English*/ inset-inline-end: 0; /*right - in English*/ }
第一眼看到這些代碼,你可能會(huì)質(zhì)疑為什么我們需要如此復(fù)雜的命名?!其實(shí)這是有充分理由的。在新的屬性名中,這些屬性依然可以使用類似 padding/margin/border 的書寫方式混合起來,而這種新的位置簡寫特性在以前是不存在的(如下所示)。
.popup{ position:fixed; inset:0 0 0 0; /*top, right, bottom, left - in English*/ }
Float 非常簡單,它只有2個(gè)值 left/right,分別用 inline-start/inline-end 來代替。
在英文網(wǎng)站中(LTR):
float: left = float: inline-start
float: right = float: inline-end
它比 floats 更簡單,只需要用 start/end 代替 left/right 即可。
在英文網(wǎng)站中(LTR):
text-align: left = text-align: start
text-align: right = text-align: end
Resize:常用于 ,它的值 horizontal/vertical 升級(jí)為 inline/block 代替。
在英文網(wǎng)站中(LTR):
resize: horizontal = resize: inline
resize: vertical = resize: block
background-position:目前為止還沒有任何瀏覽器中針對(duì)該屬性進(jìn)行過修改,但如果你研究的足夠深入,你就會(huì)在 Mozilla 的 MDN 中找到有關(guān) background-position-inline & background-position-block 的資料。雖然這些文檔還不夠完善,但工作人員已經(jīng)在進(jìn)行相關(guān)的工作了。
其他:正如其他與方向有關(guān)的屬性一樣,我們還可以預(yù)測(cè)類似 transform-origin 這樣的屬性也會(huì)被更新。
CSS Grid & CSS Flexbox這兩個(gè)特性本身已經(jīng)使用了新的邏輯屬性方法進(jìn)行構(gòu)建,因此如果你之前已經(jīng)使用了這兩個(gè)特性,那么沒有必要用本文提到的新方法去替代它們。
理解邏輯屬性的工作流程雖然剛開始看起來很復(fù)雜,但實(shí)際上是非常容易使用的。在寫樣式時(shí),不再需要考慮跨語言支持的問題。你只需要使用邏輯屬性替代舊的物理屬性,然后讓它們匹配你喜歡的語言即可。
根據(jù)語言來應(yīng)用對(duì)齊當(dāng)我們學(xué)習(xí)了所有新邏輯屬性的更新后,我們就可以運(yùn)用2個(gè)特性來分別定義塊軸對(duì)齊(block axis alignment)(網(wǎng)站文檔流方向)和內(nèi)聯(lián)軸對(duì)齊(文字閱讀方向)。
Writing-mode 屬性(塊軸)在定義網(wǎng)站文檔流時(shí),大多數(shù)時(shí)候是從上到下的。但正如上文提到的,特定語言有可能從右到左(日語),甚至從左到右(蒙語)。在這兩種情況中,我們就得使用水平滾動(dòng)條來替代慣用的垂直滾動(dòng)條。
注意:writing-mode 有3個(gè)主要的值:horizontal-tb / vertical-rl / vertical-lr。
這3個(gè)值的名稱有一點(diǎn)令人困惑。這是因?yàn)樗麄兗瓤梢员硎緣K軸方向,還可以表示內(nèi)聯(lián)軸的文字對(duì)齊(inline-axis)。這顯然讓人很不爽,因?yàn)槲淖謱?duì)齊其實(shí)是多余的,這只能讓人感到困惑。
為了消除這個(gè)困惑,建議忽略屬性值內(nèi)表示內(nèi)聯(lián)軸的部分,只關(guān)注塊軸部分。
舉例來說:
writing-mode: horizontal-tb; = Top to Bottom Flow,英文(默認(rèn))
writing-mode: vertical-rl; = Right to Left Flow,日語
writing-mode: vertical-lr; = Left to Right Flow,蒙語
就我而言,我更傾向于讓屬性值只包括:tb/rl/lr (block-axis part),以此消除潛在的困惑。
日語中 writing-mode 是這么定義的:
html { writing-mode: vertical-rl; }Direction property (inline axis) - 方向?qū)傩裕▋?nèi)聯(lián)軸)
只有在 writing-mode 屬性處于默認(rèn)的水平模式時(shí),方向?qū)傩圆拍軌蚨x文字方向是 left-to-right 還是 right-to-left。如果我們將 writing-mode 改為垂直模式中的一種后,文字方向就會(huì)發(fā)生改變:
left-to-right 會(huì)變?yōu)?top-to-bottom,right-to-left 會(huì)變?yōu)?bottom-to-top。
以阿拉伯語為例:
html { direction: rtl; }
令人驚奇的是,將一個(gè)自上而下的網(wǎng)站變?yōu)橐粋€(gè)帶有橫向滾動(dòng)條的自右向左的網(wǎng)站是多么的容易。
這里是我寫的一個(gè)demo,在 Firefox 中瀏覽最佳(目前為止 Firefox 支持更多的新屬性)
Live Example (試試選擇其他語言選項(xiàng)):
瀏覽器支持情況除 Edge 外,大部分主流瀏覽器支持所有的盒模型屬性(margin / padding / border)以及新的 width / height (inline-size, block-size) 屬性。
除 Edge 外,大部分主流瀏覽器支持 text-align 的新屬性值。
Floats / Positions / Resize 的值或?qū)傩灾槐?Firefox 所支持。
關(guān)于邏輯屬性的相關(guān)問題隨著這些新屬性的誕生,我們也必須面對(duì)隨之而來的新問題。比如,當(dāng)我們想用簡寫的方式把所有 margin 屬性寫出來時(shí),像這樣:
margin: 1px 2px 3px 4px;
你是無法預(yù)測(cè)它會(huì)如何被瀏覽器解析的。
因?yàn)槿绻W(wǎng)站使用的是物理屬性,這些屬性值就會(huì)被解析為:margin-top / margin-right / margin-bottom / margin-left,但如果網(wǎng)站使用的是邏輯屬性,這些值就應(yīng)該是:margin-block-start / margin-inline-end / margin-block-end / margin-inline-start。
在英文網(wǎng)站中,物理屬性與邏輯屬性的表現(xiàn)是一致的。在使用其他語言的網(wǎng)站中,當(dāng)我們使用類似 margin 的簡寫時(shí),我們希望它能夠根據(jù) direction 屬性或 writing-mode 屬性來工作。
但如何能讓簡寫自動(dòng)根據(jù)direction 或 writing-mode 去解析呢?這一直是個(gè)懸而未決的問題。針對(duì)該問題,我曾給出一些建議:++suggestion that can solve the issue at github csswg-drafts++。如果你有更好的解決方案,歡迎你在鏈接中評(píng)論!
如果你現(xiàn)在要使用邏輯屬性,那你就必須把它們的屬性名完整地寫出來,而不能使用簡寫。
在這里我給出一個(gè)可選的解決方案:
html{ flow-mode:physical; /*or*/ flow-mode:logical; } .box{ /*will be interpreted according to the HTML flow-mode value*/ margin:10px 5px 6px 3px; padding:5px 10px 2px 7px; }關(guān)于響應(yīng)式設(shè)計(jì)的問題
為了制作一個(gè)完善的 demo,我嘗試在媒體查詢里使用 max-width 的新屬性 max-inline-size,在 left-to-right 的條件下,max-inline-size 的效果會(huì)與 max-width 一樣,而在 right-to-left 的條件下,比如日語這樣的語言,新屬性的效果就會(huì)與 max-height 一樣。有點(diǎn)遺憾的是目前瀏覽器并不支持在媒體查詢(media query)中解析新屬性。
/*Not Working*/ @media (max-inline-size:1000px){ .main-content{ background:red; grid-template-columns:auto; } }一些值得思考的變化
在深入學(xué)習(xí)并理解了邏輯屬性的概念后,我一邊寫文章一邊想,還有一些被忽略的改動(dòng)也應(yīng)該被納入未來的更新范圍中:
line-height 可以改為 line-size
border-width 可以改為 border-size
不過真實(shí)情況似乎不太一樣,至少 border-width 和我想的不一樣。它更新為邏輯屬性后,屬性名中依然帶有 width。
舉個(gè)例子:border-block-start-width。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/116265.html
摘要:引言一帶一路正在積極推動(dòng)中國的國際化進(jìn)程,前端網(wǎng)站也面臨著前所未有的國際化挑戰(zhàn)。本周精讀的文章是,通過一種新的技術(shù),實(shí)現(xiàn)國際化布局。討論地址是精讀國際化布局如果你想?yún)⑴c討論,請(qǐng)點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。 1 引言 一帶一路 正在積極推動(dòng)中國的國際化進(jìn)程,前端網(wǎng)站也面臨著前所未有的國際化挑戰(zhàn)。那么怎么才能積極響應(yīng) 一帶一路 戰(zhàn)略,推動(dòng)網(wǎng)站的國際化工作呢?可以先從國際化布...
摘要:引言一帶一路正在積極推動(dòng)中國的國際化進(jìn)程,前端網(wǎng)站也面臨著前所未有的國際化挑戰(zhàn)。本周精讀的文章是,通過一種新的技術(shù),實(shí)現(xiàn)國際化布局。討論地址是精讀國際化布局如果你想?yún)⑴c討論,請(qǐng)點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。 1 引言 一帶一路 正在積極推動(dòng)中國的國際化進(jìn)程,前端網(wǎng)站也面臨著前所未有的國際化挑戰(zhàn)。那么怎么才能積極響應(yīng) 一帶一路 戰(zhàn)略,推動(dòng)網(wǎng)站的國際化工作呢?可以先從國際化布...
摘要:將操作記錄為一列。在列表上進(jìn)行操作被稱為光柵化。能夠運(yùn)行產(chǎn)生位圖的命令加速光柵化注意到此時(shí)像素并不在屏幕上。因此,線程將劃分為。根據(jù)與的距離確定的優(yōu)先級(jí)。被包裝在一個(gè)中,該對(duì)象被提交給瀏覽器進(jìn)程。 This talk is about how Chrome turns web content into pixels. The entire process is called rend...
摘要:關(guān)閉開啟所有斷點(diǎn)不會(huì)取消。進(jìn)入到一個(gè)與正在的問題無關(guān)的函數(shù)后,可以點(diǎn)擊此圖標(biāo)解析函數(shù)剩下的代碼,跳出函數(shù)到下一行。例如現(xiàn)在在處暫停,之后,瀏覽器解析函數(shù)剩下的代碼,然后在處再次暫停。是全局的,在瀏覽器的所有標(biāo)簽頁都能找到和運(yùn)行。 此文章翻譯自 https://developers.google.com...,是對(duì) chrome 下調(diào)試 javascript 的工具和方法介紹。 調(diào)試 j...
閱讀 1660·2021-09-28 09:35
閱讀 1131·2019-08-30 15:54
閱讀 1657·2019-08-30 15:44
閱讀 3363·2019-08-30 14:09
閱讀 488·2019-08-29 14:05
閱讀 2662·2019-08-28 17:53
閱讀 1978·2019-08-26 13:41
閱讀 1710·2019-08-26 13:26