成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

詳解用SVG給 favicon 添加標識

怎么使用SVG給 favicon 添加標識?下面本篇文章給大家介紹一下使用 SVG 生成帶標識的 favicon的方法,希望對大家有所幫助!

詳解用SVG給 favicon 添加標識

前端(vue)入門到精通課程:進入學習

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

詳解用SVG給 favicon 添加標識

主要實現過程其實不復雜,首先獲取網站 favicon,然后給 favicon 添加標識,重新繪制生成就行了

詳解用SVG給 favicon 添加標識

其中,這里的圖標就是通過 SVG 生成的,下面看看具體實現吧。【推薦學習:css視頻教程】

一、favicon 的獲取方式

想知道獲取方式,可以先了解設置方式。

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

第一種,通過 link 標簽設置(需要rel="icon"屬性)

<link rel="icon" href="xxx.png">

第二種,直接在網站根目錄放一張favicon.ico(必須是這個名稱,瀏覽器默認的),html 中什么也不用設置

- 網站目錄     index.html     favicon.ico

如果以上都沒有設置,那么大概率會看到以下錯誤

詳解用SVG給 favicon 添加標識

了解這些,獲取就簡單了,先通過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'), img = new Image(); img.crossOrigin = 'anonymous'; img.onload = () => {     canvas.height = img.height;     canvas.width = img.width;     ctx.drawImage(img, 0, 0, canvas.width, canvas.height);     let dataURL = canvas.toDataURL("image/png");     resolve(dataURL);     canvas = null; }; img.src = url;

由于存在/favicon.ico沒有設置的情況,所以需要在 img 加載失敗的時候給一張默認圖

img.onerror = () => {     resolve("默認圖base64"); }

這樣就能獲取到 favicon 的圖像信息了

三、利用 SVG 進行圖片合成

在上面的基礎上,其實可以繼續通過 canvas 進行繪制,再繪制一個標簽也不是難事。不過這里可以采用 SVG 的方式來進行繪制,有以下一些優點

  • 成本更低,比 canvas 更易理解

  • 靈活性高,可以通過 CSS 進行一些樣式控制

首先,我們可以在 HTML 中自由的、像正常網頁開發一樣,繪制這樣一個布局,相信沒有什么難度

詳解用SVG給 favicon 添加標識

<body>   <strong>local</strong>   <img src='xxx.png'> </body>

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

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 本身也是一種圖片,這樣就達到了合成圖像的目的

詳解用SVG給 favicon 添加標識

具體實現如下

const link = getLink(); const icon = await img2Base64(link.href); const favicon = `data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><foreignObject x="0" y="0" width="100%" height="100%"><body xmlns="http://www.w3.org/1999/xhtml">   <style>     html,body{       height: 100%;       margin: 0;       text-align: center;     }     img{       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>   <img src='${icon}'></img>   </body></foreignObject></svg>`.replace(/n/g, '').replace(/t/g, '').replace(/#/g, '%23')

這里需要注意幾點

  • img 標簽在 svg 中需要寫成<img></img>閉合形態,不然會被認為結構錯誤

  • img 只能使用內聯圖片,比如 base64,這也是為何繪制原始 favicon 的原因

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

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

然后,將生成的 SVG 直接設置為 favicon

link.href= favicon;

詳解用SVG給 favicon 添加標識

這樣就能正常的渲染了~

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

四、一些局限性

首先是兼容性。

目前只有 Chrome 和 Firefox 是支持的,為了兼容其他瀏覽器,可以用一個 .ico來兜底

<link rel="icon" href="/favicon.ico" sizes="any"> <link rel="icon" href="/favicon.svg" type="image/svg+xml">

另外,在 Chrome 上還有一個限制(不知道是不是Chrome 更新后的限制),當 favicon 使用 svg 格式圖片時,此時的 svg 會處于一種secure-static-mode,在這種模式下,所有動畫都不會執行,會處于第一幀,比如下面這個例子

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">   <foreignObject width="100%" height="100%">       <body xmlns="http://www.w3.org/1999/xhtml">         <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>       </body>     </foreignObject> </svg>

很簡單的一個背景顏色動畫。在 Firefox 上是用作 favicon 是有動畫的

詳解用SVG給 favicon 添加標識

但是,Chrome 上卻不行,只有禁止的第一幀

詳解用SVG給 favicon 添加標識

所以之前想實現標識文本滾動的效果可以就此打住了

比較類似的還有媒體查詢,之前在網上看到有這樣的實現,直接在 SVG 中實現黑暗模式

<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">     <style>         path {             fill: #fff;         }         rect {             fill: #B09AFE;         }         @media (prefers-color-scheme: dark) {             path {                 fill: #B09AFE;             }             rect {                 fill: #fff;             }         }     </style>     <rect width="128" height="128" rx="64" fill="#B09AFE"/>     <path d="M32.375 37.5714H22C22 58.004 38.2596 74.5714 58.3125 74.5714V98.3571C58.3125 99.8107 59.4797 101 60.9062 101H66.0937C67.5203 101 68.6875 99.8107 68.6875 98.3571V74.5714C68.6875 54.1388 52.4279 37.5714 32.375 37.5714ZM94.625 27C80.9754 27 69.109 34.6808 62.9002 46.0286C67.3906 51.017 70.7139 57.079 72.4646 63.8018C90.7344 61.8692 105 46.1442 105 27H94.625Z" fill="white"/> </svg>

但是也是同樣的問題,只有 Firefox 下可行,Chrome是靜止不動的

詳解用SVG給 favicon 添加標識

總的來說,SVG 在繪制方面提供了無限可能,不僅僅是本文中的案例,覺得 canvas 過于復雜的都可以考慮這一方案

(學習視頻分享:web前端)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产嗷嗷叫高潮快点再用力| JAPAN高清日本乱XXXXX| 一本大道色卡1卡2卡3| 亚洲AV色香蕉一区二区三区夜夜嗨| 西瓜影院免费观看完整版电影| 无码人妻精品一区二区三区下载| 无码人妻精品丰满熟妇区| 无码成人AⅤ免费中文字幕| 天堂M和天堂2M区别| 午夜精品久久久久久不卡| 亚洲A∨无码无在线观看| 亚洲乱人伦中文字幕无码| 亚洲欧美一区二区三区| 中国无码人妻丰满熟妇啪啪软件| 最新欧美精品一区二区三区 | 亚洲AV成人在线播放| 亚洲精品欧美精品日韩精品 | 亚洲欧美偷拍另类A∨| 伊人久久东京AV| YY8090韩国理伦片在线| 国产SUV精品一区二区四区三区| 国产午夜成人AV在线播放| 久久精品99国产精品蜜桃| 久久精品无码一区二区三区不卡| 男男AV纯肉无码免费播放无码 | 久久人妻无码中文字幕第一| 免费看漫画在线成人漫画| 欧美性爱AAAAA| 无码人妻精品中文字幕免费东京热| 亚洲成A人V欧美综合天堂麻豆| 中文字幕巨爆区乳爆系列| 超薄肉色丝袜一二三四区| 韩国三级大乳在线观看| 欧美XXXX狂喷| 小BBW小BBW小BBW小| 一本大道AV伊人久久综合| 放荡的闷骚娇妻H| 久久久久国色AV免费观看| 日日噜噜夜夜狠狠视频| 亚洲AV无码国产精品色午夜| 8X8Ⅹ成人免费视频在线观看| ASIAN明星裸体合成PICS| 舌头伸入麻麻两腿之间 | 久久99精品久久久久久HB| 免费看国产曰批40分钟| 小SAO货边洗澡边CAO你动漫| 亚洲国产精品无码专区| 成都私人家庭影院| 国内精品久久影院综合日日| 秋霞鲁丝片AⅤ无码入口| 亚洲一区精品无码色成人| 国产AV一区二区三区传媒| 久久精品国产只有精品66| 色综合久久久无码中文字幕波多 | 亚洲欧美另类视频| 国产成人AV综合亚洲色欲美女| 狠狠躁夜夜躁人人爽天天不| 日欧 片内射AV在线影院| 在线人成视频播放午夜福利| 国产成人AV乱码在线观看| 欧美视频一区二区图文| 亚洲综合精品第一页| 国产亚洲欧美日韩二三线| 色综合天天视频在线观看| 97精品伊人久久大香线蕉APP| 精品无码一区二区三区爱欲| 挺进去岳就不挣扎了在线观看| MACBOOKPRO免费网站| 免费观看电视剧全集在线播放| 亚洲日韩中文字幕无码一区| 国产最新AV在线播放不卡| 日韩人妻中文无码一区二区三区| A级毛片免费观看网站| 麻豆一区二区三区蜜桃免费| 五十老熟女高潮嗷嗷叫| 国产成人午夜无码电影在线观看| 男人把大JI巴放进女人有视频| 亚洲阿V天堂无码Z2018| 国产亚洲无线码一区二区| 无码AV中文字幕久久专区| 国产GAYSEXCHINA男同| 日本婷婷色色电影| 保守人妻精油按摩被强出| 蜜臀AV性久久久久蜜臀AⅤ| 亚洲国产精品久久久久秋霞影院| 国产午夜精品一区二区三区老| 无码精品一区二区三区免费视频 | 爱丫爱丫影院在线| 人妻无码久久精品| 成人嘿咻漫画免费入口| 色婷婷综合中文久久一本| 国产99久久久国产无需播放器| 天堂А√在线最新版中文在线| 国产AV妓女影视妓女影院 | 欧美性大战XXXXX久久久| 边做饭边被躁我和邻居的视频| 三个男人让我爽了一夜| 国产精品麻豆VA在线播放| 亚洲 欧美精品SUV| 国产影片AV级毛片特别刺激| 亚洲VA久久久噜噜噜熟女8| 国产欧美日韩一区二区三区| 亚洲精品无码寂寞少妇AV| 猫咪AV最新永久网址无码| YY6090青苹果影院| 天干天干夜天干天天爽| 国内精品伊人久久久久AV| 野花日本大全免费观看版动漫| 男人边吃奶边挵进去呻吟动态图| 51精产国品一二三产区区| 人人澡人摸人人添学生AV| 国产精品女上位好爽在线| 亚洲AV无码一区二区三区网址 | 久久久久亚洲AV综合仓井空| 51吃瓜.WORLD张津瑜蘑菇| 久久一区二区三区精华液| а天堂中文在线官网| 午夜131美女爱做视频| 裸体欣赏ⅤIDE0SPH0TO| 丰满少妇被猛烈进入无码| 新狼窝色AV性久久久久久| 里番ACG ※里番_ACG工口| 成人免费无码大片A毛片抽搐色欲 成人免费无码大片A毛片抽搐 | 极品无码国模国产在线观看| JIZZJIZZJIZZ日本丰| 亚洲AV日韩综合一区| 久久久久久精品免费免费HD| 差差差很疼30分钟的视频| 亚洲精品乱码久久久久久自慰 | 九月在线 视频 在线观看| きょこんきょうしゃ在线| 亚洲国产成人精品无码区二本| 欧美熟妇内射深插| 精品国产污污免费网站入口| 赤裸羔羊Ⅲ致命快感| 一本一道久久综合狠狠老 | 美女裸身裸乳免费视频的APP| 国产成人亚洲综合色影视| 中文字幕V亚洲日本| 亚洲AV永久无码精品尤物在线| 蜜芽亚洲日韩欧美国产高清ΑV| 国产成人无码区免费AⅤ片| 一区二区在线视频| 亚洲AV日韩专区在线观看| 日韩无人区码卡二卡3卡一| 蜜桃av中文字幕在线| 韩日综合成人中文字幕| 丰满的人妻HD高清日本| 97人妻碰碰碰久久久久| 亚洲色成人网站WWW永久小说| 午夜理论片YY6080影院| 日本熟少妇裸交ⅩXX视频| 免费午夜爽爽爽WWW视频十八禁| 精品久久久无码中字| 国产啪精品视频网站免费| 挡粉嫩小泬久久久久久久| 一区二区三区无码被窝影院| 亚洲国产成人一区二区精品区| 无码福利日韩神码福利片| 日本亚洲色欲网站WWW| 欧美日韩一区二区成人午夜电影| 久久亚洲AV成人无码| 精品一区二区三区无码免费视频 | 国产乱人伦AV在线无码| 纯肉无遮挡H肉动漫在线观看3D| 一出一进一爽一粗一大视频免费的| 亚洲寂寞女人AⅤ| 亚洲AV无码成人精品网站漏男| 无码欧亚熟妇人妻AV在线外遇| 色欲色香天天天综合网WWW| 日本肉体裸交XXXXBBBB| 侵犯美人妻中出中文字幕| 女人被狂躁高潮啊的视频在线看| 鲁丝片一区二区三区免费| 久久在精品线影院精品国产| 久久久久久精品免费免费英国 | 国产VIVODESHD精品| 国产成人精品123区免费视频| 产成人亚洲精品无码青青草原 | 粗大的内捧猛烈进出视频嘿嘿视频| 成 人 黄 色 网 站 18| 丁香花在线视频观看免费| 国产69精品久久久久9999A| 国产成人精品2021| 国产老妇伦国产熟女老妇久 | 国产在线无码精品无码| 国产成人亚洲精品无码H在线| 国产美女久久精品香蕉69| 国产精品久久久久精品| 国产日韩精品一区二区三区在线观 | 大屁股熟女一区二区三区| 丁香花在线观看免费高清版| 成人精品一区二区三区中文字幕| 成人无码精品一区二区三区亚洲区 | 亚洲乱码国产乱码精品精| 中文成人无码精品久久久不卡免费| 夜夜澡天天碰人人爱AV| 中文日产无乱码AV在线观| 拔萝卜影视剧免费观看| 国产成人久久综合第一区|