Canvas签名快速绘制出现点状断点问题求助
Hey there! I see you're building a bike booking simulation site for Toulouse and ran into a common Canvas pitfall with your signature component—fast drawing leads to dotted lines instead of smooth, continuous strokes. Let's break down why this happens and fix it right away.
Why the Dots Happen
Your current draw() method draws a tiny blue circle every time the mousemove event fires. When you draw quickly, browsers don't fire mousemove for every single pixel your mouse travels over—there's a small gap between each captured coordinate. This leaves spaces between your circles, making the signature look dotted instead of solid.
The Fix: Connect Coordinates with Lines
Instead of drawing individual circles, we'll track the last mouse position and draw a line from that position to the current one. This ensures even fast movements result in continuous strokes. Here's how to adjust your code:
Updated Canvas Code
var Canvas = { init: function () { var that = this; this.canvas = document.getElementById('canvas'); this.context = this.canvas.getContext('2d'); this.paint = false; // Track last mouse coordinates for line drawing this.lastX = 0; this.lastY = 0; // Set up line styles once (instead of every draw call) this.context.lineWidth = 3; // Adjust thickness to match your original circle size this.context.strokeStyle = "blue"; this.context.lineCap = "round"; // Makes line ends smooth, like your circles window.addEventListener('mousedown', function () { that.paint = true; }); window.addEventListener('mouseup', function () { that.paint = false; }); // Initialize last coordinates on mousedown this.canvas.addEventListener('mousedown', function (e) { var cvsOffset = $(that.canvas).offset(); that.lastX = e.pageX - cvsOffset.left; that.lastY = e.pageY - cvsOffset.top; }); // Draw lines on mousemove when painting this.canvas.addEventListener('mousemove', function (e) { if (that.paint === true) { var cvsOffset = $(that.canvas).offset(); var currentX = e.pageX - cvsOffset.left; var currentY = e.pageY - cvsOffset.top; that.draw(currentX, currentY); } }); // Reset canvas functionality document.getElementById('reset').addEventListener('click', function () { that.clearDraw(); }); }, draw: function (currentX, currentY) { this.context.beginPath(); this.context.moveTo(this.lastX, this.lastY); // Start at last position this.context.lineTo(currentX, currentY); // Draw to current position this.context.stroke(); // Render the line // Update last coordinates for next draw this.lastX = currentX; this.lastY = currentY; }, clearDraw: function () { this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }; window.addEventListener('load', function () { Canvas.init(); });
Key Changes Explained
- Track Last Coordinates: We added
lastXandlastYto store the previous mouse position, so we can draw a line between points instead of isolated circles. - Line Styles: Setting
lineCap: "round"ensures the ends of each line segment are smooth, matching the look of your original circles. AdjustlineWidthto get the same thickness as your initial 1.5-radius circles (3px width works here). - Simplified Draw Logic: The
draw()method now connects the last position to the current one with a line, eliminating gaps between fast-moving mouse events. - Initialize Last Position: On
mousedown, we set the starting coordinates so the first line segment starts exactly where you click.
This approach will make your signature strokes smooth and continuous across all browsers, even when drawing quickly. Enjoy finishing up your bike booking site!
内容的提问来源于stack exchange,提问作者lsgssln

