tamaƱo tag style cambiar attribute html5 canvas

html5 - tag - html title attribute style



Ancho y altura del lienzo en HTML5 (3)

¡Muchas gracias! Finalmente resolví el problema de píxeles borrosos con este código:

<canvas id="graph" width=326 height=240 style=''width:326px;height:240px''></canvas>

más el truco de ''medio píxel'' para desenredar las líneas.

¿Es posible arreglar el ancho y alto de un elemento canvas HTML5?

La forma habitual es la siguiente:

<canvas id="canvas" width="300" height="300"></canvas>


El elemento DOM de canvas tiene propiedades .height y .width que corresponden a los atributos height="…" y width="…" . Configúrelos en valores numéricos en código JavaScript para cambiar el tamaño de su lienzo. Por ejemplo:

var canvas = document.getElementsByTagName(''canvas'')[0]; canvas.width = 800; canvas.height = 600;

Tenga en cuenta que esto borra el lienzo, aunque debe seguir con ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height); para manejar aquellos navegadores que no borran completamente el lienzo. Tendrá que volver a dibujar cualquier contenido que desee mostrar después del cambio de tamaño.

Tenga en cuenta además que la altura y el ancho son las dimensiones de lienzo lógico utilizadas para el dibujo y son diferentes de los style.height style.width style.height y style.width . Si no establece los atributos CSS, el tamaño intrínseco del lienzo se usará como su tamaño de visualización; si establece los atributos CSS, y difieren de las dimensiones del lienzo, su contenido se escalará en el navegador. Por ejemplo:

// Make a canvas that has a blurry pixelated zoom-in // with each canvas pixel drawn showing as roughly 2x2 on screen canvas.width = 400; canvas.height = 300; canvas.style.width = ''800px''; canvas.style.height = ''600px'';

Vea este ejemplo en vivo de un lienzo que se amplía por 4x.

var c = document.getElementsByTagName(''canvas'')[0]; var ctx = c.getContext(''2d''); ctx.lineWidth = 1; ctx.strokeStyle = ''#f00''; ctx.fillStyle = ''#eff''; ctx.fillRect( 10.5, 10.5, 20, 20 ); ctx.strokeRect( 10.5, 10.5, 20, 20 ); ctx.fillRect( 40, 10.5, 20, 20 ); ctx.strokeRect( 40, 10.5, 20, 20 ); ctx.fillRect( 70, 10, 20, 20 ); ctx.strokeRect( 70, 10, 20, 20 ); ctx.strokeStyle = ''#fff''; ctx.strokeRect( 10.5, 10.5, 20, 20 ); ctx.strokeRect( 40, 10.5, 20, 20 ); ctx.strokeRect( 70, 10, 20, 20 );

body { background:#eee; margin:1em; text-align:center } canvas { background:#fff; border:1px solid #ccc; width:400px; height:160px }

<canvas width="100" height="40"></canvas> <p>Showing that re-drawing the same antialiased lines does not obliterate old antialiased lines.</p>


Un lienzo tiene 2 tamaños, la dimensión de los píxeles en el lienzo (es backingstore o drawingBuffer) y el tamaño de visualización. La cantidad de píxeles se establece utilizando los atributos del lienzo. En HTML

<canvas width="400" height="300"></canvas>

O en JavaScript

someCanvasElement.width = 400; someCanvasElement.height = 300;

Separados de eso están el ancho y la altura del estilo CSS del lienzo

En CSS

canvas { /* or some other selector */ width: 500px; height: 400px; }

O en JavaScript

canvas.style.width = "500px"; canvas.style.height = "400px";

La mejor manera de crear un lienzo de 1x1 píxeles es usar SIEMPRE CSS para elegir el tamaño y luego escribir un poco de JavaScript para que el número de píxeles coincida con ese tamaño.

function resizeCanvasToDisplaySize(canvas) { // look up the size the canvas is being displayed const width = canvas.clientWidth; const height = canvas.clientHeight; // If it''s resolution does not match change it if (canvas.width !== width || canvas.height !== height) { canvas.width = width; canvas.height = height; return true; } return false; }

¿Por qué es esta la mejor manera? Porque funciona en la mayoría de los casos sin tener que cambiar ningún código.

Aquí hay un lienzo de ventana completa:

const ctx = document.querySelector("#c").getContext("2d"); function render(time) { time *= 0.001; resizeCanvasToDisplaySize(ctx.canvas); ctx.fillStyle = "#DDE"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.save(); const spacing = 64; const size = 48; const across = ctx.canvas.width / spacing + 1; const down = ctx.canvas.height / spacing + 1; const s = Math.sin(time); const c = Math.cos(time); for (let y = 0; y < down; ++y) { for (let x = 0; x < across; ++x) { ctx.setTransform(c, -s, s, c, x * spacing, y * spacing); ctx.strokeRect(-size / 2, -size / 2, size, size); } } ctx.restore(); requestAnimationFrame(render); } requestAnimationFrame(render); function resizeCanvasToDisplaySize(canvas) { // look up the size the canvas is being displayed const width = canvas.clientWidth; const height = canvas.clientHeight; // If it''s resolution does not match change it if (canvas.width !== width || canvas.height !== height) { canvas.width = width; canvas.height = height; return true; } return false; }

body { margin: 0; } canvas { display: block; width: 100vw; height: 100vh; }

<canvas id="c"></canvas>

Y Aquí hay un lienzo como un flotador en un párrafo

const ctx = document.querySelector("#c").getContext("2d"); function render(time) { time *= 0.001; resizeCanvasToDisplaySize(ctx.canvas); ctx.fillStyle = "#DDE"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.save(); const spacing = 64; const size = 48; const across = ctx.canvas.width / spacing + 1; const down = ctx.canvas.height / spacing + 1; const s = Math.sin(time); const c = Math.cos(time); for (let y = 0; y <= down; ++y) { for (let x = 0; x <= across; ++x) { ctx.setTransform(c, -s, s, c, x * spacing, y * spacing); ctx.strokeRect(-size / 2, -size / 2, size, size); } } ctx.restore(); requestAnimationFrame(render); } requestAnimationFrame(render); function resizeCanvasToDisplaySize(canvas) { // look up the size the canvas is being displayed const width = canvas.clientWidth; const height = canvas.clientHeight; // If it''s resolution does not match change it if (canvas.width !== width || canvas.height !== height) { canvas.width = width; canvas.height = height; return true; } return false; }

span { width: 250px; height: 100px; float: left; padding: 1em 1em 1em 0; display: inline-block; } canvas { width: 100%; height: 100%; }

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent cursus venenatis metus. Mauris ac nibh at odio scelerisque scelerisque. Donec ut enim <span class="diagram"><canvas id="c"></canvas></span> vel urna gravida imperdiet id ac odio. Aenean congue hendrerit eros id facilisis. In vitae leo ullamcorper, aliquet leo a, vehicula magna. Proin sollicitudin vestibulum aliquet. Sed et varius justo. <br/><br/> Quisque tempor metus in porttitor placerat. Nulla vehicula sem nec ipsum commodo, at tincidunt orci porttitor. Duis porttitor egestas dui eu viverra. Sed et ipsum eget odio pharetra semper. Integer tempor orci quam, eget aliquet velit consectetur sit amet. Maecenas maximus placerat arcu in varius. Morbi semper, quam a ullamcorper interdum, augue nisl sagittis urna, sed pharetra lectus ex nec elit. Nullam viverra lacinia tellus, bibendum maximus nisl dictum id. Phasellus mauris quam, rutrum ut congue non, hendrerit sollicitudin urna. </p>

Aquí hay un lienzo en un panel de control de gran tamaño

const ctx = document.querySelector("#c").getContext("2d"); function render(time) { time *= 0.001; resizeCanvasToDisplaySize(ctx.canvas); ctx.fillStyle = "#DDE"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.save(); const spacing = 64; const size = 48; const across = ctx.canvas.width / spacing + 1; const down = ctx.canvas.height / spacing + 1; const s = Math.sin(time); const c = Math.cos(time); for (let y = 0; y < down; ++y) { for (let x = 0; x < across; ++x) { ctx.setTransform(c, -s, s, c, x * spacing, y * spacing); ctx.strokeRect(-size / 2, -size / 2, size, size); } } ctx.restore(); requestAnimationFrame(render); } requestAnimationFrame(render); function resizeCanvasToDisplaySize(canvas) { // look up the size the canvas is being displayed const width = canvas.clientWidth; const height = canvas.clientHeight; // If it''s resolution does not match change it if (canvas.width !== width || canvas.height !== height) { canvas.width = width; canvas.height = height; return true; } return false; } // ----- the code above related to the canvas does not change ---- // ---- the code below is related to the slider ---- const $ = document.querySelector.bind(document); const left = $(".left"); const slider = $(".slider"); let dragging; let lastX; let startWidth; slider.addEventListener(''mousedown'', e => { lastX = e.pageX; dragging = true; }); window.addEventListener(''mouseup'', e => { dragging = false; }); window.addEventListener(''mousemove'', e => { if (dragging) { const deltaX = e.pageX - lastX; left.style.width = left.clientWidth + deltaX + "px"; lastX = e.pageX; } });

body { margin: 0; } .frame { display: flex; align-items: space-between; height: 100vh; } .left { width: 70%; left: 0; top: 0; right: 0; bottom: 0; } canvas { width: 100%; height: 100%; } pre { padding: 1em; } .slider { width: 10px; background: #000; } .right { flex 1 1 auto; }

<div class="frame"> <div class="left"> <canvas id="c"></canvas> </div> <div class="slider"> </div> <div class="right"> <pre> * controls * go * here &lt;- drag this </pre> </div> </div>

aquí hay un lienzo como fondo

const ctx = document.querySelector("#c").getContext("2d"); function render(time) { time *= 0.001; resizeCanvasToDisplaySize(ctx.canvas); ctx.fillStyle = "#DDE"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.save(); const spacing = 64; const size = 48; const across = ctx.canvas.width / spacing + 1; const down = ctx.canvas.height / spacing + 1; const s = Math.sin(time); const c = Math.cos(time); for (let y = 0; y < down; ++y) { for (let x = 0; x < across; ++x) { ctx.setTransform(c, -s, s, c, x * spacing, y * spacing); ctx.strokeRect(-size / 2, -size / 2, size, size); } } ctx.restore(); requestAnimationFrame(render); } requestAnimationFrame(render); function resizeCanvasToDisplaySize(canvas) { // look up the size the canvas is being displayed const width = canvas.clientWidth; const height = canvas.clientHeight; // If it''s resolution does not match change it if (canvas.width !== width || canvas.height !== height) { canvas.width = width; canvas.height = height; return true; } return false; }

body { margin: 0; } canvas { display: block; width: 100vw; height: 100vh; position: fixed; } #content { position: absolute; margin: 0 1em; font-size: xx-large; font-family: sans-serif; font-weight: bold; text-shadow: 2px 2px 0 #FFF, -2px -2px 0 #FFF, -2px 2px 0 #FFF, 2px -2px 0 #FFF; }

<canvas id="c"></canvas> <div id="content"> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent cursus venenatis metus. Mauris ac nibh at odio scelerisque scelerisque. Donec ut enim vel urna gravida imperdiet id ac odio. Aenean congue hendrerit eros id facilisis. In vitae leo ullamcorper, aliquet leo a, vehicula magna. Proin sollicitudin vestibulum aliquet. Sed et varius justo. </p> <p> Quisque tempor metus in porttitor placerat. Nulla vehicula sem nec ipsum commodo, at tincidunt orci porttitor. Duis porttitor egestas dui eu viverra. Sed et ipsum eget odio pharetra semper. Integer tempor orci quam, eget aliquet velit consectetur sit amet. Maecenas maximus placerat arcu in varius. Morbi semper, quam a ullamcorper interdum, augue nisl sagittis urna, sed pharetra lectus ex nec elit. Nullam viverra lacinia tellus, bibendum maximus nisl dictum id. Phasellus mauris quam, rutrum ut congue non, hendrerit sollicitudin urna. </p> </div>

Como no configuré los atributos, lo único que cambió en cada muestra es el CSS (en lo que se refiere al lienzo)

Notas:

  • No coloque bordes o relleno en un elemento de lona. Calcular el tamaño para restar del número de dimensiones del elemento es problemático