最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue.js中動(dòng)態(tài)更改svg的相關(guān)屬性詳解

 更新時(shí)間:2023年02月23日 14:24:09   作者:前端掃地僧  
這篇文章主要為大家介紹了Vue.js中動(dòng)態(tài)更改svg的相關(guān)屬性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

 公司項(xiàng)目中有一個(gè)關(guān)于圖標(biāo)庫(kù)管理的需求,大致需要在頁(yè)面能夠動(dòng)態(tài)去更改對(duì)應(yīng)svg圖標(biāo)的大小、顏色等(這里的更改顏色限制線性圖標(biāo))。在網(wǎng)上查找了相關(guān)資料,做了技術(shù)的預(yù)研及demo的編寫(xiě),在此記錄一下。

怎樣將一個(gè)遠(yuǎn)程的svg圖標(biāo)資源"下載"到本地

首頁(yè)我們可以利用XMLHttpRequest對(duì)象來(lái)請(qǐng)求對(duì)應(yīng)的svg圖標(biāo)的遠(yuǎn)程資源鏈接地址,并監(jiān)聽(tīng)實(shí)現(xiàn)XMLHttpRequest對(duì)象的load事件,將返回的資源進(jìn)行dom對(duì)象的轉(zhuǎn)換、string轉(zhuǎn)換為xml。

代碼如下:

const xhr = new XMLHttpRequest();
      xhr.open('GET', 'https://www.xx.com/img/xxx.svg', true);
      xhr.send();
      /* 監(jiān)聽(tīng)xhr對(duì)象 */
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          console.log(xhr.responseXML, 'xhr.responseXML---------')
        }
      };
      xhr.addEventListener('load', () => {
        const resXML = stringToXml(xhr.response);
        this.svgDom = resXML.documentElement.cloneNode(true);
      });

這里的工具函數(shù)stringToXml的完整代碼如下:

//將字符串轉(zhuǎn)化成dom對(duì)象;string轉(zhuǎn)換為xml
function stringToXml (xmlString) {
  let xmlDoc;
  if (typeof xmlString == "string") {
    //FF
    if (document.implementation.createDocument) {
      const parser = new DOMParser();
      xmlDoc = parser.parseFromString(xmlString, "text/xml");
    } else if (window.ActiveXObject) {
      // eslint-disable-next-line no-undef
      xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async = false;
      xmlDoc.loadXML(xmlString);
    }
  }
  else {
    xmlDoc = xmlString;
  }
  return xmlDoc;
}

這樣就可以獲取到遠(yuǎn)程svg資源對(duì)應(yīng)的dom結(jié)構(gòu)了。

怎樣更改svgdom結(jié)構(gòu)里面的相關(guān)屬性

產(chǎn)品的要求需要能夠動(dòng)態(tài)更改對(duì)應(yīng)svg圖標(biāo)的寬、高、顏色值等。要實(shí)現(xiàn)這樣的功能有以下幾個(gè)小點(diǎn):

  • 將svgDom對(duì)象轉(zhuǎn)換成vue的虛擬dom,代碼如下:const oSerializer = new XMLSerializer()
  • 根據(jù)序列化的對(duì)象提供的serializeToString方法將svgDom對(duì)象進(jìn)行字符串化;

通過(guò)svgDom對(duì)象提供的寬、高屬性值,結(jié)合正則來(lái)遍歷svgDom字符串化后的字符串,進(jìn)行寬高值的替換。代碼如下:

let sXML = oSerializer.serializeToString(this.svgDom);
sXML = sXML.replace(`width="${this.svgDom.width.baseVal.value}"`, 'width="40"').replace(`height="${this.svgDom.height.baseVal.value}"`, 'height="40"')
  • 根據(jù)sXML來(lái)截取svg結(jié)構(gòu)表示的字符串里對(duì)應(yīng)的顏色值,并結(jié)合is-color這個(gè)插件判斷是否是一個(gè)真正的顏色,是的話,根據(jù)想要替換的顏色值進(jìn)行全局替換就行。代碼如下:
let curColor = sXML.split('#')[1].substr(0, 6)
      if (!isColor(`#${curColor}`)) {
        curColor = sXML.split('#')[1].substr(0, 3)
      }
      sXML = sXML.replace(new RegExp(`#${curColor}`, "gm"), '#90EE90')
  • 通過(guò)Vue實(shí)例提供的extend方法創(chuàng)建實(shí)例并掛載到某個(gè)元素上,代碼如下:
const Profile = Vue.extend({
          template: "<div id='svgTemplate'>" + sXML + '</div>'
        });
        // 創(chuàng)建實(shí)例,并掛載到元素上
        new Profile().$mount('#svgTemplate');

處理前的效果圖:

處理后的效果圖(將svg寬高由原來(lái)的20變?yōu)?0,將顏色值改為"#90EE90"):

最終完整的代碼如下:

testSvg () {
      const xhr = new XMLHttpRequest();
      xhr.open('GET', 'https://www.xx.com/img/xxx.svg', true);
      xhr.send();
      /* 監(jiān)聽(tīng)xhr對(duì)象 */
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          console.log(xhr.responseXML, 'xhr.responseXML---------')
        }
      };
      xhr.addEventListener('load', () => {
        const resXML = stringToXml(xhr.response);
        this.svgDom = resXML.documentElement.cloneNode(true);
        /* 將svgDom對(duì)象轉(zhuǎn)換成vue的虛擬dom */
        const oSerializer = new XMLSerializer();
        let sXML = oSerializer.serializeToString(this.svgDom);
        let curColor = sXML.split('#')[1].substr(0, 6)
        if (!isColor(`#${curColor}`)) {
          curColor = sXML.split('#')[1].substr(0, 3)
        }
        sXML = sXML.replace(`width="${this.svgDom.width.baseVal.value}"`, 'width="40"').replace(`height="${this.svgDom.height.baseVal.value}"`, 'height="40"').replace(new RegExp(`#${curColor}`, "gm"), '#90EE90')
        const Profile = Vue.extend({
          template: "<div id='svgTemplate'>" + sXML + '</div>'
        });
        // 創(chuàng)建實(shí)例,并掛載到元素上
        new Profile().$mount('#svgTemplate');
      });
    },

以上就是Vue.js中動(dòng)態(tài)更改svg的相關(guān)屬性詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue.js動(dòng)態(tài)更改svg屬性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue+axios實(shí)現(xiàn)文件下載及vue中使用axios的實(shí)例

    vue+axios實(shí)現(xiàn)文件下載及vue中使用axios的實(shí)例

    這篇文章主要介紹了vue+axios實(shí)現(xiàn)文件下載及vue中使用axios的實(shí)例,需要的朋友可以參考下
    2018-09-09
  • vue封裝Animate.css動(dòng)畫(huà)庫(kù)的使用方式

    vue封裝Animate.css動(dòng)畫(huà)庫(kù)的使用方式

    這篇文章主要介紹了vue封裝Animate.css動(dòng)畫(huà)庫(kù)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 父子組件生命周期及子組件獲取數(shù)據(jù)傳值問(wèn)題剖析

    父子組件生命周期及子組件獲取數(shù)據(jù)傳值問(wèn)題剖析

    這篇文章主要介紹了父子組件生命周期及子組件獲取數(shù)據(jù)問(wèn)題剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Vue實(shí)現(xiàn)瀏覽器端掃碼功能

    Vue實(shí)現(xiàn)瀏覽器端掃碼功能

    本文主要介紹,通過(guò)使用基于 vue技術(shù)棧的前端開(kāi)發(fā)技術(shù),在瀏覽器端調(diào)起攝像頭,并進(jìn)行掃碼識(shí)別功能,對(duì)識(shí)別到的二維碼進(jìn)行跳轉(zhuǎn)或其他操作處理,對(duì)vue瀏覽器掃碼功能的實(shí)現(xiàn)代碼感興趣的朋友一起看看吧
    2021-10-10
  • uni-app無(wú)限級(jí)樹(shù)形組件簡(jiǎn)單實(shí)現(xiàn)代碼

    uni-app無(wú)限級(jí)樹(shù)形組件簡(jiǎn)單實(shí)現(xiàn)代碼

    文章介紹了如何在uni-app中簡(jiǎn)單封裝一個(gè)無(wú)限級(jí)樹(shù)形組件,該組件可以無(wú)線嵌套,展開(kāi)和收縮,并獲取子節(jié)點(diǎn)數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-01-01
  • elementui使用el-upload組件如何實(shí)現(xiàn)自定義上傳

    elementui使用el-upload組件如何實(shí)現(xiàn)自定義上傳

    這篇文章主要介紹了elementui使用el-upload組件如何實(shí)現(xiàn)自定義上傳,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue中的transition封裝組件的實(shí)現(xiàn)方法

    Vue中的transition封裝組件的實(shí)現(xiàn)方法

    這篇文章主要介紹了Vue中的transition封裝組件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Vue.js中class與style的增強(qiáng)綁定實(shí)現(xiàn)方法

    Vue.js中class與style的增強(qiáng)綁定實(shí)現(xiàn)方法

    由于Class和Style綁定使用頻繁,字符串拼接麻煩且易錯(cuò),因此,Vue.js 做了專門(mén)的增強(qiáng),表達(dá)式結(jié)果的類(lèi)型除了字符串之外,還可以是對(duì)象或數(shù)組,本文給大家講解Vue.js中class與style的增強(qiáng)綁定知識(shí),感興趣的朋友一起看看吧
    2023-04-04
  • Uniapp 實(shí)現(xiàn)頂部標(biāo)簽頁(yè)切換功能(詳細(xì)步驟)

    Uniapp 實(shí)現(xiàn)頂部標(biāo)簽頁(yè)切換功能(詳細(xì)步驟)

    本文介紹了如何在UniApp中實(shí)現(xiàn)頂部標(biāo)簽頁(yè)切換功能,u-tab-bar組件提供了便捷的標(biāo)簽切換功能和豐富的樣式選項(xiàng),而swiper組件則更加靈活,支持自定義切換方式,根據(jù)自己的需求選擇合適的方式實(shí)現(xiàn)頂部標(biāo)簽頁(yè)切換,感興趣的朋友一起看看吧
    2025-02-02
  • vue中radio根據(jù)動(dòng)態(tài)值綁定checked無(wú)效的解決

    vue中radio根據(jù)動(dòng)態(tài)值綁定checked無(wú)效的解決

    這篇文章主要介紹了vue中radio根據(jù)動(dòng)態(tài)值綁定checked無(wú)效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

庆阳市| 宜宾县| 洪湖市| 龙南县| 双柏县| 什邡市| 甘谷县| 张家港市| 周口市| 麻阳| 穆棱市| 高唐县| 潼关县| 海伦市| 和田县| 鄂伦春自治旗| 本溪| 武邑县| 门头沟区| 舟曲县| 屯留县| 旌德县| 高清| 邢台市| 叶城县| 科技| 南通市| 曲松县| 景德镇市| 天镇县| 汕尾市| 成都市| 霍州市| 十堰市| 南郑县| 醴陵市| 大关县| 巨鹿县| 曲阜市| 临安市| 湘潭市|