¿Cómo puedo simular la funcionalidad de background-size:cover
un elemento html como <video>
o <img>
?
Me gustaría que funcionara como
background-size: cover;
background-position: center center;
javascript
jquery
css
seron
fuente
fuente
cover
. Ver Tamaño de fondo 101 en el enlace .Respuestas:
Esto es algo por lo que me saqué el pelo por un tiempo, pero encontré una gran solución que no usa ningún script y puede lograr una simulación de portada perfecta en video con 5 líneas de CSS (9 si cuenta selectores y paréntesis) ) Esto tiene 0 casos extremos en los que no funciona perfectamente, salvo la compatibilidad con CSS3 .
Puedes ver un ejemplo aquí
El problema con la solución de Timothy es que no maneja la escala correctamente. Si el elemento circundante es más pequeño que el archivo de video, no se reduce. Incluso si le da a la etiqueta de video un tamaño inicial pequeño, como 16px por 9px,
auto
termina forzándolo a un mínimo de su tamaño de archivo nativo. Con la solución actual más votada en esta página, fue imposible para mí reducir la escala del archivo de video, lo que resultó en un efecto de zoom drástico.Sin embargo, si se conoce la relación de aspecto de su video, como 16: 9, puede hacer lo siguiente:
Si el elemento principal del video está configurado para cubrir toda la página (como
position: fixed; width: 100%; height: 100vh;
), entonces el video también lo hará.Si desea que el video también se centre, puede usar el enfoque de centrado seguro:
Por supuesto,
vw
,vh
, ytransform
son CSS3, así que si necesita compatibilidad con navegadores mucho más antiguas , que necesita para el uso de la escritura.fuente
vh
yvw
qué hacer con algo?jsFiddle
El uso de la cubierta de fondo está bien para las imágenes, y también el ancho al 100%. Estos no son óptimos
<video>
y estas respuestas son demasiado complicadas. No necesita jQuery o JavaScript para lograr un fondo de video de ancho completo.Tenga en cuenta que mi código no cubrirá un fondo completamente con un video como lo hará la cubierta, sino que hará que el video sea tan grande como sea necesario para mantener la relación de aspecto y aún cubrir todo el fondo. Cualquier exceso de video se desangrará del borde de la página, cuyos lados dependen de dónde se ancla el video.
La respuesta es bastante simple.
Simplemente use este código de video HTML5, o algo por el estilo: (prueba en página completa)
La altura mínima y la anchura mínima permitirán que el video mantenga la relación de aspecto del video, que generalmente es la relación de aspecto de cualquier navegador normal con una resolución normal. Cualquier exceso de video sale por el costado de la página.
fuente
min-width
omin-height
hace el truco.position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);
.Para algunos navegadores puedes usar
http://caniuse.com/object-fit
fuente
height: 100%; width: 100%;
. gracias por esta respuesta modernaAsí es como hice esto. Un ejemplo de trabajo está en este jsFiddle .
fuente
video { min-width: 100%; min-height: 100%; }
y funciona de maravilla.background-size: cover
para un video.Las otras respuestas fueron buenas, pero incluyen JavaScript o no centran el video horizontal y verticalmente.
Puede usar esta solución CSS completa para tener un video que simule el tamaño de fondo: propiedad de portada:
fuente
Basado en la respuesta y los comentarios de Daniel de Wit , busqué un poco más. Gracias a él por la solución.
La solución es usar
object-fit: cover;
un soporte excelente (todos los navegadores modernos lo admiten). Si realmente desea admitir IE, puede usar un polyfill como object-fit-images o object-fit .Demos:
y con un padre:
fuente
object-fit: cover
ywidth
yheight
configurado al 100%, obtienes una escala proporcionalimg
ovideo
ampliada en el centro sin ningún problema.La solución de M-Pixel es excelente ya que resuelve el problema de escala de la respuesta de Timothy (el video se ampliará pero no se reducirá, por lo que si su video es realmente grande, hay buenas posibilidades de que solo vea un pequeño zoom en una parte). Sin embargo, esa solución se basa en suposiciones falsas relacionadas con el tamaño del contenedor de video, es decir, que es necesariamente el 100% del ancho y alto de la ventana gráfica. He encontrado algunos casos en los que no funcionó para mí, así que decidí abordar el problema yo mismo y creo que se me ocurrió la solución definitiva .
HTML
CSS
También se basa en la proporción del video, por lo que si su video tiene una proporción diferente a 16/9, querrá cambiar el% del relleno inferior. Aparte de eso, funciona fuera de la caja. Probado en IE9 +, Safari 9.0.1, Chrome 46 y Firefox 41.
EDITAR (17 de marzo de 2016)
Desde que he publicado esta respuesta que he escrito un pequeño módulo de CSS para simular tanto
background-size: cover
ybackground-size: contain
en<video>
elementos: http://codepen.io/benface/pen/NNdBMjAdmite diferentes alineaciones para el video (similar a
background-position
). También tenga en cuenta que lacontain
implementación no es perfecta. A diferenciabackground-size: contain
, no escalará el video más allá de su tamaño real si el ancho y la altura del contenedor son mayores, pero creo que aún puede ser útil en algunos casos. También he añadido especialfill-width
yfill-height
clases que se pueden utilizar junto concontain
obtener una mezcla especial decontain
ecover
... probarlo, y sentir la libertad de mejorarla!fuente
object-fit: cover
para FF y Chrome y su solución con Modernizr para IEobject-fit: cover
es la mejor respuesta con este IE, Safari polyfill.https://github.com/constancecchen/object-fit-polyfill
Es de apoyo
img
,video
ypicture
elementos.fuente
CSS y little js pueden hacer que el video cubra el fondo y se centre horizontalmente.
CSS:
JS: (une esto con el cambio de tamaño de la ventana y llama una vez por separado)
fuente
Justo después de nuestra larga sección de comentarios, creo que esto es lo que estás buscando, está basado en jQuery:
HTML:
JS:
CSS:
El código anterior está usando el ancho y la altura de los navegadores si hicieras esto dentro de un div, deberías cambiarlo a algo como esto:
Para Div:
HTML:
JS:
CSS:
También debo decir que solo he probado que esto es Google Chrome ... aquí hay un jsfiddle: http://jsfiddle.net/ADCKk/
fuente
La respuesta principal no reduce el video cuando se encuentra en anchos de navegador inferiores al ancho de su video. Intenta usar este CSS (con #bgvid como la identificación de tu video):
fuente
z-index
necesario lo negativo ?También voy a publicar esta solución, ya que tuve este problema pero las otras soluciones no funcionaron para mi situación ...
Creo que para simular correctamente la
background-size:cover;
propiedad css en un elemento en lugar de una propiedad de imagen de fondo de los elementos, tendría que comparar la relación de aspecto de las imágenes con la relación de aspecto de Windows actual, así que no importa qué tamaño (y también en caso de que la imagen sea más alto que más ancho) la ventana es el elemento que llena la ventana (y también la centra, aunque no sé si eso era un requisito) ...usando una imagen, solo por simplicidad, estoy seguro de que un elemento de video también funcionará bien.
primero obtenga la relación de aspecto de los elementos (una vez cargada), luego adjunte el controlador de cambio de tamaño de la ventana, actívelo una vez para el tamaño inicial:
luego, en su controlador de cambio de tamaño, primero debe determinar si se debe llenar el ancho o la altura del relleno comparando la relación de aspecto actual de la ventana con la relación de aspecto original de la imagen.
}
.gif
es mucho más grande, pero también más borroso. Mi opinión ha cambiado desde que escribí esta respuesta. Es una pena que no puedas combinar lo mejor de ambos.Este enfoque solo usa css y html. En realidad, puedes apilar un div debajo del video fácilmente. Está cubierto pero no centrado mientras cambia el tamaño.
HTML:
CCS:
fuente
@Hidden Hobbes
Abriste una recompensa por esta pregunta para una solución única de CSS, así que lo intentaré. Mi solución a un problema como este es usar una relación fija para decidir la altura y el ancho del video. Usualmente uso Bootstrap, pero extraje el CSS necesario de allí para que funcione sin él. Este es un código que he usado anteriormente para centrar, entre otras cosas, un video incrustado con la proporción correcta. Se debe trabajar para
<video>
y<img>
elementos también Es la parte superior que es relevante aquí, pero les dio a los otros dos, así como ya tenía ellos por ahí. ¡La mejor de las suertes! :)Ejemplo de pantalla completa de jsfiddle
fuente
Para responder al comentario de Weotch de que la respuesta de Timothy Ryan Carpenter no tiene en cuenta
cover
el centrado del fondo, ofrezco esta solución rápida de CSS:CSS:
Agregar estas dos líneas centrará cualquier elemento. Aún mejor, todos los navegadores que pueden manejar video HTML5 también admiten transformaciones CSS3, por lo que esto siempre funcionará.
El CSS completo se ve así.
Hubiera comentado directamente sobre la respuesta de Timothy, pero no tengo suficiente reputación para hacerlo.
fuente
Chicos, tengo una solución mejor, es corta y funciona perfectamente para mí. Lo usé para video. Y emula perfectamente la opción de portada en css.
Javascript
Si voltea el if, de lo contrario obtendrá contener.
Y aquí está el CSS. (No necesita usarlo si no desea posicionamiento central, el div padre debe ser " position: relative ")
CSS
fuente
Acabo de resolver esto y quería compartir. Esto funciona con Bootstrap 4. Funciona con
img
pero no lo probévideo
. Aquí está el HAML y SCSSHAML
SCSS
fuente
Antigua pregunta, pero en caso de que alguien vea esto, la mejor respuesta en mi opinión es convertir el video en un GIF animado. Esto te da mucho más control y puedes tratarlo como una imagen. También es la única forma de que funcione en dispositivos móviles, ya que no puede reproducir videos automáticamente. Sé que la pregunta es hacerlo en una
<img>
etiqueta, pero realmente no veo la desventaja de usar ay<div>
hacerbackground-size: cover
fuente
.gif
es mucho más grande, pero también más borroso. Mi opinión ha cambiado desde que escribí esta respuesta. Es una pena que no puedas combinar lo mejor de ambos.