¿Cómo hacer que un elemento se expanda o contraiga a su contenedor principal?

El objective es que el elemento se expanda al tamaño de su contenedor principal, en este caso un

, sin importar cuán grande o pequeño sea ese contenedor.

El código:

  svg, #container{ height: 100%; width: 100%; }  

La solución más común a este problema parece ser establecer el atributo viewBox en el elemento .

 viewBox="0 0 widthOfContainer heightOfContainer" 

Sin embargo, esto no parece funcionar en los casos en que los elementos dentro del elemento tienen anchos y / o alturas predefinidos. Por ejemplo, el elemento , en el código anterior, tiene su ancho y alto explícitamente establecidos.

Entonces la solución obvia es usar% widths y% heights en esos elementos también. ¿Pero esto incluso tiene que hacerse? Especialmente, ya que funciona bien y se expande / contrae sin problemas con alturas y anchuras explícitas .

Si elementos como y otros elementos como este tienen que tener sus anchuras y alturas definidas en porcentajes, ¿hay alguna manera en Inkscape de establecerlo de modo que todos los elementos con el documento usen anchos de porcentaje, alturas, etc. .. en lugar de dimensiones fijas?

El viewBox no es la altura del contenedor, es del tamaño de tu dibujo. Define tu viewBox para que tenga 100 unidades de ancho, luego define tu rect para que sea de 10 unidades. Después de eso, independientemente de lo grande que escales el SVG, el rect será del 10% del ancho de la imagen.

Supongamos que tengo un SVG que se ve así: pic1

Y quiero ponerlo en un div y hacerlo llenar el div responsivamente. Mi forma de hacerlo es la siguiente:

Primero abro el archivo SVG en una aplicación como inkscape. En Archivo-> Propiedades del documento, establezco el ancho del documento en 800px y la altura en 600px (puede elegir otros tamaños). Luego ajusto el SVG en este documento.

pic2

Luego guardo este archivo como un nuevo archivo SVG y obtengo los datos de ruta desde este archivo. Ahora en HTML, el código que hace la magia es el siguiente:

 

Tenga en cuenta que el ancho y alto de SVG están configurados al 100%, ya que queremos que llene el contenedor vertical y horizontalmente, pero el ancho y alto de viewBox son los mismos que el ancho y alto del documento en inkscape que es 800px X 600px. Lo siguiente que debe hacer es configurar preserveAspectRatio en “ninguno”. Si necesita más información sobre este atributo, aquí hay un buen enlace . Y eso es todo lo que hay que hacer.

Una cosa más es que este código funciona en casi todos los navegadores principales, incluso en los antiguos, pero en algunas versiones de Android e iOS necesitas usar algún código javascrip / jQuery para mantenerlo constante. Uso lo siguiente en las funciones preparadas para documentos y cambio de tamaño:

 $('#svgId').css({ 'width': $('#containerId').width() + 'px', 'height': $('#containerId').height() + 'px' }); 

¡Espero eso ayude!

Lo que funcionó para mí recientemente es eliminar todos los atributos height="" y width="" de la etiqueta y todas las tags secundarias. Luego puede usar la escala usando un porcentaje del alto o ancho del contenedor padre.

@robertc tiene razón, pero también debe notar que svg, #container hace que la svg se svg, #container exponencialmente para cualquier cosa que no sea 100% (una para #container y otra para svg ).

En otras palabras, si apliqué 50% h / w a ambos elementos, en realidad es 50% de 50%, o .5 * .5, que equivale a .25 o 25% de escala.

Un selector funciona bien cuando se usa como @robertc sugiere.

 svg { width:50%; height:50%; } 

Para tu iphone puedes usar en tu cabeza balise:

 "width=device-width"