1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        網站圖標開發(fā)指南(精)

        共 12760字,需瀏覽 26分鐘

         ·

        2021-06-01 08:52

        圖標是網站中非常友好的附加物,許多網站都會使用各種圖標來美化頁面樣式,給用戶提供更好的指引。本文將會和大家一起學習頁面圖標的發(fā)展歷史,以及最優(yōu)的解決方案。

        • 傳統(tǒng)圖標
        • 字體圖標
        • SVG 圖標

        傳統(tǒng)圖標

        編寫圖標最簡單的方式就是使用一張圖片,如:

        <html>
          <body>
            圖標 <img src="xxx.png" />
          </body>
        </html>

        我剛開始寫頁面的時候就是這樣做的,感覺 so easy,直到業(yè)務變得越來越復雜,我就不得不思考以下幾個問題:

        • 圖標需要適配多個客戶端
        • 圖標太多需要優(yōu)化
        • 圖標需要動態(tài)修改顏色

        對于適配多個客戶端的問題,設計師們通常都會給我們提供多個尺寸的設計圖(@1x 圖、@2x 圖),于是我們就可以根據不同的客戶端來選擇對應尺寸的圖片。

        通常使用方式是:媒體類型 或 配置 srcset

        例如:

        <html>
          <head>
            <style>
              /* 使用媒體查詢,為每個端適配不同尺寸的圖片 */
              .@media screen and (max-width: 300px) {
                .img {
                  background-imageurl("1x.png");
                }
              }
              .@media screen and (max-width: 600px) {
                .img {
                  background-imageurl("2x.png");
                }
              }
            
        </style>
          </head>
          <body>
            <!-- srcset 可以讓不同的客戶端自動匹配合適尺寸的圖片-->
            <!-- 如:當設備像素比為 2 時,瀏覽器會自動選擇 2x 圖進行渲染-->
            <img src="1x.png" srcset="1x.png 1x, 2x.png 2x" />
          </body>
        </html>

        通過上面的方法,多客戶端適配問題解決了,但我們使用了多張內容相同、尺寸不同的圖標,這無疑增加了圖片的數量。

        隨著圖片的增多,圖片管理就是一個問題。每一張圖片都會發(fā)起一個 HTTP 請求,而瀏覽器并行加載同一域名下的請求是有限制的,太多的圖片無法全部并行加載,就會進行排隊加載,排在后面的圖片也就不能及時得到渲染。

        通常,解決大量圖片 HTTP 請求,有兩種方式:

        • 雪碧圖
        • Base64 圖

        雪碧圖指的是,將所有小圖片合并成一張大圖片。在瀏覽器渲染時,這張大圖片只需要發(fā)起一次 HTTP 請求,然后就被瀏覽器緩存起來了,當再次使用該圖片時,就會直接從緩存中進行讀取,從而避免了發(fā)起多次 HTTP 請求。

        首先,我們需要將許多小圖片合成一張大圖:

        然后在 CSS 中進行定位。

        .icon1,
        .icon2,
        .icon3 {
          width54px;
          height54px;
          backgroundurl("../大圖.png");
        }
        /* 定位背景圖,讓圖片顯示到對應的位置 */
        .icon1 {
          background-position: -168px 0px;
        }
        .icon2 {
          background-position: -56px 0px;
        }
        .icon3 {
          background-position0px 0px;
        }

        可以看到,使用雪碧圖布局時,所有的圖片都使用了同一張大圖,然后使用背景圖去定位,以區(qū)分不同的小圖標。

        總結一下雪碧圖的特點:

        • 只需發(fā)起一次 HTTP 請求。
        • 只能通過 CSS 背景圖渲染。
        • 如果只用到了大圖中的一張小圖,也必須加載整張大圖,有點浪費資源。
        • 不利于維護,每次新增圖標時,都不能影響到之前已經排好的圖標,所以生成工具需要更智能。

        接下來,我們看一下 Base64 圖:

        Base64 圖指的是,將一張圖片數據編碼成一串字符串,并使用該字符串代替圖像地址。

        <img
          src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNo8zjsOxCAMBFB/KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIBhH5EAB8b+Tlt9MY"
        />

        可以看到,圖片的 src 并不是一個地址,而是一個字符串,這樣甚至可以不發(fā)起 HTTP 請求,就能渲染圖片。

        Base64 的原理是 Data URLs,即:前綴為 data: 協議的 URL,允許開發(fā)者向 HTML 中嵌入小文件。

        總結一下 Base64 圖的特點:

        • 無 HTTP 請求。
        • 圖片內容由字符串表示,通常會很長,這必定會增加 HTML 的大小。
        • Base64 并不是 url,所以不能進行緩存。
        • 適用于極小的圖片,如:1x1 的小圖,用作背景圖,重復渲染平鋪整個頁面。

        Ok,我們來總結一下傳統(tǒng)圖片畫圖標的幾種方式:

        最后剩下動態(tài)修改圖片顏色的問題,這個就比較難控制了,可以用 CSS Filter 去做濾鏡,通過調整圖片的模糊度、對比度、灰度、透明度等,間接地改變圖片顏色。

        例如:

        img {
          // 讓圖片變灰
          filtergrayscale(100%);
          // 讓圖片變模糊
          filterblur(5px);
          // ...
        }

        但是 CSS Filter 能修改的顏色是有限的,如果想任意修改圖標顏色,我們繼續(xù)往下看。

        字體圖標

        隨著互聯網的不斷發(fā)展,字體圖標逐漸來到了我們的視野,它可以像處理文字一樣去處理圖標,大大地提高了圖標的靈活性。使用字體圖標可以非常輕松地修改圖標顏色。

        字體圖標的使用方式

        字體圖標使用方式特別方便,我們只需要在頁面中引入對應的字體文件,然后編寫對應的字符就可以了。

        字體圖標有兩種寫法:

        • 直接編寫 Unicode 編碼。
        • 使用偽類去寫 Unicode 編碼。

        例如:

        <html>
          <head>
            <style>
              /* 首先引入字體文件 */
              @font-face {
                font-family"iconfont";
                srcurl("iconfont.eot"), url("iconfont.woff"format("woff"), url("iconfont.ttf")
                    format("truetype"), url("iconfont.svg#iconfont"format("svg");
              }
              /* 定義字體類 */
              .iconfont {
                font-family"iconfont";
                font-size16px;
              }
              /* 在偽類中編寫 unicode 字符 */
              .icon-edit:before {
                content"\e603";
              }
            
        </style>
          </head>
          <body>
            <!-- 使用 &# + unicode 編碼可以渲染對應的字符。 -->
            直接使用字符編碼:
            <i class="iconfont">&#xe603;</i> 使用類名渲染(將字符寫在了偽類中):<i
              class="iconfont icon-edit"
              style="color:red"
            >
        </i>
          </body>
        </html>

        可以看到,我們可以像處理文字一樣去修改字體圖標的顏色。

        字體圖標的原理

        字體圖標的本質是一種字符,而字符又是字體渲染出來的,字體決定了我們在鍵盤上敲打的字符最終在頁面上長什么樣。

        這就好比書法家寫字,不同的字體就是不同的書法家,不同的書法家雖然都在寫同一個字,但是由于字跡的不同,寫出來的文字也就大不相同。

        試想一下:有一個特立獨行的書法家,他并不按照常規(guī)的寫法來寫字,他寫出來的字都是一個個的小圖標,那不就是字體圖標了嗎 ??

        其實,書法家寫字這個道理,在網頁中也是一樣的。

        頁面在渲染文字的時候,會先將文字轉換為對應的 unicode 編碼,然后根據 css 中配置的 @font-face url 找到對應的字體文件(eot ttf woff 等),接下來在該字體文件中找到這個 unicode 編碼對應的繪制外形,最后繪制在頁面上。

        我們看到的內容 = fontFamily(unicode);

        深入字符編碼

        在計算機中,我們能看到的所有字符,底層都是用二進制來表示的,如:空格符在二進制中就是 00100000,大寫的字母 A 在二進制中就是 01000001 。

        為了方便維護字符和二進制的關系,前輩們將這些對應關系記錄成一張表。

        ID字符二進制
        32空格符00100000
        65A01000001

        這個表就是我們常說的字符編碼,上表即 ASCII 編碼的一部分。

        最初的 ASCII 編碼只能表示 128 個符號,主要存儲的是 26 個英文字母的大小寫和數字等。有了 ASCII 編碼后,我們就能編寫對應的字體去渲染表中的字符了,但其他沒有被記錄的符號也就無法顯示了,如:不同國家的漢字、emoji 符號等。

        為了解決中文字符編碼問題,國家制定了 GB2312 編碼,該編碼收錄了 6763 個漢字,涵蓋了中國大陸 99.75% 的使用頻率,能滿足絕大多數的漢字需求。

        但 GB2312 編碼只適用于中文,而世界上還有 200 多個國家,他們也有自己獨特的文字,難道每一個國家都需要自制一套字符編碼嗎?

        其實不用,在 1991 年 10 月,誕生了 unicode 編碼,它制定了一套統(tǒng)一的編碼標準,收納了世界上所有國家的文字符號,到目前為止,已經有 100 多萬個符號。

        unicode 最多 4 個字節(jié),一個字節(jié) 8 個比特位(表示二進制中的 0 或 1),也就是 2**32 個狀態(tài),完全可以容納世界上所有的符號。

        所以,任何一個符號,都可以在 unicode 編碼中被找到。

        總結一下字體圖標的特點:

        • 字體圖標是矢量圖,即使放大也不會變模糊。
        • 字體圖標可以通過 CSS 樣式進行控制,使用更加靈活。
        • 字體文件一般比較大,但可以將不用的字體刪掉。

        最后,字體圖標雖好,但它的本質仍然一種文字,所以 CSS 在設置 color 時只能選一種顏色,如果我們想制作一個多色的小圖標,也就無能為力了。

        SVG 圖標

        SVG 誕生于 1999 年,目的是用來繪制矢量圖形,它主要通過定義必要的線和形狀來創(chuàng)建一個圖形。

        SVG 圖標使用方式

        SVG 采用 XML 格式的語法來畫圖,例如:

        <html>
          <head>
            <style>
              .my-style {
                /* 控制填充色 */
                fill: red;
              }
              .my-style use {
                color: orange;
              }
            
        </style>
          </head>
          <body>
            <svg style="display: none;">
              <symbol viewBox="0 0 24 24" id="heart">
                <path
                  d="M17,0c-1.9,0-3.7,0.8-5,2.1C10.7,0.8,8.9,0,7,0C3.1,0,0,3.1,0,7c0,6.4,10.9,15.4,11.4,15.8 c0.2,0.2,0.4,0.2,0.6,0.2s0.4-0.1,0.6-0.2C13.1,22.4,24,13.4,24,7C24,3.1,20.9,0,17,0z"
                >
        </path>
              </symbol>
            </svg>

            <svg class="my-style">
              <use xlink:href="#heart" />
            </svg>
          </body>
        </html>

        可以看到,首先我們把需要使用的圖標封裝到 symbol 標簽中,在使用時只需要 use 一下就可以了。這跟我們定義一個 CSS class 然后再去 HTML 中引用是一個道理。

        通常的 SVG 圖標庫會把所有用到的圖標封裝到一個 JS 文件中,我們只需要引入這個 JS 文件,然后就能直接 use 對應的圖標了。

        我們再看一個多色圖標的例子:

        <html>
          <head>
            <style>
              /* svg 中的元素存在于 shadom 中,可以通過自定義變量傳遞參數 */
              .icon {
                width100px;
                height100px;
                margin-right10px;
              }
              .icon--fill {
                fill: grey;
              }
              .icon--color {
                fill#ef5b49;
                --handle-color#c13127;
                --cup-color#ef5b49;
                --smoke-color#cacaea;
              }
              .icon--color-alt {
                fill#2f3fff;
                --handle-color#1f2bac;
                --cup-color#2f3fff;
                --smoke-color#a5acbd;
              }
            
        </style>
          </head>
          <body>
            <svg xmlns="http://www.w3.org/2000/svg" class="hidden">
              <symbol id="icon-coffee" viewBox="0 0 20 20">
                <title>icon-coffee</title>
                <!-- 使用自定義變量 -->
                <path
                  fill="var(--handle-color)"
                  d="M15,17H14V9h3a3,3,0,0,1,3,3h0A5,5,0,0,1,15,17Zm1-6v3.83A3,3,0,0,0,18,12a1,1,0,0,0-1-1Z"
                />

                <rect
                  fill="var(--cup-color)"
                  x="1"
                  y="7"
                  width="15"
                  height="12"
                  rx="3"
                  ry="3"
                />

                <path
                  fill="var(--smoke-color)"
                  d="M7.07,5.42a5.45,5.45,0,0,1,0-4.85,1,1,0,0,1,1.79.89,3.44,3.44,0,0,0,0,3.06,1,1,0,0,1-1.79.89Z"
                />

                <path
                  fill="var(--smoke-color)"
                  d="M3.07,5.42a5.45,5.45,0,0,1,0-4.85,1,1,0,0,1,1.79.89,3.44,3.44,0,0,0,0,3.06,1,1,0,1,1-1.79.89Z"
                />

                <path
                  fill="var(--smoke-color)"
                  d="M11.07,5.42a5.45,5.45,0,0,1,0-4.85,1,1,0,0,1,1.79.89,3.44,3.44,0,0,0,0,3.06,1,1,0,1,1-1.79.89Z"
                />

              </symbol>
            </svg>
            使用
            <svg class="icon icon--color" aria-hidden="true">
              <use xlink:href="#icon-coffee" href="#icon-coffee" />
            </svg>
          </body>
        </html>

        可以看到,SVG 和 HTML 一樣具有樹形結構,結構中的 path 都是圖形中的一個區(qū)域,這些區(qū)域可以被 CSS 選擇器匹配到。當我們匹配到對應的區(qū)域時,就能進行對應的顏色修改了,一張多色的 SVG 圖也就做好了。

        總結一下 SVG 圖標的特點:

        • 支持動態(tài)修改多個區(qū)域的顏色
        • 支持漸變色
        • 矢量圖,放大也不會變模糊

        思考與總結

        本文介紹了 3 種小圖標的使用方式,這里做一個簡單回顧。

        • 傳統(tǒng)圖標,簡單粗暴,切好圖就能用,但需考慮不同尺寸以兼容不同設備,圖片的顏色不好更改。
        • 字體圖標,需要引入字體文件,然后編寫特定的字符,可以很方便的修改顏色,但只能是單色。
        • SVG 圖標,需要引入預先定義好圖標的 SVG 文件,然后將具體的圖標 use 出來即可,可以分別修改圖標中不同部位的顏色。

        總體來說,3 種圖標使用起來都很簡單,而 SVG 圖標則是一個大趨勢,我們可以視具體情況來做選擇。

        好文!點個在看!
        瀏覽 41
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            免费看黄视频在线观看 | 粉嫩av片 | 国精产品视频久久 | 996视频| 男女裸体性婬乱视频免费看 | 奴役支配性狂虐xxxxx在线 | 操逼视频性爱三级 | 10000部成人A片无码播放 | 枫ふうあ女教师av播放 | 亚洲国产欧美手机在线 |