Web 上中文與英文混的字框-要如何限定長度與高度?
喜歡作者的文章嗎?馬上按「關注」,當作者發佈新文章時,思書™就會 email 通知您。
思書是公開的寫作平台,創新的多筆名寫作方式,能用不同的筆名探索不同的寫作內容,無限寫作創意,如果您喜歡寫作分享,一定要來試試! 《 加入思書》
思書™是自由寫作平台,本文為作者之個人意見。
文章資訊
分類於:
標籤:
日期:
創作於:2018/04/04,最後更新於:2018/04/06。
合計:973字
給本文個喜歡
或不
關於作者
很久以前就是個「寫程式的」,其實,什麼程式都不熟⋯⋯
就,這會一點點,那會一點點⋯⋯
看看作者的其他文章
看看思書的其他文章
在網頁上排版,我們最常希望的就是設定一個固定大小的框,但是如果碰到中文與英文混合的情況,最討厭的就是,很難這定他們的長度與高度,怎麼弄他們的長度不一樣,下面就是一個例子:
也就是說,我們在 server 上,因為 UTF8 的不定碼數特性,我們不能用 byte 數,或是字元數來算字串寬,要算高,那更是不可能,所以,這造成我們不能用 turncate 簡單的得到一個固定長度字串,更討厭的是,連 length 都是轉換過的,例如:
length 回應的是字元數目:"寫一本新書 - a book".length = 14 ,中文英文都會算是一個字元,夠討厭吧!還不要算在作業系統或是瀏覽器上,文字會因為字體有大小寬度(kerning)改變。所以,第一個結論是:
UTF 中文與英文混的字框的確實高寬,是不能在 Server 上設定的。
用 Server 後台算是不對的,那就只能用前台了,還好,以下的 CSS -webkit-line-clamp 好像救星:
要更安全的,可以加上 fallback,例如:
line-height: 16px;
max-height: 32px;
在這裡,line-height = N,在本例中可以是16px, 2rem,... 等等,max-height 是 = N * 行數,在本例中就是 16px * 2 or 2rem * 2。
討厭的是,-webkit-line-clamp,不是所有的瀏覽器都能用,IE 是一定不能用的,Edge 跟 FireFox 也不能用就很討厭!所以,要安全的話,要加寫支援,大概是這樣:
webkit-line-clamp 是個還化外之地,有不少怪怪的問題:
中文支援:在這篇介紹中,說 line-champ 一定要找空白,所以連在一起的中文不能用,我倒是發現中文可以用,沒問題,但是有發現在 Mac Safari 上有出現怪字,我認爲這是 Safari 的問題。 另外,當文字是被 <p> 包起來時(在 rails 中,我們常用的 simple_format 輸出),會發生 「...」不見得問題,這算是個中問題!
斷句的點:webkit-line-clamp 斷的點真的很奇怪,要給他搞怪一百分,中文其實還好,但是英文我有發現 general 給你斷在 gene... 一整個無言,這樣其實問題很大,有些英文斷在不該斷的地方會出事的,中文的問題現在還沒看到,這些讓我覺得 webkit-line-clamp 像是未開發完全,這也是啦,不然大家早就用了。
那,webkit-line-clamp 到底可不可以用呢?好問題,我也不知道,但是我很想用,我是先用 rails 中,我們常用的 simple_format 輸出,simple_format 會將文字依斷句,轉包在 <p> 中,再用 webkit-line-clamp,來輸出,很好用,問題好像也不大,唯一就是英文斷句,這有點恐怖,所以,結論二:
如果你不怕英文亂斷字,可以用 webkit-line-clamp
那要是客戶罵,說斷句錯誤?那我就會換回來,再繼續用 server 來大概算行數了。
後記:我最後還是放棄了,這 webkit-line-clamp 的行為真的不好預測,而且相當的 bugy,在 Windows 上好像還好,但是在 Safari 上,我試了 iOS 及 Mac,有時整段都不會顯示,有時又會,更吊詭的是,進入開發模式,改了其中的一個值,本來不顯示的又會了,在調回原來不顯示的值,還是可以顯示,所以,放棄,這就是要用怪怪 CSS 的辛苦處,你要試很多很多的 browsers,但是永遠有更多的例外。