<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          什么!一個(gè)項(xiàng)目給了8個(gè)字體包???

          共 6986字,需瀏覽 14分鐘

           ·

          2023-08-01 19:21

          點(diǎn)擊上方 前端Q,關(guān)注公眾號(hào)

          回復(fù)加群,加入前端Q技術(shù)交流

          ?? 遇到的問(wèn)題

          在一個(gè)新項(xiàng)目中,設(shè)計(jì)統(tǒng)一了項(xiàng)目中所有的字體,并提供了字體包。在項(xiàng)目中需要按需引入這些字體包。

          首先,字體包的使用分為了以下幾種情況:

          1. 無(wú)特殊要求的語(yǔ)言使用字體A,阿拉伯語(yǔ)言使用字體B;
          2. 加粗、中等、常規(guī)、偏細(xì)四種樣式,AB兩種字體分別對(duì)應(yīng)使用 BoldMediumRegularThin 四種字體包;

          所以,我現(xiàn)在桌面上擺著 8 個(gè)字體包:

          • A-Bold.tff
          • A-Medium.tff
          • A-Regular.tff
          • A-Thin.tff
          • B-Bold.tff
          • B-Medium.tff
          • B-Regular.tff
          • B-Thin.tff

          不同語(yǔ)言要使用不同的字體包,不同粗細(xì)也要使用不同的字體包!

          還有一個(gè)前提是,設(shè)計(jì)給的設(shè)計(jì)圖都是以字體A為準(zhǔn),所以在 Figma 中復(fù)制出來(lái)的 CSS 代碼中字體名稱(chēng)都是A。

          剛接到這個(gè)需求時(shí)還是比較懵的,一時(shí)想不出來(lái)怎么樣才能以最少的邏輯判斷最少的文件下載最少的代碼改動(dòng)去實(shí)現(xiàn)在不同情況下自動(dòng)的去選擇對(duì)應(yīng)的字體包。

          因?yàn)橐婕暗秸Z(yǔ)言的判斷,最先想到的還是通過(guò) JS,然后去添加相應(yīng)的類(lèi)名。但這樣也只能判斷語(yǔ)言使用A或B,粗細(xì)還是解決不了。

          image.png

          看來(lái)還是要用 CSS 解決。

          首先我將所有的8個(gè)字體先定義好:

          @font-face {
              font-family: A-Bold;
              srcurl('./fonts/A-Bold.ttf');
          }

          /* ... */

          @font-face {
              font-family: B-Thin;
              srcurl('./fonts/B-Thin.ttf');
          }
          image.png

          ???? 如何根據(jù)粗細(xì)程度自動(dòng)選擇對(duì)應(yīng)字體包

          有同學(xué)可能會(huì)問(wèn),為什么不直接使用 font-weight 來(lái)控制粗細(xì)而是用不同的字體包呢?

          我們來(lái)看下面這個(gè)例子,我們使用同一個(gè)字體, font-weight 分別設(shè)置為900、500、100,結(jié)果我們看到的字體粗細(xì)是一樣的。

          對(duì)的,很多字體不支持 font-weight 所以我們需要用不同粗細(xì)的字體包。

          image.png

          所以,我們可以通過(guò) @font-face 中的 font-weight 屬性來(lái)設(shè)置字體的寬度:

          @font-face {
              font-family: A;
              srcurl('./fonts/A-Bold.ttf');
            font-weight600;
          }
          @font-face {
              font-family: A;
              srcurl('./fonts/A-Medium.ttf');
            font-weight500;
          }
          @font-face {
              font-family: A;
              srcurl('./fonts/A-Regular.ttf');
            font-weight400;
          }
          @font-face {
              font-family: A;
              srcurl('./fonts/A-Thin.ttf');
            font-weight300;
          }

          注意,這里我們把字體名字都設(shè)為相同的,如下圖所示,這樣我們就成功的解決了第一個(gè)問(wèn)題:不同粗細(xì)也要使用不同的字體包;

          image.png

          并且,如果我們只是定義而未真正使用時(shí),不會(huì)去下載未使用的字體包,再加上字體包的緩存策略,就可以最大程度節(jié)省帶寬:

          image.png

          ?? 如何根據(jù)不同語(yǔ)言自動(dòng)選擇字體包?

          通過(guò)張?chǎng)涡竦牟┛驼业搅私鉀Q辦法,使用 unicode-range 設(shè)置字符 unicode 范圍,從而自定義字體包。

          unicode-range 是一個(gè) CSS 屬性,用于指定字體文件所支持的 Unicode 字符范圍,以便在顯示文本時(shí)選擇適合的字體。

          它的語(yǔ)法如下:

          @font-face {
            font-family"Font Name";
            srcurl("font.woff2"format("woff2");
            unicode-range: U+0020-007E, U+4E00-9FFF;
          }

          在上述例子中,unicode-range 屬性指定了字體文件支持的字符范圍。使用逗號(hào)分隔不同的范圍,并使用 U+XXXX-XXXX 的形式表示 Unicode 字符代碼的范圍。

          通過(guò)設(shè)置 unicode-range 屬性,可以?xún)?yōu)化字體加載和頁(yè)面渲染性能,只加載所需的字符范圍,減少不必要的網(wǎng)絡(luò)請(qǐng)求和資源占用。

          通過(guò)查表得知阿拉伯語(yǔ)的 unicode 的范圍為:U+06??, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF, U+10A60-10A7F, U+10A80-10A9F 這么幾個(gè)區(qū)間。所以我們?cè)O(shè)置字體如下,因?yàn)樵O(shè)計(jì)以 A 字體為準(zhǔn),所以在 Figma 中給出的樣式代碼字體名均為 A,所以我們把 B 字體的字體名也設(shè)置為 A:

          image.png

          當(dāng)使用字體的字符中命中 unicode-rang 的范圍時(shí),自動(dòng)下載相應(yīng)的字體包。

          @font-face {
              font-family: A;
              srcurl('./fonts/A-Bold.ttf');
              font-weight600;
          }

          @font-face {
              font-family: A;
              srcurl('./fonts/A-Medium.ttf');
              font-weight500;
          }

          @font-face {
              font-family: A;
              srcurl('./fonts/A-Regular.ttf');
              font-weight400;
          }

          @font-face {
              font-family: A;
              srcurl('./fonts/A-Thin.ttf');
              font-weight300;
          }

          :root {
              --ARABIC_UNICODE_RANGE: U+06??, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF, U+10A60-10A7F, U+10A80-10A9F;
          }
          @font-face {
              font-family: A;
              srcurl('./fonts/B-Bold.ttf');
              font-weight600;
              unicode-rangevar(--ARABIC_UNICODE_RANGE);
          }
          @font-face {
              font-family: A;
              srcurl('./fonts/B-Medium.ttf');
              font-weight500;
              unicode-rangevar(--ARABIC_UNICODE_RANGE);
          }
          @font-face {
              font-family: A;
              srcurl('./fonts/B-Regular.ttf');
              font-weight400;
              unicode-rangevar(--ARABIC_UNICODE_RANGE);
          }
          @font-face {
              font-family: A;
              srcurl('./fonts/B-Thin.ttf');
              font-weight300;
              unicode-rangevar(--ARABIC_UNICODE_RANGE);
          }
          p {
              font-family: A;
          }

          總結(jié)

          遇到的問(wèn)題:

          1. 兩種字體,B 字體為阿拉伯語(yǔ)使用,A 字體其他語(yǔ)言使用。根據(jù)語(yǔ)言自動(dòng)選擇。
          2. 根據(jù)字寬自動(dòng)選擇相應(yīng)的字體包。
          3. 可以直接使用 Figma 中生成的樣式而不必每次手動(dòng)改動(dòng)。
          4. 盡可能節(jié)省帶寬。

          我們通過(guò) font-weight 解決了問(wèn)題2,并通過(guò) unicode-range 解決了問(wèn)題1。

          并且實(shí)現(xiàn)了按需下載相應(yīng)字體包,不使用時(shí)不下載。

          Figma 中的代碼可以直接復(fù)制粘貼,無(wú)需任何修改即可根據(jù)語(yǔ)言和自寬自動(dòng)使用相應(yīng)字體包。


          參考資料:www.zhangxinxu.com/wordpress/2…[1]

          關(guān)于本文

          作者:Mengke

          https://juejin.cn/post/7251884086536781880


          往期推薦


          Shopee團(tuán)隊(duì)hippo - 提升團(tuán)隊(duì)工程效率的工具
          為什么你非常不適應(yīng) TypeScript
          【干貨】被裁員前,我為公司做的15個(gè)前端基建分享~

          最后


          • 歡迎加我微信,拉你進(jìn)技術(shù)群,長(zhǎng)期交流學(xué)習(xí)...

          • 歡迎關(guān)注「前端Q」,認(rèn)真學(xué)前端,做個(gè)專(zhuān)業(yè)的技術(shù)人...

          點(diǎn)個(gè)在看支持我吧

          瀏覽 379
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV无码在线影视 | 国产伦子伦精品 | 亚洲成人导航在线 | 女人18毛片水真多18精品 | 一道本一区二区 |