日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > HTML > 正文

Canvas圖片分割效果的實現(xiàn)

2024-08-26 00:21:36
字體:
來源:轉載
供稿:網友

之前在逛cssdesignawards時發(fā)現(xiàn)了一個把圖片內容分割的效果(網址:https://weareludwig.com),大家可以點進去看看,感覺挺炫酷的,于是自己試著實現(xiàn)了一下,效果還不錯。效果查看https://codepen.io/geeknoble/pen/OQaOVG

分析

首先我們可以發(fā)現(xiàn)圖片的內容被分成了一個個小矩形,并對每個矩形進行了隨機平移。Canvas的drawImage函數可以對圖片內容進行裁剪并繪制到Canvas畫布中,所以該效果主要實現(xiàn)原理就是使用drawImage。主要效果有兩個,一個是圖片內容的打亂和復原,一個是和下張圖片的切換,這兩個效果都可以使用drawImage,只是移動的距離不一樣。總體思路有了那么就可以去著手實現(xiàn)一下。

初始工作

首先我們要初始化一些變量,比如圖片的寬高,矩形的個數,剪切的尺寸等,然后再計算每個矩形的坐標,使用一個二重循環(huán)將矩形坐標保存在data中。每個矩形有個隨機位移,這個位移也需要保存起來,存在randoms中。其中x,y表示canvas畫布的坐標,x1,y1表示圖片裁剪的坐標。

init: function (context, width, height, area, img) {            this.context = context;            this.img = img;            this.imgWidth = img[0].width;          //圖片寬高            this.imgHeight = img[0].height;            this.index = 0;                       //當前圖片序號            this.width = width;                  //畫布寬高            this.height = height;            this.area = height/12;                     //小矩形長度            this.countX = width / this.area;             //水平和垂直方向小矩形個數            this.countY = height / this.area;            this.wx = this.imgWidth / this.countX;      //圖片在小矩形中的寬高            this.wy = this.imgHeight / this.countY;            this.state = true;                   //圖片狀態(tài),true表示未拆分            this.dataFlag = true;                //小矩形坐標狀態(tài),true表示未加上隨機值            this.duration = 1000;                 //動畫時間            this.duration2 = 1500;            this.startTime = 0;            this.data = [];                       //小矩形坐標信息            this.randoms = [];                    //位置隨機值            //初始化矩形坐標            var x1 = 0, y1 = 0, x = 0, y = 0;            for (var i = 0; i < this.countY; i++) {                for (var j = 0; j < this.countX; j++) {                    context.drawImage(this.img[this.index], x1, y1, this.wx, this.wy, x, y, this.area, this.area);                    //儲存矩形坐標                    this.data.push({                        x1: x1,                        y1: y1,                        x: x,                        y: y                    });                    //添加隨機值                    this.randoms.push(random(-this.area, this.area));                    x1 += this.wx;                    x += this.area;                }                x1 = 0;                y1 += this.wy;                x = 0;                y += this.area;            }            this.checkMargin();        }

檢測邊緣

在給矩形添加位移之前我們需要判斷一下位移后的坐標是否超過圖片界限,比如在頂部的矩形如果是y軸移動,那么只能夠向上移,判斷的條件為當前坐標加上位移值是否小于0或大于圖片的寬高。如果更新后的坐標小于0,那么這個隨機值一定是負數,需要把隨機值改為正數,如果大于圖片高度,那么改成負數即可。由于每個矩形的移動都是在一個方向上移動,所以我這里寫成偶數位移動x軸,奇數位移動y軸。

//檢測邊緣        checkMargin: function () {            var self = this;            this.data.forEach(function (item, index) {                if (index % 2 == 0) {  // 下標為2的倍數時移動x軸,否則移動y軸                    if ( item.x1 + self.randoms[index] < 0)                        // 改為正數                        self.randoms[index] = -self.randoms[index];                    if (item.x1 + self.wx + self.randoms[index] > self.imgWidth )                        // 改為負數                        self.randoms[index] = -Math.abs(self.randoms[index])                } else {                    if (item.y1 + self.randoms[index] < 0)                        self.randoms[index] = -self.randoms[index];                    if (item.y1 + self.randoms[index] + self.wy > self.imgHeight)                        self.randoms[index] = -Math.abs(self.randoms[index])                }            })        }

分離和復原

動畫的內容的分離和復原就是更新矩形坐標的值,打亂內容只要將data里的坐標加上隨機值,而復原就是減去隨機值,

//檢測邊緣        checkMargin: function () {            var self = this;            this.data.forEach(function (item, index) {                if (index % 2 == 0) {  // 下標為2的倍數時移動x軸,否則移動y軸                    if ( item.x1 + self.randoms[index] < 0)                        // 改為正數                        self.randoms[index] = -self.randoms[index];                    if (item.x1 + self.wx + self.randoms[index] > self.imgWidth )                        // 改為負數                        self.randoms[index] = -Math.abs(self.randoms[index])                } else {                    if (item.y1 + self.randoms[index] < 0)                        self.randoms[index] = -self.randoms[index];                    if (item.y1 + self.randoms[index] + self.wy > self.imgHeight)                        self.randoms[index] = -Math.abs(self.randoms[index])                }            })        }

在儲存好坐標后就可以去實現(xiàn)平移動畫了,移動的過程有一個平滑的過渡,我們可以使用Tween.js的緩動算法,該算法有4個參數分別是當前時間,初始位置,結束位置,動畫時間。詳細內容可以參考張鑫旭的這篇文章https://www.zhangxinxu.com/wordpress/2016/12/how-use-tween-js-animation-easing/ 。通過Tween.js可以算出每一幀要移動的距離,然后再使用requestAnimationFrame去更新坐標。

blockAnimation: function () {            var flag = 1;            if (this.state) {  // 判斷是打亂圖片還是還原圖片                this.update(true)            } else {                flag = -1;                this.update(false);            }            var self = this;            this.startTime = +new Date();  // 獲取當前時間            this.state = !this.state;            (function animation() {                var t = +new Date();                if (t >= self.startTime + self.duration) {  // 動畫結束條件                    return false;                }                self.data.forEach(function (item, index) {                    if (index % 2 == 0) {                        var pos = Math.tween.Expo.easeInOut(t - self.startTime, 0, self.randoms[index] * flag, self.duration);   // 計算出每幀移動的距離                        self.context.drawImage(self.img[self.index], item.x1 + pos, item.y1, self.wx, self.wy, item.x, item.y, self.area, self.area);                    } else {                        var pos = Math.tween.Expo.easeInOut(t - self.startTime, 0, self.randoms[index] * flag, self.duration);                          self.context.drawImage(self.img[self.index], item.x1, item.y1 + pos, self.wx, self.wy, item.x, item.y, self.area, self.area);                    }                });                requestAnimationFrame(animation);            })();        }

到這里就已經實現(xiàn)了分離和復原的動畫了

Canvas,圖片分割

圖片切換

接下來開始處理圖片切換的部分,這里跟輪播圖有點像,輪播圖動畫是將每個圖片位置移動可視窗口寬度的距離,這里也是一樣,只要將坐標加上圖片高度就可以實現(xiàn)y軸上的切換。和輪播圖不一樣的是,我們這里只有一個canvas標簽,在切換時只需要改變當前圖和下一張圖的坐標,當前圖移動距離為y1 + pos,下張圖移動距離為y1 + pos - imgHeight(為什么要減imgHeight就不用說了吧)。

//垂直滑動動畫        verticalAnimation: function (val) {            if (!this.time2) {                return false;            }            this.checkTime(2);            var self = this;            val ? val = 1 : val = -1;  //判斷上滑還是下滑            if ((this.index + val) < 0 || (this.index + val) >= (this.img.length)) {   //判斷圖片序號是否到底                return false;            }            this.state ? this.update(true) : this.update(false);            this.startTime = +new Date();            (function animation() {                var t = +new Date();                if (t >= self.startTime + self.duration2) {                    val === 1 ? self.index++ : self.index--;  //調整圖片順序                    self.index < 0 ? self.index = self.img.length - 1 : self.index;                    self.index >= self.img.length ? self.index = 0 : self.index;                    return false;                }                self.data.forEach(function (item) {                    var pos = Math.tween.Cubic.easeInOut(t - self.startTime, 0, (self.imgHeight) * val, self.duration2);                    // 更新當前圖片坐標                    self.context.drawImage(self.img[self.index], item.x1, item.y1 + pos, self.wx, self.wy, item.x, item.y, self.area, self.area);                    // 更新下張圖片坐標                    self.context.drawImage(self.img[self.index + val], item.x1, item.y1 + pos - self.imgHeight * val, self.wx, self.wy, item.x, item.y, self.area, self.area);                });                requestAnimationFrame(animation);            })()        }

x軸的切換也是同理,現(xiàn)在所有功能都差不多完成了,完整代碼可以在codepen里查看。

Canvas,圖片分割

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲高清视频在线| 最近高清中文在线字幕在线观看1| 日韩一级免费在线观看| 欧美不卡视频一区| 国产日产一区二区三区| 99精品视频国产| 国产一二三视频| 日韩在线a电影| 日韩在线一区二区| 欧美日韩国产中字| 69av亚洲| 亚洲 欧美综合在线网络| 亚洲一二三不卡| 日韩精品在线免费观看| 日韩欧美亚洲区| 精品在线一区二区| 欧美日韩中文字幕精品| 中文字幕亚洲区| 日韩在线观看视频一区| 亚洲一区日韩精品中文字幕| 国产福利久久| 中文字幕亚洲乱码| 二区三区中文字幕| 日韩视频在线免费播放| 中文在线第一页| 国产欧美日韩在线| 中文字幕2020第一页| 国产综合成人久久大片91| 日韩视频在线观看一区| 国产婷婷一区二区| 欧美日韩综合高清一区二区| 美女黄a一级视频| 国产欧美综合在线| 亚洲欧洲三级| 国产 欧美 在线| 欧美日韩一二| 久久香蕉精品| 日韩免费精品视频| 91久久精品网| 欧美日韩在线精品成人综合网| 综合激情一区| 欧美日韩色综合| 久草中文在线观看| 日韩网站中文字幕| 丰满少妇一区| 在线中文字幕网站| 日韩欧美在线看| 欧美日韩精品在线| 国产一区不卡精品| 国产专区中文字幕| 亚洲第一精品在线| 51精品免费网站| 一级网站免费观看| 日韩欧美资源站| 国产午夜精品视频免费不卡69堂 | 一区二区三区在线不卡| 午夜精品免费视频| 日韩国产专区| 91xxx在线观看| 午夜av一区二区| 91精品国产综合久久久久久| 日韩不卡高清视频| 欧美日韩国产免费观看视频| 日韩中文字幕网| 亚洲三级av| 91麻豆视频网站| 中文字幕精品视频| 国产午夜精品全部视频播放| 国产福利不卡| 最新中文在线视频| 一区精品在线播放| 日韩久久久精品| 中文字幕久久精品| 精品日韩一区二区三区免费视频| 日韩精品在线观看网站| 国产福利一区在线观看| 国产一区在线观看视频| 久久99精品久久久久子伦| 日韩欧美在线网址| 日韩美女中文字幕| 中文字幕国产日韩| 日韩久久精品成人| 国产最新在线| www.三级.com| 一区二区三区鲁丝不卡| 日韩欧美在线网址| 精品日韩视频在线观看| 一二三区精品视频| 欧美日韩国产不卡在线看| www.91香蕉视频| 亚洲校园欧美国产另类| 亚洲国产欧美日韩精品| 一本一道综合狠狠老| 中文字幕欧美人妻精品一区蜜臀| 欧美日韩国产大片| 中文字幕一区二区三区精品| 国产第一页在线播放| 成年人黄国产| 国产区视频在线观看| 91精品在线免费观看| 91午夜在线| 日韩av综合在线观看| 国产欧美日韩精品在线观看| 欧美日韩国产高清| 欧美日韩视频免费看| 一区二区三区久久| 日韩欧美中文字幕公布| 日本免费在线视频不卡一不卡二| 日韩久久精品成人| 亚洲成av人片在线| 天堂在线视频中文网| 午夜一区二区三区| 久草亚洲一区| 欧美不卡视频一区发布| 深夜日韩欧美| 欧美日韩国产综合久久| 亚洲视频色图| 国产欧美中文在线| 欧美 日韩 国产 高清| 欧美日韩亚洲天堂| 一区二区在线观看不卡| 日韩国产在线观看一区| 先锋男人资源站| 国产蜜臀在线| 欧美日韩久久久| 国产一卡2卡3卡四卡网站| 亚洲三级免费看| 欧美日韩成人综合| 日韩精品视频在线看| 亚洲视频中文字幕| 不卡在线视频| 一区二区日韩av| 欧洲精品二区| 午夜私人影院在线观看| 国精品产品一区| 91精品国产高清| 99精品在线播放| 不卡福利视频| 日韩欧美综合视频| 午夜av一区二区| 精品国产不卡一区二区| 久久精品免费看| 欧美日韩中文精品| 国产欧美久久久| 国产黄在线播放| 国产综合成人久久大片91| 天堂在线视频中文网| 精品国产乱码久久久久久蜜臀| 91久久精品网| 日韩久久精品成人| 日韩精品a在线观看91| 日韩中文字幕91| 日韩网站中文字幕| 欧美日韩综合在线免费观看| 午夜影院在线观看欧美| 国产黄在线观看| 欧美日韩国产区| 中文字幕精品www乱入免费视频| 激情婷婷亚洲| 日韩国产91| 日韩.欧美.亚洲| 蜜桃精品视频| 蜜桃视频一日韩欧美专区| 美女黄a一级视频| 亚洲一区中文| 午夜伊人狠狠久久| 日韩精品视频网站| 国产不卡视频在线| 欧美日韩在线三级| 欧美日韩高清一区二区不卡| 日韩 国产 一区| 中文字幕精品在线视频| 欧美中文字幕视频| 日韩国产欧美三级| 亚洲欧美99| 精品国产欧美成人夜夜嗨| 欧美一级免费在线观看| 第一页在线观看| 中文字幕亚洲视频| 日韩欧美国产三级| 欧美日韩激情一区| 欧美日韩成人一区| 精品欧美日韩| 亚洲福利视频专区| av免费在线不卡| 中文精品在线观看| 亚洲福利在线视频| 国产无遮挡在线视频免费观看| lutube成人福利在线观看| 欧美日韩午夜在线| 国产欧美日韩在线观看| 天堂在线中文| 91av久久久| 欧美日韩高清在线播放| 99国产成 人 综合 亚洲欧美| 欧美一级免费在线观看| 99日韩精品| 深夜福利一区| 欧美在线视频第一页| 精品亚洲永久免费| a视频免费在线观看| 日韩在线视频中文字幕| 一区二区三区精品在线| 日韩在线视频在线观看| 久久婷婷国产| 中文字幕日韩高清| 欧美婷婷精品激情| 午夜国产视频 | 欧美日韩一二三| 精品欧美久久久| 亚洲视频日韩| 亚洲a中文字幕| 精品成人久久久| 国产欧美日韩视频在线| 精品久久久三级| 色综合天天综合网国产成人综合天| 黄色精品在线观看| av高清一区| 91精品国产综合久久久蜜臀粉嫩| 91精品综合久久| av丝袜在线| 亚洲免费福利视频| 亚洲视频在线观看日本a| 91精品xxx在线观看| 免费视频最近日韩| 91亚洲国产| 免费日韩精品中文字幕视频在线| 国产乱国产乱300精品| 91精品久久久久久久久久| 精品乱人伦一区二区三区| 日韩av一区二区在线| 91精品国产99| 天天摸日日摸狠狠添| 欧美日韩国产91| 一区视频在线播放| 97caopor国产在线视频| 精品人妻二区中文字幕| 中文字幕 日韩 欧美| 在线视频国内一区二区| 久久久久久99精品| 日韩亚洲欧美中文字幕| 一级特黄大欧美久久久| 日韩精品―中文字幕| 欧美日韩精品欧美日韩精品一| 欧美国产一级片| 欧美色欧美亚洲高清在线视频| 中文字幕亚洲一区在线观看| 日韩 欧美 中文| 欧洲一级精品| 中文字幕99| 一级片在线免费看| 欧美久久一二三四区| 人成免费在线视频| 精品不卡一区二区| 中文在线不卡视频| 日韩av不卡在线观看| 91精品国产综合久久久久久| 玖玖在线免费视频| 在线观看中文字幕一区| 国产黄色在线观看| 欧美日韩国产第一页| 婷婷中文字幕一区三区| 欧美乱大交xxxxx免费| 久久99久久久欧美国产| 国产乱国产乱300精品| 国产成人综合av| 一区二区欧美国产| 91精品国产自产91精品| 一区二区欧美国产| 中文字幕在线观看视频www| 午夜一区二区三区视频| 国产乱国产乱300精品| 欧美日韩高清在线| 国产成人中文字幕| 欧美日韩精品高清| 中文字幕精品在线视频| www.91香蕉视频| 国产欧美日韩在线视频| 欧美一级免费看| 久久人人88| 深夜福利一区二区| 中文字幕精品一区二| 在线不卡一区二区| 日韩在线视频在线观看| 国产网站av| av一区在线| 不卡在线视频| 国产视频1区| 一区二区三区高清在线| 久草亚洲一区| 不卡在线一区二区| 亚洲午夜av| 91精品免费在线观看| 国产九九在线| 久久99久久久久| 黄色欧美日韩| 国产视频三级在线观看播放| 日韩欧美一二三四区| 黄色一级大片在线免费看国产一| 91精品在线观看入口| 久久激情一区| 99精品一级欧美片免费播放| 精品成人久久久| 91精品免费观看| 视频一区中文字幕国产| 欧美在线视频第一页| 国产欧美日韩中文久久| 国产免费电影网站入口| 亚洲一区在线观看网站| 欧美一级在线观看| 在线综合 亚洲 欧美中文字幕| 亚洲第一中文字幕在线观看| 中文字幕在线视频日韩| 日韩久久久精品| 亚洲一级影院| 欧美日韩成人一区二区| 欧美一级免费看| 国产www在线观看| 亚洲3区在线| 日韩久久在线| 精品视频www| 欧美性生交大片免费| 欧美日韩视频在线| 中文在线视频观看| 日韩在线视频观看| 不卡一二三区| 国产黄在线观看免费观看不卡| 一区二区视频在线观看免费的| 久久婷婷综合国产| 精品国产乱码久久久久久蜜臀| 黄色国产在线| 在线看欧美日韩| 精品在线网站观看| 国产欧美日韩精品在线观看| 久久91精品久久久久久秒播| 日韩免费高清一区二区| 久精品在线观看| 欧美日韩第一区日日骚| www日韩欧美| 欧美日韩亚洲视频| 亚洲第一中文字幕| 国产一区激情在线| 日韩高清不卡一区| 一区二区在线视频播放| 国产日韩精品久久久| 欧美日韩国产一级片| av免费观看国产| 精品国产综合久久| 国产不卡在线| 精品一二三区视频| 国产一区三区三区| 中文字幕欧美日韩| 欧美日本精品在线| 亚洲第一视频| 欧美久久久精品| 美国av一区二区| 国产高潮久久久| 午夜伦欧美伦电影理论片| 日韩国产专区| 九七久久人人| 一区二区不卡视频在线观看| 日韩高清不卡一区二区| 在线黄色国产电影| 国产中文在线视频| 国产欧美久久久精品免费| 日韩不卡中文字幕| 欧美日韩在线不卡| 日韩精品中文字幕第1页| 区日韩二区欧美三区| 成片免费观看| 精品对白一区国产伦| 日韩精品视频网站| 久久激情一区| 亚洲视频中文字幕| 欧美久久在线| 1024国产在线| 精品视频在线导航| 日韩不卡在线观看| 日韩欧美国产免费| 中文字幕精品视频在线| 1区2区在线| 久久激情一区| 日韩欧美三级| 92久久精品| 日韩免费看网站| 国产三级精品网站| 欧美日韩高清在线一区| 国产福利免费在线观看| 欧美日韩高清一区二区不卡| 久久中文精品| 欧美日韩在线三级| 日韩色在线观看| 青青国产91久久久久久| 国产wwww| 精品对白一区国产伦| 日韩精品在线第一页| 精品国产免费视频| 国产在线看一区| 欧美日韩高清在线一区| 亚洲国产午夜精品|