js jquery写一个画板 实现撤回、清空、换色的功能

画布的canvas画板的大小就是这个画板图片的大小

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width, user-scalable=no,initial-scale=1.0, maximum-scale=1.0, mininum-scale=1.0"
    />
    <link rel="stylesheet" href="../css/common.css" />
    <link rel="stylesheet" href="../css/animate.min.css" />
    <title>page4</title>
  </head>
  <body>
    <style>
      body {
        margin: 0;
        padding: 0;
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
      }
      #box {
        position: relative;
        width: calc(100vh * 16 / 9);
        height: 100vh;
        max-height: 100%;
        /* background-color: #ccc; */
        display: flex;
        justify-content: center;
        align-items: center;
        text-align: center;
        font-size: 24px;
        background: url("../images/page4Bg.png");
        background-size: contain;
      }
      .btn {
        transition: transform 0.1s;
      }
      .btn:hover {
        transform: scale(1.1);
      }
      img {
        position: absolute;
        /* cursor: pointer; */
      }
      .hei {
        position: fixed;
        z-index: 999;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: rgb(0, 0, 0);
      }
      .color_btn_selected {
        border: 2px solid blueviolet;
        box-sizing: border-box;
        border-radius: 50%;
      }
    </style>
    <!-- 黑幕 -->
    <div class="hei"></div>
    <div id="box">
      <!-- 返回 -->
      <img
        onclick="ret()"
        class="btn"
        style="width: 4.5%; top: 3%; left: 3%;cursor: pointer;"
        src="../images/fanhui@2x.png"
        alt=""
      />
      <!-- 重玩 -->
      <img
        id="clear_btn"
        class="op_btn btn chongwan"
        style="width: 9.5%; bottom: 3%; right: 38.5%;cursor: pointer;"
        src="../images/cwBtn.png "
        alt=""
      />
      <!-- 语音 -->
      <img
        class="btn yuyin"
        onclick="playMp3()"
        style="width: 9.5%; bottom: 3%; right: 28%;cursor: pointer;"
        src="../images/yuyin@2x.png"
        alt=""
      />
      <!-- 上一页 -->
      <img
        class="btn shangyiye"
        onclick="pre()"
        style="width: 12%; bottom: 3%; right: 15%;cursor: pointer;"
        src="../images/syy.png"
        alt=""
      />
      <!-- 下一页 -->
      <img
        class="btn xiayiye"
        onclick="next()"
        style="width: 12%; bottom: 3%; right: 2%;cursor: pointer;"
        src="../images/nextPage.png"
        alt=""
      />
      <!-- 背景 -->
      <img
        style="width: 80%; top: 50%; left: 50%;transform: translate(-50%,-55%);"
        src="../images/hb_bg.png"
        alt=""
      />
      <!-- 画板 -->
      <img
        class="hb"
        style="width: 32%;
        top: 28%;
        left: 18%;"
        src="../images/hb_img.png"
        alt=""
      />
      <!-- 撤销 -->
      <img
        id="cx_btn"
        class="op_btn btn"
        style="width: 9%;
        top: 68%;
        left: 41%;cursor: pointer;"
        src="../images/hb_cx.png"
        alt=""
      />
      <!-- 颜色 -->
      <img
        id="black_btn"
        class="color_btn color_btn_selected"
        itemColor="#000000"
        style="width: 2.5%;
        top: 68.6%;
        left: 18%;cursor: pointer;"
        src="../images/hb_hei.png"
        alt=""
      />
      <img
        id="red_btn"
        class="color_btn"
        itemColor="#ff5656"
        style="width: 2.5%;
                top: 68.6%;
                left: 21.7%;cursor: pointer;"
        src="../images/hb_red.png"
        alt=""
      />
      <img
        id="yellow_btn"
        class="color_btn"
        itemColor="#ffbe21"
        style="width: 2.5%;
              top: 68.6%;
              left: 25.4%;cursor: pointer;"
        src="../images/hb_h.png"
        alt=""
      />
      <img
        id="green_btn"
        class="color_btn"
        itemColor="#6ad226"
        style="width: 2.5%;
              top: 68.6%;
              left: 29.1%;cursor: pointer;"
        src="../images/hb_lv.png"
        alt=""
      />
      <img
        id="blue_btn"
        class="color_btn"
        itemColor="#5da1ff"
        style="width: 2.5%;
               top: 68.6%;
               left: 32.8%;cursor: pointer;"
        src="../images/hb_l.png"
        alt=""
      />
      <img
        id="purple_btn"
        class="color_btn"
        itemColor="#e56dff"
        style="width: 2.5%;
        top: 68.6%;
        left: 36.5%;cursor: pointer;"
        src="../images/hb_z.png"
        alt=""
      />
      <canvas
        id="canvas"
        style="position: absolute;
        z-index: 999;
        top: 28%;
        left: 18%;
        /* border: 1px solid red; */
        border-radius: 25px;
        width: 377px;
        height: 252px;"
      ></canvas>
    </div>
    <script src="../js/jquery-1.12.3.js"></script>
    <!-- <script type="text/javascript" src="../js/handingWrite.js"></script> -->
    <script>
      function resizeBox() {
        var box = document.getElementById("box");
        var width = window.innerWidth; // 获取窗口宽度
        var height = window.innerHeight; // 获取窗口高度
        // 计算盒子的高度
        var boxHeight = Math.min(height, (width / 16) * 9); // 高度最多为100%
        // 设置盒子的样式
        box.style.height = boxHeight + "px";
      }
      // 初始化时调整盒子大小
      resizeBox();
      // 监听窗口大小改变事件
      window.addEventListener("resize", function () {
        resizeBox();
      });
    </script>
    <script>
      function pre() {
        new Audio("../mp3/pages.mp3").play();
        $(".hei").fadeIn(500); // 2000毫秒为过渡效果持续时间
        setTimeout(() => {
          window.location.href = "./page3.html";
        }, 500);
      }
    </script>
    <script>
      var playing = false;
      var audio = null;
      function playMp3() {
        if (playing) {
          return; // 如果正在播放,不执行后续操作
        }
        playing = true; // 设置为正在播放状态
        if (audio) {
          audio.pause(); // 停止当前音频的播放
        }
        audio = new Audio("../mp3/P4-1.mp3");
        audio.addEventListener("ended", function () {
          playing = false; // 播放结束后设置为非播放状态
        });
        audio.play();
      }
    </script>
    <!-- 设置页面所欲图片禁止拖拽 -->
    <script>
      var images = document.querySelectorAll("img"); // 获取所有图片元素
      for (var i = 0; i < images.length; i++) {
        images[i].draggable = false; // 将draggable属性设置为false
      }
    </script>
    <script>
      // 语音按钮
      const imgElement = document.querySelector(".btn.yuyin");
      imgElement.addEventListener("mousedown", function (event) {
        // 更改图片元素的src属性
        imgElement.src = "../images/axyy.png";
      });
      imgElement.addEventListener("mouseup", function (event) {
        imgElement.src = "../images/yuyin@2x.png";
      });
      imgElement.addEventListener("mouseleave", function (event) {
        imgElement.src = "../images/yuyin@2x.png";
      });

      // 上一页按钮
      const imgElement2 = document.querySelector(".btn.shangyiye");
      imgElement2.addEventListener("mousedown", function (event) {
        // 更改图片元素的src属性
        imgElement2.src = "../images/As.png";
      });
      imgElement2.addEventListener("mouseup", function (event) {
        imgElement2.src = "../images/syy.png";
      });
      imgElement2.addEventListener("mouseleave", function (event) {
        imgElement2.src = "../images/syy.png";
      });

      // 下一页按钮
      const imgElement3 = document.querySelector(".btn.xiayiye");
      imgElement3.addEventListener("mousedown", function (event) {
        // 更改图片元素的src属性
        imgElement3.src = "../images/Ax.png";
      });
      imgElement3.addEventListener("mouseup", function (event) {
        imgElement3.src = "../images/nextPage.png";
      });
      imgElement3.addEventListener("mouseleave", function (event) {
        imgElement3.src = "../images/nextPage.png";
      });

      // 重玩按钮
      const imgElement4 = document.querySelector('.btn.chongwan');
      imgElement4.addEventListener('mousedown', function(event) {
        // 更改图片元素的src属性
        imgElement4.src = '../images/axcw.png';
      });
      imgElement4.addEventListener('mouseup', function(event) {
        imgElement4.src = '../images/cwBtn.png';
      });
      imgElement3.addEventListener('mouseleave', function(event) {
        imgElement4.src = '../images/cwBtn.png';
      });

      $("#clear_btn").mousedown(function (event) {
        // 更改图片元素的src属性
        $(this).attr("src", "../images/axcw.png");
      });

      $("#clear_btn").mouseup(function (event) {
        $(this).attr("src", "../images/cwBtn.png");
      });

      $("#clear_btn").mouseleave(function (event) {
        $(this).attr("src", "../images/cwBtn.png");
      });
    </script>
    <script>
      // 在页面加载完成后执行
      $(document).ready(function () {
        // 设置一个延时,以便看到渐变过渡效果
        setTimeout(function () {
          $(".hei").fadeOut(500, function () {
            // 渐变过渡结束后隐藏盒子
            $(this).hide();
          });
        }, 0);
      });
    </script>
    <script>
      function next() {
        new Audio("../mp3/pages.mp3").play();
        $(".hei").fadeIn(500); // 2000毫秒为过渡效果持续时间
        setTimeout(() => {
          window.location.href = "./page5.html";
        }, 500);
      }
    </script>
    <!-- 返回列表 -->
    <script>
      function ret() {
        $(".hei").fadeIn(500); // 2000毫秒为过渡效果持续时间
        setTimeout(() => {
          window.location.href = "../../../../../page2.html";
        }, 500);
      }
    </script>
    <!-- 画板 -->
    <script>
      var canvas = document.getElementById("canvas");
      var canvasWidth = document.querySelector(".hb").offsetWidth;
      var canvasHeight = document.querySelector(".hb").offsetHeight;
      var cxt = canvas.getContext("2d");
      canvas.width = canvasWidth;
      canvas.height = canvasHeight;
      $("#canvas").css("width", canvasWidth + "px")
      $("#canvas").css("height", canvasHeight + "px")
      var isMouseDown = false;
      var lastLoc = { x: 0, y: 0 }; //起笔坐标
      var lastTime = 0; //用于计算时间
      var lastLineWidth = -1;
      var lineColor = "#000000";
      paths = []; // 存储绘制的路径
      colors = []; // 存储绘制的颜色
      drawGrid(cxt);
      // 鼠标按下
      function beginStroke(point) {
      	isMouseDown = true;
      	lastLoc = windowToCanvas(point.x, point.y);
      	lastTime = new Date().getTime();
      	paths.push([]); // 创建新的路径数组
      	paths[paths.length - 1].push(lastLoc); // 将起点坐标加入当前路径
      	colors.push(lineColor); // 存储绘制的颜色
      }
      // 鼠标结束
      function endStroke() {
        console.log("color",lineColor);
      	isMouseDown = false;
      }
      // 鼠标移动
      function moveStroke(point) {
      	var curLoc = windowToCanvas(point.x, point.y);
      	var curTime = new Date().getTime();
      	var s = calcDistance(curLoc, lastLoc); // 获取笔锋经过的距离
      	var t = curTime - lastTime; // 获取笔锋经过的时间 ,用于计算行笔速度,赋值不同的宽度
      	var lineWidth = calcLineWidth(t, s);
      	cxt.beginPath();
      	cxt.moveTo(lastLoc.x, lastLoc.y);
      	cxt.lineTo(curLoc.x, curLoc.y);
      	cxt.strokeStyle = lineColor;
      	cxt.lineWidth = lineWidth;
      	cxt.lineCap = "round";
      	cxt.lineJoin = "round";
      	cxt.stroke();
      	cxt.closePath();
      	lastLoc = curLoc;
      	lastTime = curTime;
      	lastLineWidth = lineWidth;
      	paths[paths.length - 1].push(curLoc); // 将当前点加入当前路径
      }
      canvas.onmousedown = function (e) {
      	e.preventDefault();
      	beginStroke({ x: e.clientX, y: e.clientY });
      };
      canvas.onmouseup = function (e) {
      	endStroke();
      	e.preventDefault();
      };
      canvas.onmouseout = function (e) {
      	endStroke();
      	e.preventDefault();
      };
      canvas.onmousemove = function (e) {
      	e.preventDefault();
      	if (isMouseDown) {
      		moveStroke({ x: e.clientX, y: e.clientY });
      	}
      };
      // 触屏事件
      canvas.addEventListener("touchstart", function (e) {
      	e.preventDefault();
      	var touch = e.touches[0];
      	beginStroke({ x: touch.pageX, y: touch.pageY });
      });
      canvas.addEventListener("touchmove", function (e) {
      	e.preventDefault();
      	if (isMouseDown) {
      		var touch = e.touches[0];
      		moveStroke({ x: touch.pageX, y: touch.pageY });
      	}
      });
      canvas.addEventListener("touchend", function (e) {
      	e.preventDefault();
      	endStroke();
      });
      // }
      var maxLineWidth = 10;
      var minLineWidth = 10;
      var maxStrokeV = 10;
      var minStrokeV = 0.1;
      function calcLineWidth(t, s) {
      	// 计算运笔速度和时间,获取不同得到宽度
      	var resultLineWidth = 0;
      	var v = s / t;
      	if (v <= minStrokeV) {
      		resultLineWidth = maxLineWidth;
      	} else if (v >= maxStrokeV) {
      		resultLineWidth = minLineWidth;
      	} else {
      		resultLineWidth =
      			maxLineWidth -
      			((v - minStrokeV) / (maxStrokeV - minStrokeV)) *
      			(maxLineWidth - minLineWidth);
      	}
      	if ((lastLineWidth == -1)) {
      		return resultLineWidth;
      	}
      	return (lastLineWidth * 2) / 3 + (resultLineWidth * 1) / 3;
      }
      function calcDistance(loc1, loc2) {
      	return Math.sqrt(
      		(loc1.x - loc2.x) * (loc1.x - loc2.x) +
      		(loc1.y - loc2.y) * (loc1.y - loc2.y)
      	);
      }
      function windowToCanvas(x, y) {
      	var box = canvas.getBoundingClientRect();
      	return { x: x - box.left, y: y - box.top };
      }
      function drawGrid(cxt) {
      	cxt.save();
      	cxt.beginPath();
      	// cxt.moveTo(3, 3);
      	// cxt.lineTo(canvas.width - 3, 3);
      	// cxt.lineTo(canvas.width - 3, canvas.height - 3);
      	// cxt.lineTo(3, canvas.height - 3);
      	// cxt.lineTo(3, 3);
      	// cxt.lineWidth = 6;
      	// cxt.strokeStyle = "red";
      	// cxt.closePath();
      	// cxt.stroke();
      	// cxt.restore();
      	// cxt.save();
      	// cxt.beginPath();
      	// cxt.moveTo(3, 3);
      	// cxt.lineTo(canvas.width, canvas.height);
      	// cxt.moveTo(canvas.width, 3);
      	// cxt.lineTo(3, canvas.height);
      	// cxt.moveTo(canvas.width / 2, 3);
      	// cxt.lineTo(canvas.width / 2, canvas.height);
      	// cxt.moveTo(3, canvas.height / 2);
      	// cxt.lineTo(canvas.width, canvas.height / 2);
      	// cxt.strokeStyle = "red";
      	cxt.lineWidth = 1;
      	cxt.stroke();
      	cxt.closePath();
      	cxt.restore();
      }
      // 撤回
      $("#cx_btn").click(function (e) {
      	if (paths.length > 0) {
      		paths.pop(); // 删除最后一个路径
      		colors.pop(); // 删除最后一个颜色
      		cxt.clearRect(0, 0, canvas.width, canvas.height);
      		drawGrid(cxt);
      		// 重新绘制剩余的路径
      		for (var i = 0; i < paths.length; i++) {
      			var path = paths[i];
      			for (var j = 0; j < path.length - 1; j++) {
      				cxt.beginPath();
      				cxt.moveTo(path[j].x, path[j].y);
      				cxt.lineTo(path[j + 1].x, path[j + 1].y);
      				cxt.strokeStyle = colors[i];
      				cxt.lineWidth = lastLineWidth;
      				cxt.lineCap = "round";
      				cxt.lineJoin = "round";
      				cxt.stroke();
      				cxt.closePath();
      			}
      		}
      	}
      });
      // 清除
      $("#clear_btn").click(function (e) {
        paths = []; // 清空绘制的路径
        colors = []; // 清空绘制的颜色
      	cxt.clearRect(0, 0, canvas.width, canvas.height);
      	drawGrid(cxt);
      })
      // 换颜色
      $(".color_btn").click(function () {
      	if (!$(this).hasClass("color_btn_selected")) {
      		$(this).addClass("color_btn_selected").siblings().removeClass("color_btn_selected");
      	}
      	lineColor = $(this).attr("itemColor");
      })
    </script>
  </body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web网页精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值