主頁 > 企業開發 > 記錄--什么!一個專案給了8個字體包???

記錄--什么!一個專案給了8個字體包???

2023-07-06 09:09:15 企業開發

這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

遇到的問題

在一個新專案中,設計統一了專案中所有的字體,并提供了字體包,在專案中需要按需引入這些字體包,

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

  1. 無特殊要求的語言使用字體A,阿拉伯語言使用字體B;
  2. 加粗、中等、常規、偏細四種樣式,AB兩種字體分別對應使用 BoldMediumRegularThin 四種字體包;

所以,我現在桌面上擺著 8 個字體包:

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

不同語言要使用不同的字體包,不同粗細也要使用不同的字體包!

還有一個前提是,設計給的設計圖都是以字體A為準,所以在 Figma 中復制出來的 CSS 代碼中字體名稱都是A,

剛接到這個需求時還是比較懵的,一時想不出來怎么樣才能以最少的邏輯判斷最少的檔案下載最少的代碼改動去實作在不同情況下自動的去選擇對應的字體包,

因為要涉及到語言的判斷,最先想到的還是通過 JS,然后去添加相應的類名,但這樣也只能判斷語言使用A或B,粗細還是解決不了,

看來還是要用 CSS 解決,

首先我將所有的8個字體先定義好:

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

/* ... */

@font-face {
    font-family: B-Thin;
    src: url('./fonts/B-Thin.ttf');
}

 

如何根據粗細程度自動選擇對應字體包

有同學可能會問,為什么不直接使用 font-weight 來控制粗細而是用不同的字體包呢?

我們來看下面這個例子,我們使用同一個字體, font-weight 分別設定為900、500、100,結果我們看到的字體粗細是一樣的,

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

所以,我們可以通過 @font-face 中的 font-weight 屬性來設定字體的寬度:
@font-face {
    font-family: A;
    src: url('./fonts/A-Bold.ttf');
		font-weight: 600;
}
@font-face {
    font-family: A;
    src: url('./fonts/A-Medium.ttf');
		font-weight: 500;
}
@font-face {
    font-family: A;
    src: url('./fonts/A-Regular.ttf');
		font-weight: 400;
}
@font-face {
    font-family: A;
    src: url('./fonts/A-Thin.ttf');
		font-weight: 300;
}

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

 并且,如果我們只是定義而未真正使用時,不會去下載未使用的字體包,再加上字體包的快取策略,就可以最大程度節省帶寬:

如何根據不同語言自動選擇字體包?

通過張鑫旭的博客找到了解決辦法,使用 unicode-range 設定字符 unicode 范圍,從而自定義字體包,

unicode-range 是一個 CSS 屬性,用于指定字體檔案所支持的 Unicode 字符范圍,以便在顯示文本時選擇適合的字體,

它的語法如下:

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

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

通過設定 unicode-range 屬性,可以優化字體加載和頁面渲染性能,只加載所需的字符范圍,減少不必要的網路請求和資源占用,

通過查表得知阿拉伯語的 unicode 的范圍為:U+06??, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF, U+10A60-10A7F, U+10A80-10A9F 這么幾個區間,所以我們設定字體如下,因為設計以 A 字體為準,所以在 Figma 中給出的樣式代碼字體名均為 A,所以我們把 B 字體的字體名也設定為 A:

 當使用字體的字符中命中 unicode-rang 的范圍時,自動下載相應的字體包,

@font-face {
    font-family: A;
    src: url('./fonts/A-Bold.ttf');
    font-weight: 600;
}

@font-face {
    font-family: A;
    src: url('./fonts/A-Medium.ttf');
    font-weight: 500;
}

@font-face {
    font-family: A;
    src: url('./fonts/A-Regular.ttf');
    font-weight: 400;
}

@font-face {
    font-family: A;
    src: url('./fonts/A-Thin.ttf');
    font-weight: 300;
}

: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;
    src: url('./fonts/B-Bold.ttf');
    font-weight: 600;
    unicode-range: var(--ARABIC_UNICODE_RANGE);
}
@font-face {
    font-family: A;
    src: url('./fonts/B-Medium.ttf');
    font-weight: 500;
    unicode-range: var(--ARABIC_UNICODE_RANGE);
}
@font-face {
    font-family: A;
    src: url('./fonts/B-Regular.ttf');
    font-weight: 400;
    unicode-range: var(--ARABIC_UNICODE_RANGE);
}
@font-face {
    font-family: A;
    src: url('./fonts/B-Thin.ttf');
    font-weight: 300;
    unicode-range: var(--ARABIC_UNICODE_RANGE);
}
p {
    font-family: A;
}

總結

遇到的問題:

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

我們通過 font-weight 解決了問題2,并通過 unicode-range 解決了問題1,

并且實作了按需下載相應字體包,不使用時不下載,

Figma 中的代碼可以直接復制粘貼,無需任何修改即可根據語言和自寬自動使用相應字體包,

本文轉載于:

https://juejin.cn/post/7251884086536781880

如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/556647.html

標籤:其他

上一篇:Flex布局常用屬性詳解

下一篇:返回列表

標籤雲
其他(162106) Python(38266) JavaScript(25524) Java(18290) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7285) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4611) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1989) .NET技术(1985) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 記錄--什么!一個專案給了8個字體包???

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 遇到的問題 在一個新專案中,設計統一了專案中所有的字體,并提供了字體包。在專案中需要按需引入這些字體包。 首先,字體包的使用分為了以下幾種情況: 無特殊要求的語言使用字體A,阿拉伯語言使用字體B; 加粗、中等、常規、偏細四種樣式,AB兩種 ......

    uj5u.com 2023-07-06 09:09:15 more
  • Flex布局常用屬性詳解

    1. Flex布局與回應式布局 1.1 為什么需要回應式布局? 在電腦PC端,使用浮動,定位同時使用像素px單位就可以完成大部分布局,而且布局完之后不會有大問題,但是到了移動端,移動設備的螢屏尺寸多種多樣,從小螢屏的智能手機到大螢屏的平板電腦,甚至是可穿戴設備,簡單地運用和PC端一樣的方式就會出現一 ......

    uj5u.com 2023-07-06 09:03:13 more
  • 提升網站速度與用戶體驗!了解Whirl動態加載庫的最新技術

    Whirl動態加載庫是一種先進的技術,能夠顯著提升網站加載速度和用戶體驗。傳統的網頁加載方式需要一次性加載所有內容,導致頁面加載緩慢,用戶等待時間長。而Whirl動態加載庫則將網頁拆分成多個部分,根據用戶需求和瀏覽行為來動態加載內容,只在用戶滾動到相應部分時才加載,從而大幅減少不必要的網路請求和加載... ......

    uj5u.com 2023-07-06 09:01:19 more
  • 記錄--什么!一個專案給了8個字體包???

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 遇到的問題 在一個新專案中,設計統一了專案中所有的字體,并提供了字體包。在專案中需要按需引入這些字體包。 首先,字體包的使用分為了以下幾種情況: 無特殊要求的語言使用字體A,阿拉伯語言使用字體B; 加粗、中等、常規、偏細四種樣式,AB兩種 ......

    uj5u.com 2023-07-06 09:00:44 more
  • Flex布局常用屬性詳解

    1. Flex布局與回應式布局 1.1 為什么需要回應式布局? 在電腦PC端,使用浮動,定位同時使用像素px單位就可以完成大部分布局,而且布局完之后不會有大問題,但是到了移動端,移動設備的螢屏尺寸多種多樣,從小螢屏的智能手機到大螢屏的平板電腦,甚至是可穿戴設備,簡單地運用和PC端一樣的方式就會出現一 ......

    uj5u.com 2023-07-06 08:59:50 more
  • Fleet Farm EDI 需求詳解

    Fleet Farm 是一家成立于1955年的美國賣場,總部位于威斯康星州。作為一個全方位的零售商,Fleet Farm 提供了廣泛的商品和服務,涵蓋了農業用品、家居裝飾、戶外用品、汽車用品、園藝用品等多個領域。他們的使命是為客戶提供高品質的產品和卓越的服務,以滿足客戶的各種需求。多年來,Fleet ......

    uj5u.com 2023-07-06 08:58:44 more
  • 1.7 完善自定位ShellCode后門

    在之前的文章中,我們實作了一個正向的匿名管道`ShellCode`后門,為了保證文章的簡潔易懂并沒有增加針對呼叫函式的動態定位功能,此類方法在更換系統后則由于地址變化導致我們的后門無法正常使用,接下來將實作通過PEB獲取`GetProcAddrees`函式地址,并根據該函式實作所需其他函式的地址自定... ......

    uj5u.com 2023-07-06 08:53:24 more
  • Fleet Farm EDI 需求詳解

    Fleet Farm 是一家成立于1955年的美國賣場,總部位于威斯康星州。作為一個全方位的零售商,Fleet Farm 提供了廣泛的商品和服務,涵蓋了農業用品、家居裝飾、戶外用品、汽車用品、園藝用品等多個領域。他們的使命是為客戶提供高品質的產品和卓越的服務,以滿足客戶的各種需求。多年來,Fleet ......

    uj5u.com 2023-07-06 08:47:45 more
  • 1.7 完善自定位ShellCode后門

    在之前的文章中,我們實作了一個正向的匿名管道`ShellCode`后門,為了保證文章的簡潔易懂并沒有增加針對呼叫函式的動態定位功能,此類方法在更換系統后則由于地址變化導致我們的后門無法正常使用,接下來將實作通過PEB獲取`GetProcAddrees`函式地址,并根據該函式實作所需其他函式的地址自定... ......

    uj5u.com 2023-07-06 08:47:07 more
  • 記錄--組件庫的 Table 組件表頭表體是如何實作同步滾動?

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在使用 Vue 3 組件庫 Naive UI 的資料表格組件 DataTable 時碰到的問題,NaiveUI 的資料表格組件 DataTable 在固定頭部和列的示例中,在鍵盤操作下表格橫向滾動會有問題,本文是記錄下解決問題的程序 ......

    uj5u.com 2023-07-05 08:41:21 more