Canvas之拖拽方块并实时重绘

简介: Canvas之拖拽方块并实时重绘

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>拖拽小方块</title>
 
    <style>
        #canvas {
            cursor: default;
            border: 1px solid black;
        }
    </style>
</head>
<body>
<canvas id="canvas" width="400" height="400">Canvas not supported</canvas>
<p>拖拽方块并实时重绘</p>
</body>
<script>
    'use strict';
 
    let canvas = document.getElementById('canvas'),
        context = canvas.getContext('2d'),
 
        //初始时的矩形属性
        initX = 10,
        initY = 10,
        initWidth = 100,
        initHeight = 100,
 
        isDrag = false,
 
        //多边形存储在这个地方
        polygons = {
            fillStyle: 'lightgray',
            strokeStyle: 'blue',
            loc: {x: 0, y: 0},
            height: initHeight,
            width: initWidth,
            offsetX: 0,
            offsetY: 0
        };
 
 
    //Function……
 
    /**
     * 绘制初试状态的矩形
     */
    let drawInitRect = () => {
        context.fillStyle = polygons.fillStyle;
        context.strokeStyle = polygons.strokeStyle;
        context.rect(initX, initY, initWidth, initHeight);
        polygons.loc.x = initX;
        polygons.loc.y = initY;
        polygons.width = initWidth;
        polygons.height = initHeight;
        context.fill();
        context.stroke();
    };
    //Event……
 
    /**
     * 当鼠标按下式
     * @param ev
     */
    canvas.onmousedown = ev => {
        isDrag = context.isPointInPath(ev.clientX, ev.clientY);
        polygons.offsetX = ev.clientX - polygons.loc.x;
        polygons.offsetY = ev.clientY - polygons.loc.y;
        polygons.loc.x = ev.clientX;
        polygons.loc.y = ev.clientY;
    };
 
    /**
     * 鼠标移动时
     * @param ev
     */
    canvas.onmousemove = ev => {
        if (isDrag) {
            context.beginPath();
            context.clearRect(0, 0, canvas.width, canvas.height);
            context.rect(ev.clientX - polygons.offsetX, ev.clientY - polygons.offsetY, initWidth, initHeight);
            context.fill();
            context.stroke();
        } else {
            //鼠标经过的时候是否需要变小手
            if (context.isPointInPath(ev.clientX, ev.clientY)) {
                //设置光标状态
                canvas.style.cursor = 'pointer';
            } else {
                canvas.style.cursor = 'default';
 
            }
 
        }
    };
 
    canvas.onmouseup = ev => {
        isDrag = false;
        polygons.loc.x = ev.clientX - polygons.offsetX;
        polygons.loc.y = ev.clientY - polygons.offsetY;
 
    };
 
    //Init……
 
    drawInitRect();
</script>
</html>
相关文章
|
2月前
|
前端开发 JavaScript
鼠标移动淡入淡出Canvas小球效果_特炫
本文通过HTML和JavaScript代码示例展示了如何实现鼠标移动时在Canvas上生成彩色小球并具有淡入淡出效果的动画,涉及Canvas的尺寸调整、小球对象的创建、颜色随机化、透明度变化和动画循环渲染等技术点。
34 1
鼠标移动淡入淡出Canvas小球效果_特炫
|
1月前
ThreeJs的场景实现鼠标拖动旋转控制
这篇文章介绍了如何在Three.js中实现通过鼠标拖动来旋转场景中的模型,并提供了实现这一功能的代码示例。
52 0
|
4月前
|
前端开发 JavaScript
canvas系列教程07 ——捕获、拖拽、抛掷、缓动动画、弹性动画
canvas系列教程07 ——捕获、拖拽、抛掷、缓动动画、弹性动画
48 1
|
4月前
|
移动开发 前端开发 HTML5
Canvas画布之100个小球弹射源码
Canvas画布之100个小球弹射源码
|
4月前
|
前端开发
Canvas绘画之多边形画板,绘制多边形,携带背景图和绘画功能,带有全部清除的功能,用这个
Canvas绘画之多边形画板,绘制多边形,携带背景图和绘画功能,带有全部清除的功能,用这个
|
6月前
|
测试技术 定位技术
【sgDragMoveTile】自定义组件:拖拽瓦片图、地图、大图,滚动条对应同步滚动
【sgDragMoveTile】自定义组件:拖拽瓦片图、地图、大图,滚动条对应同步滚动
|
前端开发 算法 JavaScript
使用 canvas 拖拽绘制矩形(带撤销)
之前预览网络摄像头的需求又有了下文,要在视频预览之上进行拖拽生成矩形边框,用于后台算法对区域内容进行一些处理。
333 0
|
Windows 容器
一款简单的缩放拖拽图片控件
本文介绍一个针对 .NET 桌面应用程序的独立图片缩放拖拽显示控件 [SQPhoto](https://www.nuget.org/packages/SQPhoto/)。
192 0
一款简单的缩放拖拽图片控件
|
前端开发 JavaScript
解决<canvas />在页面重绘的问题
解决canvas标签在页面重绘的问题
解决<canvas />在页面重绘的问题
|
前端开发 开发者
Canvas中的拖拽、缩放、旋转 (下)——代码实现
Canvas中的拖拽、缩放、旋转 (下)——代码实现
574 0
Canvas中的拖拽、缩放、旋转 (下)——代码实现