Aquí hay un ejemplo funcional que soluciona los problemas:
Tuviste varios problemas con tu ejemplo:
- A
<div>
no tiene height
o width
atributos. Debe configurarlos a través de CSS.
- Incluso si el div tuviera el tamaño correcto, estaba usando el valor predeterminado
position:static
, lo que significa que NO es el padre de posicionamiento de ningún hijo. Si desea que el lienzo tenga el mismo tamaño que el div, debe establecer el div en position:relative
(o absolute
o fixed
).
- Los atributos
width
y height
en un lienzo especifican el número de píxeles de datos que se dibujarán (como los píxeles reales de una imagen) y están separados del tamaño de visualización del lienzo. Estos atributos deben establecerse en números enteros.
El ejemplo vinculado anteriormente usa CSS para establecer el tamaño de div y convertirlo en un padre posicionado. Crea una función JS (que se muestra a continuación) para configurar un lienzo para que tenga el mismo tamaño de visualización que su padre posicionado, y luego ajusta las propiedades internas width
y height
para que tenga la misma cantidad de píxeles que muestra.
var canvas = document.querySelector('canvas');
fitToContainer(canvas);
function fitToContainer(canvas){
canvas.style.width ='100%';
canvas.style.height='100%';
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;
}
display:block
no tienen CSSwidth
especificado se expanden para ser tan anchos como su contenedor. Los elementos de contenedor sin un CSSheight
especificado son tan altos como su contenido; Los contenidos que tienen un porcentaje de altura son equivalentes a tenerheight:0
cuando se trata de que el padre determine qué tan alto debe ser. Siempre que utilice el posicionamiento absoluto o las dimensiones porcentuales, se calculan en relación con el "padre de compensación"; de forma predeterminada, el cuerpo es el único padre desplazado.position:static
(el valor predeterminado y el comportamiento de todos los elementos) no inician un nuevo sistema de posicionamiento, pero loposition:relative
hacen (sin cambiar de otro modo la visualización del elemento). Por ejemplo, vea esta demostración . Observe cómo#a1
está posicionado y dimensionado en relación con el cuerpo, ignorando su contenido<div>
. Observe cómo, en#b1
cambio, está posicionado y dimensionado en relación con su contenedor, siendo la única diferencia entre los dos#b { position:relative}
.Use los atributos
width
yheight
del lienzo si desea que sea tan grande como el elemento principal. Puede configurarlos usando JQuery .$(document).ready(function() { var canvas = document.getElementById("theCanvas"); canvas.width = $("#parent").width(); canvas.height = $("#parent").height(); });
Si no conoce JQuery , utilice el siguiente Javascript:
var canvas = document.getElementById("theCanvas"); var parent = document.getElementById("parent"); canvas.width = parent.offsetWidth; canvas.height = parent.offsetHeight;
Si usa los
css
atributos de alto y anchostyle="width:100%; height:100%;"
, entonces solo está estirando el lienzo. Esto hará que todo lo que dibuje en el lienzo se vea estirado.JSFiddle para la solución JQuery.
JSFiddle para la solución Javascript.
fuente
style=""
atributo explícito en el padre o use JS para establecer el estilo. Debería usargetComputedStyle()
o, como hice en mi respuesta,offsetWidth
/offsetHeight
.Utilice propiedades CSS en lugar de atributos en las etiquetas:
<div style="background-color:blue;width:140px;height:20px"> <canvas style="background-color: red;width:100%;height:100%"> </canvas> </div>
Eso parece funcionar
fuente