結(jié)合vue使用canvas繪制輪播圖心得

最近公司做的項目中有要求用canvas在圖片上顯示標注信息态兴。

而圖片是以彈出框的方式顯示出來的兄春,并且還是一個輪播圖,

輪播圖用的是swiper插件,
實現(xiàn)步驟:獲取canvas元素 ------- 初始化canvas ------- 初始化圖片 ------ 使用canvas繪制圖片
頁面具體代碼如下:

 <swiper :options="swiperOption" v-if="modal" ref="mySwiper">
    <swiper-slide v-for="item of data" :key="item.id">
        <div class="imgBox">    
            <canvas class="myCanvas" width="600" height="500"></canvas>
        </div>
    </swiper-slide>
    <div class="swiper-button-prev" slot="button-prev"></div>
    <div class="swiper-button-next" slot="button-next"></div>
</swiper>
獲取canvas

獲取canvas的時候,犯了一個很大的錯誤,導致搞了很久都沒有獲取到這個元素,因為一開始就在網(wǎng)上各種搜搜搜浪默,因為網(wǎng)上的都是繪制一張圖片,而不是輪播圖,所以只需要用document.getElementById("myCanvas")就能獲取到canvas,然后就也跟著使用document.getElementById("myCanvas")來獲取浴鸿,但是很尷尬井氢,總是獲取不到,console.log打引出來的是undefined,另外我又試了用vue的獲取dom元素的ref,結(jié)果還是一樣的岳链,我很納悶花竞,為什么別人也是這么做的我這么做就行不通,認真的觀察一番掸哑,幡然醒悟约急,原來是因為我要實現(xiàn)的是輪播圖,用了v-for來渲染出多個canvas,這時候用document.getElementById("myCanvas")來獲取肯定是不對的苗分,id具有唯一性厌蔽,v-for把多個id為myCanvas渲染出來,顯示是大錯特錯摔癣,真是太糊涂了奴饮。ref同理。
于是換了document.querySelectorAll(".myCanvas")來獲取择浊,終于就獲取到了戴卜。
注意:這里還有個地方會導致獲取不到canvas,因為使用的是vue,所以一開始直接獲取canvas是獲取不到的,需要保證canvas元素加載完成才能獲取琢岩,否則獲取不到投剥,所以要用$nextTick()。
如果能認真點担孔,就不會犯這種錯誤了江锨。欸

這里是有20個canvas

初始化canvas和圖片并繪制。

本來以為獲取到canvas以后就萬事大吉了糕篇,沒想到在初始化這里還是有點坎坷的啄育,
因為canvas是有多個的,所以不能像別的文章那樣去獲取拌消,需要對canvas數(shù)組進行遍歷灸撰,然后一個一個初始化,初始化的同時再通過new Image()的方式創(chuàng)建一個img對象拼坎,將圖片的路徑賦值給它,然后再使用canvas的api----------"drawImage" 來獲取完疫,值得注意的是泰鸡,想要在canvas上繪制圖片就必須要保證圖片成功加載完成,所以需要在img.onload方法中去做繪制操作壳鹤。

    initCanvas() {
      //這里必須要使用$nextTick()才能獲取到canvas
      this.$nextTick( () => {
        let myCanvas = document.querySelectorAll(".myCanvas"); //獲取所有的canvas
        let ctx = [];
        let _this = this;
        Array.from(myCanvas).forEach((item,index) => {//循環(huán)canvas
          ctx[index] = item.getContext("2d"); //獲取canvas的上下文
          let img = [];          
          img[index] = new Image(); //創(chuàng)建img對象
          img[index].src = this.data[index].path;//將路徑賦值給對象
          img[index].onload = function() {       //必須要圖片加載完成才能實現(xiàn)         
              ctx[index].canvas.width = img[index].width; //獲取圖片的寬賦值給canvas的寬盛龄,使canvas自適應(yīng)圖片寬
              ctx[index].canvas.height = img[index].height; //獲取圖片的寬賦值給canvas的高,使canvas自適應(yīng)圖片高       
              ctx[index].drawImage(img[index], 0, 0); //繪制圖片          
          };
        });
      });
    }

實現(xiàn)到這里正常情況下基本是已經(jīng)繪制完成了。但是無奈余舶,還是出了bug

這是點擊的第一張啊鸭,它的高度是canvas初始時設(shè)置的高

當我切換到下一張的時候
這是切換下一張的圖片,這時已經(jīng)自適應(yīng)圖片了

再切換回原來那張匿值,canvas的高度就自適應(yīng)了圖片的高了
切換回來后的圖片

然后去看了元素樣式的變化赠制,發(fā)現(xiàn)是因為<swiper >和<swiper-slide>第一次點擊的時候,先獲取到了canvas最開始的初始值挟憔。所以沒有自適應(yīng)圖片的寬高钟些。
所以第一次點擊的時候,需要將canvas的寬高賦值給<swiper >和<swiper-slide>的寬高绊谭,這樣子能做到第一次點擊的時候政恍,能把canvas初始的值替換。
修改后的代碼如下:

       initCanvas() {
      //這里必須要使用$nextTick()才能獲取到canvas
      this.$nextTick( () => {
        let myCanvas = document.querySelectorAll(".myCanvas"); //獲取所有的canvas
        let ctx = [];
        let _this = this;
        Array.from(myCanvas).forEach((item,index) => {//循環(huán)canvas
          ctx[index] = item.getContext("2d"); //獲取canvas的上下文
          let img = [];          
          img[index] = new Image(); //創(chuàng)建img對象
          img[index].src = this.data[index].path;//將路徑賦值給對象
          img[index].onload = function() {       //必須要圖片加載完成才能實現(xiàn)         
              ctx[index].canvas.width = img[index].width; //獲取圖片的寬賦值給canvas的寬达传,使canvas自適應(yīng)圖片寬
              ctx[index].canvas.height = img[index].height; //獲取圖片的寬賦值給canvas的高篙耗,使canvas自適應(yīng)圖片高       
              ctx[index].drawImage(img[index], 0, 0); //繪制圖片          
          if(index == _this.activeIndex){ //另外這里的activeIndex是圖片數(shù)組的索引,用于點擊指定索引圖片就把圖片的寬高賦值給<swiper>和<swiper-slider>的寬高
              _this.swiper.slides[index].style.height = ctx[index].canvas.offsetHeight+ "px";//將canvas的高賦值給<swiper-slide>
              _this.swiper.wrapperEl.style.height =ctx[index].canvas.offsetHeight + "px";//將canvas的高賦值給<swiper >             
              _this.swiper.updateSize();//更新swiper的寬高
            }
          };
        });
      });
    }

到這里就結(jié)束了宪赶。
不知道有沒有人會來看宗弯,哈哈哈哈,如果有來看的發(fā)現(xiàn)哪里不對請聯(lián)系我糾正逊朽,在此謝過~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罕伯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叽讳,更是在濱河造成了極大的恐慌追他,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岛蚤,死亡現(xiàn)場離奇詭異邑狸,居然都是意外死亡,警方通過查閱死者的電腦和手機涤妒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門单雾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人她紫,你說我怎么就攤上這事硅堆。” “怎么了贿讹?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵渐逃,是天一觀的道長。 經(jīng)常有香客問我民褂,道長茄菊,這世上最難降的妖魔是什么疯潭? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮面殖,結(jié)果婚禮上竖哩,老公的妹妹穿的比我還像新娘。我一直安慰自己脊僚,他們只是感情好相叁,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吃挑,像睡著了一般钝荡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舶衬,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天埠通,我揣著相機與錄音,去河邊找鬼逛犹。 笑死端辱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的虽画。 我是一名探鬼主播舞蔽,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼码撰!你這毒婦竟也來了渗柿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脖岛,失蹤者是張志新(化名)和其女友劉穎朵栖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柴梆,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡陨溅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绍在。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门扇。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖偿渡,靈堂內(nèi)的尸體忽然破棺而出臼寄,到底是詐尸還是另有隱情,我是刑警寧澤溜宽,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布脯厨,位于F島的核電站,受9級特大地震影響坑质,放射性物質(zhì)發(fā)生泄漏合武。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一涡扼、第九天 我趴在偏房一處隱蔽的房頂上張望稼跳。 院中可真熱鬧,春花似錦吃沪、人聲如沸汤善。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽红淡。三九已至,卻和暖如春降铸,著一層夾襖步出監(jiān)牢的瞬間在旱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工推掸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桶蝎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓谅畅,卻偏偏與公主長得像登渣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子毡泻,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,103評論 1 32
  • 一胜茧、JS前言 (1)認識JS 也許你已經(jīng)了解HTML標記(也稱為結(jié)構(gòu)),知道了CSS樣式(也稱為表示)仇味,會使用HT...
    凜0_0閱讀 2,774評論 0 8
  • 一呻顽、圖形的組合方式 globalAlpha是一個介于0和1之間的值(包括0和1),用于指定所有繪制的透明度邪铲。默認值...
    空谷悠閱讀 1,274評論 0 0
  • 神奇且強大的canvas 一.Canvas的基本介紹 1.什么是Canvas 定義:是HTML5提供的一種新標簽,...
    Ainy塵世繁花終凋落閱讀 10,778評論 1 18
  • 外出學習一周歸來芬位,我推開教室的門〈剑“哇昧碉!老師你回來啦!”“嘿揽惹!Miss張被饿,你可回來了!”孩子們七嘴八舌的問...
    張靜祎閱讀 554評論 0 0