成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vue 實(shí)現(xiàn) 裁切圖片 同時(shí)有放大、縮小、旋轉(zhuǎn)功能

DobbyKim / 3208人閱讀

摘要:當(dāng)用戶鼠標(biāo)左鍵在按下時(shí)掛載對(duì)對(duì)象事件獲取鼠標(biāo)移動(dòng)距離從而操作里的圖像的位置移動(dòng)。掛載對(duì)對(duì)象事件,清除事件的綁定。同時(shí)該事件觸發(fā)后會(huì)被刪除剩下的放大縮小旋轉(zhuǎn)是對(duì)對(duì)象的操作坐標(biāo)體系的操作。

實(shí)現(xiàn)效果:

裁切指定區(qū)域內(nèi)的圖片

旋轉(zhuǎn)圖片

放大圖片

輸出bolb 格式數(shù)據(jù) 提供給 formData 對(duì)象

效果圖







大概原理:

利用h5 FileReader 對(duì)象, 獲取 “上傳到瀏覽器的文件” ,文件形式 為base64形式, 把 base64 賦給canvas的上下文。
然后給canvas 元素上加入對(duì)(mousedown)監(jiān)聽事件。 當(dāng)用戶鼠標(biāo)左鍵在canvas按下時(shí):

掛載對(duì) window 對(duì)象mousemove事件 ---> 獲取 鼠標(biāo)移動(dòng)x,y距離.從而操作 canvas里的圖像的位置移動(dòng)。

掛載對(duì) window 對(duì)象mouseup 事件, 清除 mousemove事件的綁定。(同時(shí)該事件觸發(fā)后會(huì)被刪除)

剩下的 放大、縮小 、 旋轉(zhuǎn) 是對(duì) canvas 對(duì)象的操作/坐標(biāo)體系的操作。具體api詳見mdn canvas 文檔

代碼

dom.js

export const on = ({el, type, fn}) => {
         if (typeof window) {
             if (window.addEventListener) {
                 el.addEventListener(type, fn, false)
            } else {
                 el.attachEvent(`on${type}`, fn)
            }
         }
    }
    export const off = ({el, type, fn}) => {
        if (typeof window) {
            if (window.addEventListener) {
                el.removeEventListener(type, fn)
            } else {
                el.detachEvent(`on${type}`, fn)
            }
        }
    }
    export const once = ({el, type, fn}) => {
        const hyFn = (event) => {
            try {
                fn(event)
            }
             finally  {
                off({el, type, fn: hyFn})
            }
        }
        on({el, type, fn: hyFn})
    }
    // 最后一個(gè)
    export const fbTwice = ({fn, time = 300}) => {
        let [cTime, k] = [null, null]
        // 獲取當(dāng)前時(shí)間
        const getTime = () => new Date().getTime()
        // 混合函數(shù)
        const hyFn = () => {
            const ags = argments
            return () => {
                clearTimeout(k)
                k = cTime =  null
                fn(...ags)
            }
        }
        return () => {
            if (cTime == null) {
                k = setTimeout(hyFn(...arguments), time)
                cTime = getTime()
            } else {
                if ( getTime() - cTime < 0) {
                    // 清除之前的函數(shù)堆 ---- 重新記錄
                    clearTimeout(k)
                    k = null
                    cTime = getTime()
                    k = setTimeout(hyFn(...arguments), time)
                }
            }}
    }
    export  const contains = function(parentNode, childNode) {
        if (parentNode.contains) {
            return parentNode != childNode && parentNode.contains(childNode)
        } else {
            return !!(parentNode.compareDocumentPosition(childNode) & 16)
        }
    }
    export const addClass = function (el, className) {
        if (typeof el !== "object") {
            console.log("el is not elem")
            return null
        }
        let  classList = el["className"]
        classList = classList === "" ? [] : classList.split(/s+/)
        if (classList.indexOf(className) === -1) {
            classList.push(className)
            el.className = classList.join(" ")
        } else {
            console.warn("warn className current")
        }
    }
    export const removeClass = function (el, className) {
        let classList = el["className"]
        classList = classList === "" ? [] : classList.split(/s+/)
        classList = classList.filter(item => {
            return item !== className
        })
        el.className =     classList.join(" ")
    }
    export const delay = ({fn, time}) => {
        let oT = null
        let k = null
        return () => {
            // 當(dāng)前時(shí)間
            let cT = new Date().getTime()
            const fixFn = () => {
                k = oT = null
                fn()
            }
            if (k === null) {
                oT = cT
                k = setTimeout(fixFn, time)
                return
            }
            if (cT - oT < time) {
                oT = cT
                clearTimeout(k)
                k = setTimeout(fixFn, time)
            }
        
        }
    }
    export  const Event = function () {
       // 類型
       this.typeList = {}
    }
    Event.prototype.on = function ({type, fn}){
        if (this.typeList.hasOwnProperty(type)) {
            this.typeList[type].push(fn)
        } else {
            this.typeList[type] = []
            this.typeList[type].push(fn)
        }
    }
    Event.prototype.off = function({type, fn})  {
       if (this.typeList.hasOwnProperty(type)) {
             let list = this.typeList[type]
          let index = list.indexOf(fn)
          if (index !== -1 ) {
                 list.splice(index, 1)
          }
          
       } else {
            console.warn("not has this type")
       }
    }
    Event.prototype.once = function ({type, fn}) {
       const fixFn = () => {
            fn()
            this.off({type, fn: fixFn})
       }
       this.on({type, fn: fixFn})
    }
    Event.prototype.trigger = function (type){
        if (this.typeList.hasOwnProperty(type)) {
            this.typeList[type].forEach(fn => {
                fn()
            })
        }
    }
    

組件模板



項(xiàng)目代碼(https://github.com/L6zt/vuesrr)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/51918.html

相關(guān)文章

  • vue 實(shí)現(xiàn) 裁切圖片 同時(shí)放大、縮小、旋轉(zhuǎn)功能

    摘要:當(dāng)用戶鼠標(biāo)左鍵在按下時(shí)掛載對(duì)對(duì)象事件獲取鼠標(biāo)移動(dòng)距離從而操作里的圖像的位置移動(dòng)。掛載對(duì)對(duì)象事件,清除事件的綁定。同時(shí)該事件觸發(fā)后會(huì)被刪除剩下的放大縮小旋轉(zhuǎn)是對(duì)對(duì)象的操作坐標(biāo)體系的操作。 實(shí)現(xiàn)效果: 裁切指定區(qū)域內(nèi)的圖片 旋轉(zhuǎn)圖片 放大圖片 輸出bolb 格式數(shù)據(jù) 提供給 formData 對(duì)象 效果圖 showImg(https://segmentfault.com/img/bV...

    Forelax 評(píng)論0 收藏0
  • vue中使用viewerjs

    摘要:項(xiàng)目創(chuàng)建安裝刪掉生成的項(xiàng)目里面的修改路由創(chuàng)建一個(gè)代碼圖片描述相關(guān)配置項(xiàng)詳情見下面鍵盤事件僅在下可用鍵退出全屏關(guān)閉退出停止播放鍵停止播放鍵查看上一張圖片鍵查看下一張圖片鍵放大圖片鍵縮小圖片組合鍵縮小到初始大小組合鍵放大到原始大小配置參 項(xiàng)目創(chuàng)建 vue init webpack mytest001 安裝viewerjs npm install viewerjs 刪掉生成的項(xiàng)目里面的hel...

    sarva 評(píng)論0 收藏0
  • vue中使用viewerjs

    摘要:項(xiàng)目創(chuàng)建安裝刪掉生成的項(xiàng)目里面的修改路由創(chuàng)建一個(gè)代碼圖片描述相關(guān)配置項(xiàng)詳情見下面鍵盤事件僅在下可用鍵退出全屏關(guān)閉退出停止播放鍵停止播放鍵查看上一張圖片鍵查看下一張圖片鍵放大圖片鍵縮小圖片組合鍵縮小到初始大小組合鍵放大到原始大小配置參 項(xiàng)目創(chuàng)建 vue init webpack mytest001 安裝viewerjs npm install viewerjs 刪掉生成的項(xiàng)目里面的hel...

    rose 評(píng)論0 收藏0
  • css揭秘筆記——視覺效果

    摘要:實(shí)現(xiàn)染色效果的混合模式是,它會(huì)保留上層元素的高亮信息,并從它的下層吸取色相和飽和度信息。當(dāng)我們只有一個(gè)背景圖像及一個(gè)透明背景色時(shí),就不會(huì)有任何混合效果。 投影 知識(shí)點(diǎn) box-shadow: [inset]? 注意: 在元素正下方的投影被裁切掉了,是沒有的;而text-shadow不同,文字下方的投影不會(huì)被裁切。 box-shadow的第三個(gè)參數(shù)是模糊半徑,假如設(shè)置4px...

    skinner 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<