Tengo un sitio para armar que tiene una relación de aspecto fija de aproximadamente 16:9
paisaje, como un video.
Quiero centrarlo y expandirlo para llenar el ancho disponible y la altura disponible, pero nunca crecer más en ninguno de los lados.
Por ejemplo:
- Una página alta y delgada haría que el contenido se extendiera por todo el ancho manteniendo una altura proporcional.
- Una página corta y ancha tendría el contenido extendiéndose por toda la altura, con un ancho proporcional.
Hay dos métodos que he estado buscando:
- Use una imagen con la relación de aspecto correcta para expandir un contenedor
div
, pero no pude lograr que se comporte de la misma manera en los principales navegadores. - Establecer un relleno inferior proporcional, pero que solo funciona en relación con el ancho e ignora la altura. Sigue creciendo con el ancho y muestra barras de desplazamiento verticales.
Sé que podrías hacer esto con JS con bastante facilidad, pero me gustaría una solución CSS pura.
¿Algunas ideas?
html
css
responsive-design
aspect-ratio
Henry Gibson
fuente
fuente
position: relative (default) height: 0 padding-<top/bottom>: H/W*100%
Respuestas:
Utilice las nuevas unidades de ventana gráfica CSS
vw
yvh
(ancho / altura de la ventana gráfica)VIOLÍN
Cambie el tamaño vertical y horizontalmente y verá que el elemento siempre llenará el tamaño máximo de la ventana gráfica sin romper la proporción y sin barras de desplazamiento.
(PURO) CSS
Mostrar fragmento de código
Si desea utilizar un máximo de, por ejemplo, el 90% de ancho y alto de la ventana gráfica : FIDDLE
Mostrar fragmento de código
Además, la compatibilidad del navegador también es bastante buena: IE9 +, FF, Chrome, Safari .
fuente
vh
,vw
,vmin
,vmax
). Sin embargo, existe una solución alternativa , que utiliza consultas de medios para apuntar a dispositivos iOS.Simplemente reformulando
Danield
la respuesta en un mixin MENOS, para un uso posterior:fuente
Utilice una consulta de medios CSS
@media
junto con las unidades de ventana gráfica CSSvw
yvh
para adaptarse a la relación de aspecto de la ventana gráfica. Esto tiene la ventaja de actualizar otras propiedades, comofont-size
también.Este violín demuestra la relación de aspecto fija para el div y el texto coincide exactamente con su escala.
El tamaño inicial se basa en el ancho completo:
Luego, cuando la ventana gráfica sea más ancha que la relación de aspecto deseada, cambie a la altura como medida base:
Esto es muy similar al enfoque
max-width
y de @Danield, solo que más flexible.max-height
fuente
Mi pregunta original para esto era cómo tener ambos un elemento de un aspecto fijo, pero encajarlo exactamente dentro de un contenedor específico, lo que lo hace un poco complicado. Si simplemente desea que un elemento individual mantenga su relación de aspecto, es mucho más fácil.
El mejor método con el que me he encontrado es dar una altura cero al elemento y luego usar el porcentaje de relleno en la parte inferior para darle altura. El relleno porcentual es siempre proporcional al ancho de un elemento, y no a su altura, incluso si es el relleno superior o inferior.
Propiedades de relleno W3C
Entonces, utilizando eso, puede darle a un elemento un porcentaje de ancho para que se siente dentro de un contenedor, y luego un relleno para especificar la relación de aspecto, o en otros términos, la relación entre su ancho y alto.
Entonces, en el ejemplo anterior, el objeto ocupa el 80% del ancho del contenedor y luego su altura es el 56,25% de ese valor. Si su ancho fuera de 160 px, entonces el relleno inferior y, por lo tanto, la altura sería de 90 px, un aspecto de 16: 9.
El pequeño problema aquí, que puede no ser un problema para usted, es que no hay espacio natural dentro de su nuevo objeto. Si necesita poner algo de texto, por ejemplo, y ese texto necesita tomar sus propios valores de relleno, debe agregar un contenedor dentro y especificar las propiedades allí.
Además, las unidades vw y vh no son compatibles con algunos navegadores más antiguos, por lo que es posible que la respuesta aceptada a mi pregunta no sea posible para usted y que tenga que usar algo más lo-fi.
fuente
Entiendo que solicitó que le gustaría una
CSS
solución específica. Para mantener la relación de aspecto, deberá dividir la altura por la relación de aspecto deseada. 16: 9 = 1,7777777777778.Para obtener la altura correcta para el contenedor, necesitaría dividir el ancho actual por 1.777777777778. Dado que no puede verificar el valor
width
del contenedor con soloCSS
o dividir por un porcentajeCSS
, esto no es posible sinJavaScript
(que yo sepa).Escribí un guión funcional que mantendrá la relación de aspecto deseada.
HTML
CSS
JavaScript
Puede usar de
function
nuevo si desea mostrar algo más con una proporción diferente usandofuente
window.onresize
se activa en el momento en que el navegador cambia de tamaño.Ahora hay una nueva propiedad CSS especificado para hacer frente a esto:
object-fit
.http://docs.webplatform.org/wiki/css/properties/object-fit
La compatibilidad con el navegador todavía es algo deficiente ( http://caniuse.com/#feat=object-fit ); actualmente funciona hasta cierto punto en la mayoría de los navegadores, excepto en Microsoft, pero con el tiempo es exactamente lo que se requería para esta pregunta.
fuente
La respuesta de Danield es buena, pero solo se puede usar cuando el div llena toda la ventana gráfica, o usando un poco de
calc
, se puede usar si se conoce el ancho y la altura del otro contenido en la ventana gráfica.Sin embargo, al combinar el
margin-bottom
truco con el método en la respuesta antes mencionada, el problema se puede reducir a tener que conocer la altura del otro contenido. Esto es útil si tiene un encabezado de altura fija, pero el ancho de la barra lateral, por ejemplo, no se conoce.Aquí está en un jsfiddle usando scss , lo que hace que sea más obvio de dónde provienen los valores.
fuente
Basado en la respuesta de Daniel , escribí este mixin SASS con interpolación (
#{}
) para el iframe de un video de YouTube que está dentro de un diálogo modal de Bootstrap:Uso:
HTML:
Esto siempre mostrará el video sin esas partes negras que youtube agrega al iframe cuando el ancho o alto no es proporcional al video. Notas:
$sides-adjustment
es un ligero ajuste para compensar una pequeña parte de estas partes negras que aparecen a los lados;.modal-footer
;.modal-dialog
;.modal-header
.Después de muchas pruebas, esto me está funcionando perfectamente ahora.
fuente
aquí una solución basada en la solución @Danield, que funciona incluso dentro de un div.
En ese ejemplo, estoy usando Angular pero puede pasar rápidamente a Vanilla JS u otro marco.
La idea principal es simplemente mover la solución @Danield dentro de un iframe vacío y copiar las dimensiones después de que cambie el tamaño de la ventana del iframe.
Ese iframe tiene que ajustarse a las dimensiones de su elemento padre.
https://stackblitz.com/edit/angular-aspect-ratio-by-iframe?file=src%2Findex.html
Aquí algunas capturas de pantalla:
fuente