国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Forelax / 2565人閱讀

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

實現(xiàn)效果:

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

旋轉圖片

放大圖片

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

效果圖







大概原理:

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

掛載對 window 對象mousemove事件 ---> 獲取 鼠標移動x,y距離.從而操作 canvas里的圖像的位置移動。

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

剩下的 放大、縮小 、 旋轉 是對 canvas 對象的操作/坐標體系的操作。具體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})
    }
    // 最后一個
    export const fbTwice = ({fn, time = 300}) => {
        let [cTime, k] = [null, null]
        // 獲取當前時間
        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 () => {
            // 當前時間
            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()
            })
        }
    }
    

組件模板



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

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93073.html

相關文章

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

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

    DobbyKim 評論0 收藏0
  • vue中使用viewerjs

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

    sarva 評論0 收藏0
  • vue中使用viewerjs

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

    rose 評論0 收藏0
  • css揭秘筆記——視覺效果

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

    skinner 評論0 收藏0

發(fā)表評論

0條評論

Forelax

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<