關於文字流
前幾天都提到了關於尺寸的事情,主要都圍繞在 Media Query 與 Grid, Flex 的容器「尺寸」的議題上。我們今天回到一開始的初衷,所謂的「內容為王」這件事情上面。
無論你是使用 RWD, AWD 還是 WD-40,其實免不了的都得考量到文字區塊這件事情。而我們比較常見的操作方式,大抵上都是在每一個斷點(@media)來設計相關元件的文字顯示方式。舉凡,
- 修改文字大小以符合區塊。
- 將文字隱藏或是截斷。
- 變更容器流向設計,用以符合文字展示。
- 直接輸出 JPG,因為我沒有那個字體。
所以,我們比較常見到的相關設定就會有這些:
- font-size
- font-weight
- word-break
- line-break
- letter-spacing
- word-spacing
- overflow-wrap
- white-space
關於上述這些東西,我這邊先推薦 Amos 的系列教學,所以我就不贅述了。
請叫我甩鍋王。
在各種尺寸的設計上,通常我們會遇到幾個難題,
- 你手機的字怎麼那麼小。
- 我手指超肥的按不到你的文字。
- 這個 12px太大了,我要8px的文字就好。
- 你這網站用我爸的手機不能看好爛。
那我們要怎麼面對「文字尺寸」這件事情?我們先來看比較一般的例子,
:root {
    --font-base-size: 10px;
    font-size: calc(var(--font-base-size) * 1);
}
body {
    font-size: 1rem;
}
一般來說,我們的根元件(:root)所預設的文字尺寸是 16px,上面的例子是使用 10px 這一點我想應該很明顯。好的,接下來我們都會全程使用 rem 來當作單位,這個單位是參考根元件的文字尺寸,上面會使用 10px 是方便我們計算(不好意思,我國小乘法比較弱,所以十進位我不用去按計算機)。
.article h1 {
    font-size: 4rem;
}
.article p {
    font-size: 1.6rem;
}
假設我們在行動裝置上,歐不,範圍限縮一點,在一般 5.8 吋螢幕尺寸左右的手機上,或者在 iPhoneX 上,上面內文的設定字級為 16px,而標題設定字級為 40px。看起來好像很大,實際上你在手機上看,你可能也會覺得很大。那麼,我們可以稍微縮小,然後在其他的裝置上再慢慢的放大。
這樣就會變成,
.article h1 {
    font-size: 2rem;
}
.article p {
    font-size: 1.4rem;
}
@media (min-width: 48rem) {
    .article h1 {
        font-size: 2.8rem;
    }
    .article p {
        font-size: 1.5rem;
    }
}
@media (min-width: 76.8rem) {
    .article h1 {
        font-size: 3rem;
    }
    .article p {
        font-size: 1.6rem;
    }
}
@media (min-width: 102.4rem) {
    .article h1 {
        font-size: 4rem;
    }
    .article p {
        font-size: 1.6rem;
    }
}
你不覺得這樣寫起來 超充實 浪費時間的嗎?不過有種情況例外,
我今天 commit 了 300 行 CSS 我超強。
好的,今天就是要來節省大家的時間,上面的設定可以約略換成:
.article h1 {
    font-size: clamp(2rem, 5 * (1vw + 1vh) / 2, 4rem);
}
.article p {
    font-size: clamp(1.4rem, 5 * (1vw + 1vh) / 2, 1.6rem);
}
什麼?這樣我一大堆 @media 不就要砍掉了?這樣我的 Commit 行數只剩四行產能不夠啊!
你走開,我暫時不想跟你講話。
clamp 方法
首先,這個方法目前在 w3c 還是屬於 WD 階段,但實際上去 caniuse.com 查詢的結果,高達 95.37% 的支援度,應該是可以放心使用的沒有關係。
再來,我們來看看這個方法實際上的定義,
clamp(<最小文字尺寸>, <計算尺寸>, <最大文字尺寸>);
好的,看起來比較多問題的會是那個 <計算尺寸> 到底是要計算什麼東西?又是拿什麼標準來計算?我們舉一個比較沒那麼複雜的例子,
.article p {
    font-size: clamp(1.4rem, 3vw, 1.6rem);
}
- 首先,字體尺寸會以 1.4rem為基準。
- 在以 3vw為計算尺寸下小於1.4rem就會採用1.4rem為文字大小。
- 在以 3vw為計算尺寸下大於1.6rem就會採用1.6rem為文字大小。
- 若介於 1.4rem與1.6rem中間,則會動態計算出文字大小。
接著,大家應該會有疑問,那個 3vw 到底是多少?
如果你不知道這個相對尺寸怎麼計算,放心我不會告訴你的
當然,雷點也是要提醒一下,
.article p {
    /* 請不要這樣做 */
    font-size: clamp(2rem, 3vw, 1.6rem);
}
如果你把最大與最小的地方寫反,那他就會永遠渲染你給他的 <最小文字尺寸>,以上述的例子,你的文字就會永遠都是 2rem。
由於這個方法是依照你所指定的 <計算尺寸> 來比對你的文字,而且文字的尺寸會是在你所設定的最大、最小區間內自動渲染。所以你無法很明確的定義,在什麼樣的尺寸下,一定要是哪一種文字尺寸。換句話說,他並不能完全取代 Media Query 指定文字尺寸的位置。
當你的客戶擁有像素眼的時候,寫個 1,800 行定義
p的 CSS 給他!
所以說那個手機版
先祝大家中秋節快樂,然後我剛剛烤了幾片和牛還不錯吃。

大潤發就有賣~
所以大抵上,你不是很複雜的文字內容,然後要確保文字的顯示正確,那麼在 Media Query 當中,搭配 clamp() 的使用是相當適合的!當然,你想要做其他文字上的操作也是可以,只是,畢竟是計算尺寸,所以文字大小就不在前端設計師的掌控範圍內了,這一點就需要自行斟酌。
 
 
        ![[CSS] Flex/Grid Layout Modules, part 16](/content/images/size/w960/2022/05/grid-sample-80-1.png) 
            ![[CSS] Flex/Grid Layout Modules, part 15](/content/images/size/w960/2022/01/grid-sample-73-1.png) 
            ![[CSS] Flex/Grid Layout Modules, part 14](/content/images/size/w960/2021/09/grid-sample-70-1.png)