Quiero crear un div
que pueda cambiar su ancho / alto a medida que cambia el ancho de la ventana.
¿Hay alguna regla CSS3 que permita que la altura cambie de acuerdo con el ancho, manteniendo su relación de aspecto ?
Sé que puedo hacer esto a través de JavaScript, pero preferiría usar solo CSS.
Respuestas:
Simplemente cree un contenedor
<div>
con un valor de porcentaje parapadding-bottom
, como este:El resultado será una
<div>
altura igual al 75% del ancho de su contenedor (una relación de aspecto de 4: 3).Esto se basa en el hecho de que para el relleno:
Valores de relleno inferior para otras relaciones de aspecto y 100% de ancho:
Colocar contenido en el div:
Para mantener la relación de aspecto del div y evitar que su contenido lo estire, debe agregar un elemento secundario absolutamente posicionado y estirarlo hasta los bordes del envoltorio con:
He aquí una demostración y otro más en profundidad de demostración
fuente
vw
unidades:Puede usar
vw
unidades tanto para el ancho como para la altura del elemento. Esto permite preservar la relación de aspecto del elemento, en función del ancho de la ventana gráfica.Alternativamente, también puede usar
vh
para la altura de la vista, o inclusovmin
/vmax
para usar la menor / mayor de las dimensiones de la vista (discusión aquí ).Ejemplo: relación de aspecto 1: 1
Para otras relaciones de aspecto, puede usar la siguiente tabla para calcular el valor de la altura de acuerdo con el ancho del elemento:
Ejemplo: cuadrícula 4x4 de divisiones cuadradas
Aquí hay un violín con esta demostración y aquí hay una solución para hacer una cuadrícula receptiva de cuadrados con contenido centrado vertical y horizontalmente .
La compatibilidad del navegador para las unidades vh / vw es IE9 +, consulte canIuse para obtener más información
fuente
width:50%
yheight:50vw
la altura es un poco más alta que el ancho, no es exactamente una proporción 1: 1. ¿Algunas ideas?He encontrado una manera de hacer esto usando CSS, pero debes tener cuidado, ya que puede cambiar dependiendo del flujo de tu propio sitio web. Lo hice para insertar videos con una relación de aspecto constante dentro de una porción de ancho fluido de mi sitio web.
Digamos que tienes un video incrustado como este:
A continuación, puede colocar todo esto dentro de un div con una clase de "video". Esta clase de video probablemente será el elemento fluido en su sitio web de tal manera que, por sí misma, no tiene restricciones de altura directas, pero cuando cambie el tamaño del navegador cambiará de ancho de acuerdo con el flujo del sitio web. Este sería el elemento en el que probablemente esté intentando obtener su video incrustado mientras mantiene una cierta relación de aspecto del video.
Para hacer esto, pongo una imagen antes del objeto incrustado dentro del div de clase "video".
!!! La parte importante es que la imagen tiene la relación de aspecto correcta que desea mantener. Además, asegúrese de que el tamaño de la imagen sea AL MENOS tan grande como el más pequeño que espera que obtenga el video (o lo que sea que esté manteniendo el AR) según su diseño. Esto evitará posibles problemas en la resolución de la imagen cuando se cambia el tamaño porcentual. Por ejemplo, si desea mantener una relación de aspecto de 3: 2, no use solo una imagen de 3 px por 2 px. Puede funcionar en algunas circunstancias, pero no lo he probado, y probablemente sería una buena idea evitarlo.
Probablemente ya debería tener un ancho mínimo como este definido para elementos fluidos de su sitio web. De lo contrario, es una buena idea hacerlo para evitar cortar elementos o superponerlos cuando la ventana del navegador sea demasiado pequeña. Es mejor tener una barra de desplazamiento en algún momento. El ancho más pequeño que debe tener una página web es de alrededor de ~ 600px (incluidas las columnas de ancho fijo) porque las resoluciones de pantalla no se reducen a menos que se trate de sitios compatibles con teléfonos. !!!
Utilizo un png completamente transparente, pero realmente no creo que termine importando si lo haces bien. Me gusta esto:
Ahora debería poder agregar CSS similar al siguiente:
Asegúrese de eliminar también cualquier declaración explícita de alto o ancho dentro del objeto y las etiquetas de inserción que generalmente vienen con el código de inserción copiado / pegado.
La forma en que funciona depende de las propiedades de posición del elemento de clase de video y el elemento que desea mantener una cierta relación de aspecto. Aprovecha la forma en que una imagen mantendrá su relación de aspecto adecuada cuando se redimensiona en un elemento. Le dice a lo que sea que esté en el elemento de la clase de video que aproveche al máximo el espacio real proporcionado por la imagen dinámica al forzar su ancho / alto al 100% del elemento de la clase de video que la imagen ajusta.
Muy bien, ¿eh?
Es posible que tengas que jugar un poco para que funcione con tu propio diseño, pero esto realmente funciona sorprendentemente bien para mí. El concepto general está ahí.
fuente
Elliot me inspiró a esta solución, gracias:
aspectratio.png
es un archivo PNG completamente transparente con el tamaño de su relación de aspecto preferida, en mi caso 30x10 píxeles.HTML
CSS3
Tenga en cuenta:
background-size
es una función css3 que podría no funcionar con sus navegadores de destino. Puede verificar la interoperabilidad (por ejemplo, caniuse.com ).fuente
Para agregar a la respuesta de Web_Designer,
<div>
tendrá una altura (compuesta completamente por el relleno inferior) del 75% del ancho del elemento que lo contiene . Aquí hay un buen resumen: http://mattsnider.com/css-using-percent-for-margin-and-padding/ . No estoy seguro de por qué esto debería ser así, pero así es como es.Si desea que su div tenga un ancho diferente al 100%, necesita otro div de envoltura en el que establecer el ancho:
Utilicé algo similar al truco de imagen de Elliot recientemente para permitirme usar consultas de medios CSS para servir un archivo de logotipo diferente dependiendo de la resolución del dispositivo, pero aún así escalar proporcionalmente como lo
<img>
haría naturalmente (configuré el logotipo como imagen de fondo en un .png transparente con la relación de aspecto correcta). Pero la solución de Web_Designer me ahorraría una solicitud http.fuente
Como se indica aquí en w3schools.com y algo reiterado en esta respuesta aceptada , los valores de relleno como porcentajes (énfasis mío):
Ergo, un ejemplo correcto de un DIV receptivo que mantiene una relación de aspecto de 16: 9 es el siguiente:
CSS
HTML
Demo en JSFiddle
fuente
Como @ web-tiki ya muestra una forma de usar
vh
/vw
, también necesito una forma de centrarme en la pantalla, aquí hay un código de fragmento para el retrato de 9:16 .translateY
mantendrá este centro en la pantalla.calc(100vw * 16 / 9)
se espera altura para 9/16.(100vw * 16 / 9 - 100vh)
es la altura de desbordamiento, por lo tanto, levantarlaoverflow height/2
lo mantendrá centrado en la pantalla.Para el paisaje y mantener 16: 9 , muestra uso
La proporción de 9/16 es la facilidad para el cambio, no hay necesidad de predefinido
100:56.25
o100:75
Si usted quiere asegurarse de altura en primer lugar, usted debe cambiar la anchura y la altura, por ejemploheight:100vh;width: calc(100vh * 9 / 16)
para la 9:16 retrato.Si desea adaptarse a diferentes tamaños de pantalla, también puede interesarle
@media (orientation: portrait)
/ /@media (orientation: landscape)
portrait
/landscape
para cambiar la relación.fuente
Esta es una mejora en la respuesta aceptada:
fuente
Me topé con una solución inteligente usando
<svg>
ydisplay:grid
.El elemento de cuadrícula le permite ocupar el mismo espacio con dos (o más) elementos, sin necesidad de especificar cuál establece la altura. Lo que significa que, fuera de la caja, el más alto establece la relación .
Esto significa que puede usarlo tal como está cuando sabe que el contenido nunca será lo suficientemente alto como para llenar toda la "relación" y simplemente está buscando una manera de colocar el contenido en este espacio (es decir, centrarlo en ambas direcciones)
display:flex; align-items:center; justify-content:center
)Es más o menos lo mismo que usar un sistema transparente
<img>
condisplay:block
y relación predeterminada, excepto el<svg>
más ligero y mucho más fácil de modificar (para cambiar la relación responsablemente, si necesita).Todo lo que necesitas hacer es cambiar la
<svg>
relación s:<svg viewBox="0 0 4 3"></svg>
<svg viewBox="0 0 16 9"></svg>
Véalo trabajando:
Mostrar fragmento de código
Si necesita una solución donde el elemento de contenido no puede establecer la proporción cuando es más alto (con desbordamiento oculto o automático), debe configurarlo
position:relative
en la cuadrícula yposition:absolute; height:100%; overflow-y: auto;
en el contenido. Ejemplo:Mostrar fragmento de código
fuente
Basándome en sus soluciones, he hecho un truco:
Cuando lo use, su HTML será solo
Para usarlo de esta manera haz: CSS:
y js (jQuery)
Y teniendo esto, simplemente establece attr
data-keep-ratio
en alto / ancho y eso es todo.fuente
data-keep-ratio
notkeep-ratio
y obtener su valor usando$(this).data('keep-ratio');
Puedes usar un svg. Haga que la posición del contenedor / envoltorio sea relativa, coloque el svg primero como estático y luego coloque el contenido en una posición absoluta (arriba: 0; izquierda: 0; derecha: 0; abajo: 0;)
Ejemplo con proporciones 16: 9:
image.svg: (se puede incluir en src)
CSS:
HTML:
Tenga en cuenta que svg en línea no parece funcionar, pero puede urlencode el svg e incrustarlo en el atributo img src de esta manera:
fuente
SCSS es la mejor solución en mi caso; utilizando un atributo de datos:
Por ejemplo :
fuente
fuente
[data-aspect-ratio]
selector de atributos está disponible para usted en CSS.Si bien la mayoría de las respuestas son muy interesantes, la mayoría de ellas requieren que la imagen ya tenga el tamaño correcto ... Otras soluciones solo funcionan para un ancho y no tienen en cuenta la altura disponible, pero a veces también desea ajustar el contenido en una altura determinada. .
Intenté unirlos para brindar una solución totalmente portátil y redimensionable ... El truco es usar la escala automática de una imagen pero usar un elemento svg en línea en lugar de usar una imagen renderizada previamente o cualquier forma de segunda solicitud HTTP ...
Tenga en cuenta que he usado valores grandes en los atributos de ancho y alto del SVG, ya que debe ser más grande que el tamaño máximo esperado, ya que solo puede reducirse. El ejemplo hace que la relación del div 10: 5
fuente
Solo una idea o un truco.
fuente
supongamos que tiene 2 divs, el div externo es un contenedor y el interno podría ser cualquier elemento que necesite para mantener su relación (img o un iframe de youtube o lo que sea)
html se ve así:
supongamos que necesita mantener la proporción del "elemento"
relación => 4 a 1 o 2 a 1 ...
css se ve así
el relleno cuando se especifica en% se calcula en función del ancho, no de la altura. .. así que básicamente no importa cuál sea su ancho, la altura siempre se calculará en función de eso. que mantendrá la proporción.
fuente
Me he encontrado con este problema muchas veces, así que hice una solución JS para ello. Básicamente, esto ajusta la altura del domElement según el ancho del elemento según la relación que especifique. Puede usarlo de la siguiente manera:
<div ratio="4x3"></div>
Tenga en cuenta que, dado que establece la altura del elemento, el elemento debe ser a
display:block
odisplay:inline-block
.https://github.com/JeffreyArts/html-ratio-component
fuente
Si desea ajustar un cuadrado dentro de la ventana gráfica en vista vertical u horizontal (lo más grande posible, pero nada sobresaliendo), cambie entre usar
vw
/vh
en orientaciónportrait
/landscape
:fuente
Me gustaría compartir mi solución, donde tengo una
img
etiqueta que llena una determinada relación de aspecto. No podía usarbackground
debido a la falta de apoyo de la CMS y no me prefiere usar una etiqueta de estilo de esta manera:<img style="background:url(...)" />
. Además, el ancho es del 100%, por lo que no es necesario establecerlo en un tamaño fijo como en algunas de las soluciones. ¡Se escalará de manera receptiva!fuente
Puede lograr eso usando SVG.
Depende de un caso, pero en algunos es realmente útil. Como ejemplo, puede establecer
background-image
sin establecer una altura fija o usarlo para incrustar youtube<iframe>
con relación16:9
yposition:absolute
etc.Para
3:2
conjunto de proporcionesviewBox="0 0 3 2"
y así sucesivamente.Ejemplo:
fuente
Una forma sencilla de mantener la relación de aspecto, utilizando el elemento de lienzo.
Intente cambiar el tamaño del div a continuación para verlo en acción.
Para mí, este enfoque funcionó mejor, así que lo estoy compartiendo con otros para que ellos también puedan beneficiarse de él.
¡También funciona con altura dinámica!
fuente
Digamos que desea mantener el Ancho: 100 px y la Altura: 50 px (es decir, 2: 1) Simplemente haga estos cálculos:
fuente
Bueno, recientemente recibimos la posibilidad de usar la
aspect-ratio
propiedad en CSS.https://twitter.com/Una/status/1260980901934137345/photo/1
Nota: El soporte aún no es el mejor ...
https://caniuse.com/#search=aspect-ratio
fuente
Puede usar el diseño de flujo (FWD).
https://en.wikipedia.org/wiki/Adaptive_web_design
Escalará y mantendrá el diseño, es un poco complejo pero permite cambiar el tamaño de una página sin presionar el contenido como (RWD).
Parece receptivo pero está escalando. https://www.youtube.com/watch?v=xRcBMLI4jbg
Puede encontrar la fórmula de escala CSS aquí:
http://plugnedit.com/pnew/928-2/
fuente
Usé una nueva solución.
A la relación de aspecto principal
Sin embargo, esto es relativo a toda la ventana gráfica. Entonces, si necesita un div que sea el 30% del ancho de la ventana gráfica, puede usar 30vw en su lugar, y como conoce el ancho, puede reutilizarlos en altura usando la unidad calc y vw.
fuente
Si toda la estructura del contenedor se basara en porcentajes, este sería el comportamiento predeterminado, ¿puede proporcionar un ejemplo más específico?
A continuación se muestra un ejemplo de lo que quiero decir, si toda su jerarquía principal se basara en%, cualquier ajuste de la ventana del navegador funcionaría sin ningún js / css adicional, ¿no es posible con su diseño?
fuente