Acabo de encontrar un comportamiento inesperado en el elemento HTML Canvas; Traté de desmenuzar el problema tanto como pude. En resumen, parece que ctx.fillText no puede representar el texto en regiones específicas del lienzo.
Este es el script más pequeño que pude escribir para reproducir el error de manera consistente (lo probé en diferentes máquinas, sistemas operativos y navegadores). Crea un lienzo negro (1,25×1,25 en unidades de espacio de dibujo, 1000×1000 en píxeles, el origen del espacio de dibujo está en el medio) y dibuja puntos rojos cuando pasa el mouse sobre él, pero hay varias franjas horizontales en las que falla para hacerlo
// define boundaries of drawing space const left = -.625; const tops = -.625; const scale = 800; const width = 1.25; const height = 1.25; // create canvas let canvas = document.createElement("canvas"); canvas.width = scale * width; canvas.height = scale * height; canvas.style.backgroundColor = "black"; document.body.appendChild(canvas); // create context let ctx = canvas.getContext("2d"); ctx.scale(scale, scale); ctx.translate(-left, -tops); ctx.textBaseline = "middle"; ctx.textAlign = "center"; ctx.font = `.03px arial`; ctx.fillStyle = "rgba(208, 64, 64, 1)"; // coordinates follow mouse addEventListener("mousemove", event => { let mouseX = left + event.layerX / scale; let mouseY = tops + event.layerY / scale; ctx.fillText(".", mouseX, mouseY); });Puede pegarlo en sus herramientas de desarrollo en aproximadamente: en blanco y verlo por sí mismo. En cualquier caso, aquí también hay un gif:
Como puede ver, quedan varias franjas horizontales intactas, a pesar de que las paso con el mouse. Además, la totalidad del 80 % inferior del lienzo no se ve afectada.
Algunas notas importantes:
mousemove no es el culpable, mouseX y mouseY se actualizan correctamente y sin problemas.ctx.strokeText , que funciona bien.ctx.fillPath .¿Estoy haciendo algo mal? ¿O es esto realmente un error?
El problema es el tamaño de fuente extremadamente pequeño que está tratando de representar. No debe usar valores como .03px ; tiene sentido que los renderizadores no puedan renderizar algo así correctamente, considerando que el tamaño típico más pequeño que se puede pintar en una pantalla es 1 píxel (un poco más pequeño que el de las pantallas de alto DPI, pero probablemente no mucho menos de .25px ). Puede funcionar para pintar líneas simples, pero la representación es más complicada que eso (por ejemplo, sugerencias ).
Pruebe los siguientes valores:
scale = 80width = 12.5height = 12.5ctx.font = `.3px arial`; Alternativamente, intente pintar un punto o un cuadrado en lugar de un "." cuerda.
Como nota al margen, pude reproducir el problema en Chrome, pero en Firefox en realidad funciona bien.