一款实用的web截图工具(二)

码云地址:码云

github地址:github

kscreenshot

介绍

web截图工具的功能实现基于Canvas技术。其功能主要包括截图,下载,复制以及在截图过程中通过工具栏对截图进行绘制。

使用

具体使用方法请戳 码云 github

实现方式

接上篇

this.startDrawDown = (e) => {
    const that = this
    document.addEventListener('mouseup', that.cancelDrawingStatus)
    document.addEventListener('contextmenu', that.preventContextMenu)
    //当不是鼠标左键时立即返回
    if (e.button !== 0) {
        return
    }

    if (that.drawingStatus !== null) {
        return
    }
    that.drawingStatus = 1

    that.startX = e.clientX
    that.startY = e.clientY
    //移除并添加
    remove(document.getElementById('kssScreenShotWrapper'))
    let kssScreenShotWrapper = document.createElement('div')
    kssScreenShotWrapper.id = 'kssScreenShotWrapper'
    css(kssScreenShotWrapper, {
        position: 'fixed',
        background: 'transparent',
        'box-shadow': '0 0 0 9999px rgba(0, 0, 0, 0.3)',
        'z-index': 10001
    })
    that.kssScreenShotWrapper = kssScreenShotWrapper
    let kssRectangle = document.createElement('div')
    css(kssRectangle, {
        position: 'absolute',
        top: 0,
        left: 0,
        width: '100%',
        height: '100%'
    })
    kssScreenShotWrapper.appendChild(kssRectangle)
    document.body.appendChild(kssScreenShotWrapper)
    
    document.addEventListener('mousemove', that.drawing)
    document.addEventListener('mouseup', that.endDraw)
}

startDrawDown函数是上篇start中在document上添加的鼠标按下事件。该函数首先添加了两个事件,第一个事件的作用是按下鼠标右键时取消截图状态;第二个事件是阻止鼠标右键的默认事件。下面that.startX = e.clientX,that.startY = e.clientY 这两行代码记录了当前的鼠标位置,这是两个十分重要的属性。

然后创建一个dom,该dom就是截图框的包裹层,并且给这个dom添加了一个'box-shadow': '0 0 0 9999px rgba(0, 0, 0, 0.3)'样式,使用阴影巧妙的模拟一个蒙层。接下来又创建了一个dom,这个dom就是截图框,在该范围的内容是我们截图后的内容。最后我们给document添加了两个事件。

this.drawing = (e) => {
    const that = this
    that.drawingStatus = 2

    let client = backRightClient(e)
    let clientX = client[0]
    let clientY = client[1]
    
    css(that.kssScreenShotWrapper, {
        height: Math.abs(clientY - that.startY) + 'px',
        width: Math.abs(clientX - that.startX) + 'px',
        top: Math.min(that.startY, clientY) + 'px',
        left: Math.min(that.startX, clientX) + 'px'
    })
}

drawing函数实时比对当前鼠标位置与最开始的鼠标位置,给截图框包裹层添加样式。并通过backRightClient函数防止截图框包裹层到可视区域外面。

this.endDraw = (e) => {
    if (e.button !== 0) {
        return
    }
    const that = this
    that.drawingStatus = 3
    
  ...
}

endDraw函数分成3部分述说

//endDraw第一部分
if (that.startX === e.clientX && that.startY === e.clientY) {
    let clientHeight = document.documentElement.clientHeight
    let clientWidth = document.documentElement.clientWidth
    that.startX = 2
    that.startY = 2
    that.height = clientHeight - 4
    that.width = clientWidth - 4
    css(that.kssScreenShotWrapper, {
        height: that.height + 'px',
        width: that.width + 'px',
        top: that.startY + 'px',
        left: that.startX + 'px'
    })
} else {
    let client = backRightClient(e)
    let clientX = client[0]
    let clientY = client[1]

    that.width = Math.abs(clientX - that.startX)
    that.height = Math.abs(clientY - that.startY)
    that.startX = Math.min(that.startX, clientX)
    that.startY = Math.min(that.startY, clientY)
}

这是endDraw函数的第一部分。该部分的作用用于判断用户是否进行了鼠标移动,若没有移动则将截图框包裹层的宽高设置为可视区域的宽高,否则与drawing函数一样。

let canvas = document.createElement('canvas')
        
    css(canvas, {
        height: '100%',
        width: '100%',
        top: 0,
        left: 0,
        cursor: 'move',
        position: 'absolute'
    })
    canvas.id = 'rectangleCanvas'
    that.kssScreenShotWrapper.appendChild(canvas)
    that.rectangleCanvas = canvas
    canvas.addEventListener('mousedown', function (event) {
        if (that.isEdit || event.button === 2) {
            return
        }
        clearMiddleImage(that)
        let startX = event.clientX
        let startY = event.clientY
        document.addEventListener('mousemove', canvasMoveEvent)
        document.addEventListener('mouseup', canvasUpEvent)
        //最后左上角的top和left
        let top
        let left
        function canvasMoveEvent (e) {
            let clientHeight = document.documentElement.clientHeight
            let clientWidth = document.documentElement.clientWidth
        
            top = that.startY + e.clientY - startY

            if (that.startY + e.clientY - startY + that.height > clientHeight) {
                top = clientHeight - that.height
            }

            if (that.startY + e.clientY - startY < 0) {
                top = 0
            }

            left = that.startX + e.clientX - startX

            if (that.startX + e.clientX - startX + that.width > clientWidth) {
                left = clientWidth - that.width
            }

            if (that.startX + e.clientX - startX < 0) {
                left = 0
            }

            css(that.kssScreenShotWrapper, {
                top: top + 'px',
                left: left + 'px'
            })
            
            toolbarPosition(that, that.width, that.height, top, left, that.toolbar)
        }

        function canvasUpEvent (e) {
            if (top === undefined) {
                top = that.startY
            }

            if (left === undefined) {
                left = that.startX
            }
            that.startY = top
            that.startX = left
            document.removeEventListener('mousemove', canvasMoveEvent)
            document.removeEventListener('mouseup', canvasUpEvent)
            drawMiddleImage(that)
        }
    })

这是endDraw函数的第二部分。这一部分的整体是创建了一个canvas,并给canvas添加了事件,使用户可以点击canvas进行移动截图框操作。

createDragDom(
    that.kssScreenShotWrapper,
    that.dotSize,
    that.lineSize,
    '#488ff9',
    that
)
let img = document.createElement('img')
css(img, {
    width: '100%',
    height: '100%',
    position: 'absolute',
    top: 0,
    left: 0,
    display: 'none'

})
that.kssScreenShotWrapper.appendChild(img)
that.currentImgDom = img
drawMiddleImage(that)
that.toolbar = createToolbar(that.toolbarWidth, that.toolbarHeight, that.toolbarMarginTop, that)

这是endDraw函数的第三部分。该部分首先生成一个可拖拽的边框,即createDragDom函数,然后生成一个图片,用于后续的下载,快照,最后生成一个工具栏,用于图片的绘制。

剩余部分下篇继续

一款实用的web截图工具(一)

转载于:https://my.oschina.net/kejiacheng/blog/1837880

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值