C’est difficile à expliquer. Mais je vais essayer, toute la toile est décalée. Je ne sais pas comment cela s'est produit ni comment y remédier. Comme lorsque votre souris se trouve dans le coin supérieur gauche de la page et que vous partez du centre, elle correspond au coin supérieur gauche de l'élément canevas lui-même. Utilisez des extraits de code pour comprendre de quoi je parle.
let currentColor = null; let inputs = document.getElementsByClassName("style2"); for (const input of inputs) { input.addEventListener("click", (e) => { if (e.detail !== 2) e.preventDefault(); }); } let arr = []; for (let i = 0; i < inputs.length + 1; i++) { arr.push(i.toString()); } arr.shift(); for (const input of inputs) { input.addEventListener("input", (e) => { const { value } = document.getElementById(e.target.id); currentColor = value; $("#selectedColor").css("background-color", value); }) input.addEventListener("click", (e) => { const { value } = document.getElementById(e.target.id); currentColor = value; $("#selectedColor").css("background-color", value); }) } var rangeslider = document.getElementById("sliderRange"); const setSize = document.getElementById("setSize") const submit = document.getElementById("submit") submit.addEventListener("click", (e) => { rangeslider.value = setSize.value }) const button = document.getElementById("clear") // create canvas element and append it to document body var canvas = document.getElementById('canvas'); // some hotfixes... ( ≖_≖) // get canvas 2D context and set him correct size var ctx = canvas.getContext('2d'); resize(); // last known position var pos = { x: 0, y: 0 }; window.addEventListener('resize', resize); button.addEventListener('click', clear) document.addEventListener('mousemove', draw); document.addEventListener('mousedown', setPosition); document.addEventListener('mousemove', setPosition); // new position from mouse event function setPosition(e) { let canvas = document.getElementById("canvas") pos.x = e.clientX pos.y = e.clientY } // resize canvas function resize() { ctx.canvas.width = 650; ctx.canvas.height = 375; } function draw(e) { // mouse left button must be pressed if (e.buttons !== 1) return; let canvas = document.getElementById('canvas'); console.log(pos) ctx.beginPath(); // begin ctx.lineWidth = rangeslider.value; ctx.lineCap = 'round'; ctx.strokeStyle = currentColor; ctx.moveTo(pos.x, pos.y); // from setPosition(e); ctx.lineTo(pos.x, pos.y); // to ctx.stroke(); // draw it! } function clear() { ctx.clearRect(0, 0, canvas.width, canvas.height); }
html, body { height: 100%; width: 100%; font-family: sans-serif; background-color: #B3B7B5; /* overflow: hidden; */ } .style2 { -webkit-appearance: none; -moz-appearance: none; appearance: none; background-color: transparent; width: 35px; height: 35px; border: none; cursor: pointer; } .style2::-webkit-color-swatch { border-radius: 50%; border: 3px solid #000000; } .style2::-moz-color-swatch { border-radius: 50%; border: 3px solid #000000; } .box { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; gap: 5px; max-width: 320px; margin: 0 auto; padding: 7.5px 10px; } .box1 { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; gap: 5px; max-width: 9999px; margin: 0 auto; padding: 10px 10px; } .box5 { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; gap: 5px; max-width: 650px; margin: 0 auto; padding: 10px 10px; } .box2 { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; gap: 5px; max-width: 9999px; margin: 0 auto; padding: 10px 10px; } #selectedColor { width: 100px; height: 30px; border: 3px solid black; border-radius: 5px; background-color: black; } .canvas { height: 350px; width: 650px; border: 3px solid black; border-radius: 5px; background-color: white; cursor: crosshair; position: relative; /* left: 50%; */ } #clear { width: 50px; height: 35px; font-size: 15px; border-radius: 5px; } #submit { width: 59px; height: 23px; margin: auto; left: 35%; border-radius: 5px; position: relative; } .rangeslider { width: 50%; } .myslider { -webkit-appearance: none; background: #FCF3CF ; width: 50%; height: 20px; opacity: 2; } .myslider::-webkit-slider-thumb { -webkit-appearance: none; cursor: pointer; background: #34495E ; width: 5%; height: 20px; } .myslider:hover { opacity: 1; } .rangeslider { left: 38%; position: absolute; }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>replit</title> <link href="style.css" rel="stylesheet" type="text/css" /> </head> <body> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="box5"> <canvas class="canvas" id="canvas"></canvas> </div> <div class="box1"> <button id="clear">Clear</button><br> </div> <div class="box1"> <div class="rangeslider"> <input type="range" min="1" max="100" value="5" class="myslider" id="sliderRange"> </div> </div> <div class=box1> <div> <input id="setSize" type="text" placeholder="Set Brush Size... (Max 100)"> <br> <button type="submit" id="submit" for="setSize">Submit</button> </div> </div> <div class="box"> <div class="container"> <input type="color" value="#000000" class="style2" id="1" /> </div> <div class="container"> <input type="color" value="#ffffff" class="style2" id="2" /> </div> <div class="container"> <input type="color" value="#ffffff" class="style2" id="3" /> </div> <div class="container"> <input type="color" value="#ffffff" class="style2" id="4" /> </div> <div class="container"> <input type="color" value="#ffffff" class="style2" id="5" /> </div> </div> <div class="box"> <label for="selectedColor">Current Color:</label> <div id="selectedColor"></div> </div> <script src="script.js"></script> </body> </html>
Je sais que ce code est un peu bizarre, mais faites-le-moi savoir.
La façon de calculer la position de la souris n'est pas appropriée et l'écart du canevas par rapport à la fenêtre doit être pris en compte. Vous ne pouvez pas utiliser getBoundingClientRect() pour faire ceci :
Mais vous devez également corriger la classe
.canvas
css en supprimant la largeur et la hauteur ou en définissant la même hauteur que dans la fonction de redimensionnement.https://codepen.io/Joulss/pen/BaPYgpZ?editors=1111
C'est en fait un problème facile à résoudre. Vous avez juste oublié le décalage
clientX
和clientY
. Vous voyez, ces coordonnées sont dans l'espace de la fenêtre, donc (0,0) sera dans le coin supérieur gauche de la fenêtre. Si votre toile était également dans le coin supérieur gauche, tout irait bien, mais dans votre cas, la toile est au centre donc les coordonnées ne s'alignent pas. Cela peut être corrigé en soustrayant les coordonnées de la position de l'écran du canevas.Voici un exemple :
Vous pouvez le trouver sur https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect" rel="nofollow noreferrer">https:// /developer.mozilla.org/en -US /docs/Web/API/Element/getBoundingClientRect