目錄
二、利用canvas 來繪製##因為需要合成影像,所以需要先繪製原有影像。提到影像繪製,可以想到 canvas 繪製,只需要一點點 canvas 基礎知識就足夠了。具體實作如下
四、一些局限性
首頁 web前端 css教學 詳解用SVG為 favicon 新增標識

詳解用SVG為 favicon 新增標識

Sep 07, 2022 am 10:30 AM
css css3 前端 svg

怎麼使用SVG為 favicon 新增標識?以下這篇文章為大家介紹一下使用 SVG 產生帶有標識的 favicon的方法,希望對大家有幫助!

之前做了一個Chrome 插件,可以根據地址的不同生成不同的圖標,這樣可以很方便的區分不同的開發環境,效果如下

主要實作過程其實不複雜,先取得網站favicon,然後給favicon 加入標識,重新繪製生成就行了

##其中,這裡的圖示就是透過SVG 產生的,下面來看看具體實現吧。 【推薦學習:

css影片教學

一、favicon 的取得方式

想知道取得方式,可以先了解設定方式。

一般有兩種方式可以設定網站的

favicon

第一種,透過

link 標籤設定(需要rel="icon"屬性)

<link>
登入後複製
第二種,直接在

網站根目錄放一張favicon.ico(必須是這個名稱,瀏覽器預設的),html 中什麼也不用設定

- 网站目录
    index.html
    favicon.ico
登入後複製
如果以上都沒有設置,那麼大機率會看到以下錯誤

了解這些,獲取就簡單了,先透過

link獲取,只要rel#包含icon就行了

const link = document.querySelector('link[rel~="icon"]');
登入後複製
如果找不到,可以請求

/favicon.ico,這裡直接加入一個link

function getLink(){
    const link = document.querySelector('link[rel~="icon"]');
    if (link) {
        return link
    } else {
        const link = document.createElement('link');
        link.rel = "icon";
        link.href = "/favicon.ico"
        document.head.append(link);
        return link
    }
}
登入後複製
這樣取得的

link就保證存在了,然後就是繪製

二、利用canvas 來繪製##因為需要合成影像,所以需要先繪製原有影像。提到影像繪製,可以想到 canvas 繪製,只需要一點點 canvas 基礎知識就足夠了。具體實作如下

const canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
詳解用SVG為 favicon 新增標識 = new Image();
詳解用SVG為 favicon 新增標識.crossOrigin = 'anonymous';
詳解用SVG為 favicon 新增標識.onload = () => {
    canvas.height = 詳解用SVG為 favicon 新增標識.height;
    canvas.width = 詳解用SVG為 favicon 新增標識.width;
    ctx.drawImage(詳解用SVG為 favicon 新增標識, 0, 0, canvas.width, canvas.height);
    let dataURL = canvas.toDataURL("image/png");
    resolve(dataURL);
    canvas = null;
};
詳解用SVG為 favicon 新增標識.src = url;
登入後複製

由於存在

/favicon.ico

沒有設定的情況,所以需要在詳解用SVG為 favicon 新增標識 載入失敗的時候給一張預設圖<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">詳解用SVG為 favicon 新增標識.onerror = () =&gt; {     resolve(&quot;默认图base64&quot;); }</pre><div class="contentsignin">登入後複製</div></div>這樣就能取得到favicon 的圖像資訊了

三、利用SVG 進行圖片合成

在上面的基礎上,其實可以繼續透過canvas 進行繪製,再繪製一個標籤也不是難事。不過這裡可以採用SVG 的方式來進行繪製,有以下一些優點

    成本更低,比canvas 更易理解
  • ##彈性高,可以透過CSS 進行一些樣式控制
  • 首先,我們可以在HTML 中自由的、像正常網頁開發一樣,繪製這樣一個佈局,相信沒有什麼難度

#
  <strong>local</strong>
  
登入後複製

由於寬度有限,所以需要強製文字換行,超出隱藏,關鍵樣式如下

strong{
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
  text-transform: uppercase;
  background-color: orange;
  color: #fff;
  padding: 0px 2px;
  border-radius: 2px;
  font-size: 12px;
  box-sizing: border-box;
  max-width: 100%;
  width: max-content;
  height: 16px;
  line-height: 16px;
  word-break: break-all;
  overflow: hidden;
}
登入後複製
接著,將這一段html 放入

foreignObject

#標籤中,關於 foreignObject 的作用,有興趣的可以參考張鑫旭老師的這篇文章SVG 簡介與截圖等應用,在這裡,你可以簡單理解為是可以包含HTML 的標籤,而SVG 本身也是一種圖片,這樣就達到了合成圖像的目的

具體實作如下

const link = getLink();
const icon = await 詳解用SVG為 favicon 新增標識2Base64(link.href);
const favicon = `data:image/svg+xml;charset=utf-8,<svg><foreignobject>
  <style>
    html,body{
      height: 100%;
      margin: 0;
      text-align: center;
    }
    詳解用SVG為 favicon 新增標識{
      display: block;
      width: 100%;
      height: 100%;
      object-fit: contain;
    }
    strong{
      position: absolute;
      bottom: 0;
      left: 50%;
      transform: translateX(-50%);
      text-transform: uppercase;
      background-color: ${color};
      color: #fff;
      padding: 0px 2px;
      border-radius: 2px;
      font-size: 12px;
      box-sizing: border-box;
      max-width: 100%;
      width: max-content;
      height: 16px;
      line-height: 16px;
      word-break: break-all;
      overflow: hidden;
    }
  </style>
  <strong>local</strong>
  詳解用SVG為 favicon 新增標識>
  </foreignobject></svg>`.replace(/\n/g, '').replace(/\t/g, '').replace(/#/g, '%23')
登入後複製
這裡需要注意幾點

##詳解用SVG為 favicon 新增標識 標籤在svg 中需要寫成

詳解用SVG為 favicon 新增標識>
    閉合形態,不然會被認為結構錯誤
  • 詳解用SVG為 favicon 新增標識 只能使用內聯圖片,例如base64,這也是為何繪製原始favicon 的原因

  • 如果使用內聯svg,需要對svg 進行轉義

  • 字串中的單雙引號問題也需要注意一下

  • 然後,將產生的SVG 直接設定為favicon

    link.href= favicon;
    登入後複製

這樣就能正常的渲染了~

完整實作可以參考項目:https://github.com/XboxYan/auto-dev-favicon-chrome-plugin

四、一些局限性

首先是兼容性。

目前只有 Chrome 和 Firefox 是支持的,为了兼容其他浏览器,可以用一个 .ico来兜底

<link>
<link>
登入後複製

另外,在 Chrome 上还有一个限制(不知道是不是Chrome 更新后的限制),当 favicon 使用 svg 格式图片时,此时的 svg 会处于一种secure-static-mode,在这种模式下,所有动画都不会执行,会处于第一帧,比如下面这个例子

<svg>
  <foreignobject>
      
        <style>
        html,body{
            margin: 0;
            height: 100%
        }
        div{
            height: 100%;
            background: pink;
            animation: hue 3s infinite;
        }
        @keyframes hue {
            to {
                filter: hue-rotate(360deg)
            }
        }
        </style>
        <div></div>
      
    </foreignobject>
</svg>
登入後複製

很简单的一个背景颜色动画。在 Firefox 上是用作 favicon 是有动画的

但是,Chrome 上却不行,只有禁止的第一帧

所以之前想实现标识文本滚动的效果可以就此打住了

比较类似的还有媒体查询,之前在网上看到有这样的实现,直接在 SVG 中实现黑暗模式

<svg>
    <style>
        path {
            fill: #fff;
        }
        rect {
            fill: #B09AFE;
        }
        @media (prefers-color-scheme: dark) {
            path {
                fill: #B09AFE;
            }
            rect {
                fill: #fff;
            }
        }
    </style>
    <rect></rect>
    <path></path>
</svg>
登入後複製

但是也是同样的问题,只有 Firefox 下可行,Chrome是静止不动的

总的来说,SVG 在绘制方面提供了无限可能,不仅仅是本文中的案例,觉得 canvas 过于复杂的都可以考虑这一方案

(学习视频分享:web前端

以上是詳解用SVG為 favicon 新增標識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML,CSS和JavaScript的角色:核心職責 HTML,CSS和JavaScript的角色:核心職責 Apr 08, 2025 pm 07:05 PM

HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

bootstrap怎麼寫分割線 bootstrap怎麼寫分割線 Apr 07, 2025 pm 03:12 PM

創建 Bootstrap 分割線有兩種方法:使用 標籤,可創建水平分割線。使用 CSS border 屬性,可創建自定義樣式的分割線。

bootstrap怎麼調整大小 bootstrap怎麼調整大小 Apr 07, 2025 pm 03:18 PM

要調整 Bootstrap 中元素大小,可以使用尺寸類,具體包括:調整寬度:.col-、.w-、.mw-調整高度:.h-、.min-h-、.max-h-

了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

bootstrap怎麼設置框架 bootstrap怎麼設置框架 Apr 07, 2025 pm 03:27 PM

要設置 Bootstrap 框架,需要按照以下步驟:1. 通過 CDN 引用 Bootstrap 文件;2. 下載文件並將其託管在自己的服務器上;3. 在 HTML 中包含 Bootstrap 文件;4. 根據需要編譯 Sass/Less;5. 導入定製文件(可選)。設置完成後,即可使用 Bootstrap 的網格系統、組件和样式創建響應式網站和應用程序。

bootstrap怎麼插入圖片 bootstrap怎麼插入圖片 Apr 07, 2025 pm 03:30 PM

在 Bootstrap 中插入圖片有以下幾種方法:直接插入圖片,使用 HTML 的 img 標籤。使用 Bootstrap 圖像組件,可以提供響應式圖片和更多樣式。設置圖片大小,使用 img-fluid 類可以使圖片自適應。設置邊框,使用 img-bordered 類。設置圓角,使用 img-rounded 類。設置陰影,使用 shadow 類。調整圖片大小和位置,使用 CSS 樣式。使用背景圖片,使用 background-image CSS 屬性。

bootstrap按鈕怎麼用 bootstrap按鈕怎麼用 Apr 07, 2025 pm 03:09 PM

如何使用 Bootstrap 按鈕?引入 Bootstrap CSS創建按鈕元素並添加 Bootstrap 按鈕類添加按鈕文本

See all articles