Fai in modo che il poster video HTML5 abbia le stesse dimensioni del video stesso


93

Qualcuno sa come ridimensionare il poster video HTML5 in modo che si adatti alle dimensioni esatte del video stesso?

ecco un jsfiddle che mostra il problema: http://jsfiddle.net/zPacg/7/

ecco quel codice:

HTML:

<video controls width="100%" height="100%"  poster="http://www.wpclipart.com/blanks/buttons/glossy_buttons/glossy_button_blank_orange_rectangle.png">
  <source src="http://demo.inwebson.com/html5-video/iceage4.mp4" type="video/mp4" />
  <source src="http://demo.inwebson.com/html5-video/iceage4.ogg" type="video/ogg" />
  <source src="http://demo.inwebson.com/html5-video/iceage4.webm" type="video/webm" />
</video>

CSS:

video{
border:1px solid red;
}​

Notare che il rettangolo arancione non viene ridimensionato rispetto al bordo rosso del video.

Inoltre, la semplice aggiunta del CSS di seguito non funziona poiché ridimensiona il video insieme al poster:

video[poster]{
height:100%;
width:100%;
}

1
non penso che tu possa usare "%" negli attributi; tuttavia cambiarlo a 100 non risolve il problema. Scommetto che è uno stile multimediale -webkit. sentiti libero di sceglierli trac.webkit.org/browser/trunk/Source/WebCore/css/…
albert

@albert, grazie non vedo riferimenti posternel link che hai inviato. Puoi mostrarmi come appare il CSS per quello di cui parli, cioè " -webkit media style"? grazie
tim peterson

beh, questo è ciò che intendevo per "raccolta"; quelli sono stili di media specifici per Chrome; li conosco solo vagamente, figuriamoci gli pseudo selettori che stanno dichiarando; senza punto di partenza: andrei alla ricerca di dichiarazioni con imbottitura, ecc.
albert

Risposte:


49

È possibile utilizzare un'immagine poster trasparente in combinazione con un'immagine di sfondo CSS per ottenere ciò ( esempio ); tuttavia, per avere uno sfondo esteso all'altezza e alla larghezza di un video, dovrai utilizzare un <img>tag posizionato in modo assoluto ( esempio ).

È anche possibile impostare background-sizesu100% 100% nei browser che supportanobackground-size ( esempio ).


Aggiornare

Un modo migliore per farlo sarebbe usare la object-fitproprietà CSS come suggerisce @Lars Ericsson.

Uso

object-fit: cover;

se non desideri visualizzare quelle parti dell'immagine che non si adattano alle proporzioni del video e

object-fit: fill;

per allungare l'immagine per adattarla alle proporzioni del video

Esempio


- @ user1419007, il tuo esempio ripete l'immagine di sfondo. Dal momento che suggerisci che questo non è il modo migliore, ti dispiacerebbe fornire un jsfiddle che dimostri come implementare la tua seconda strategia?
tim peterson

Ho modificato no-repeatl'immagine di sfondo. Per quanto riguarda l'altra soluzione, dammi un momento per risolverla.
user2428118

Modifica: aggiunto esempio per la seconda soluzione proposta.
user2428118

grazie per questo, abbiamo bisogno di un po 'di javascript per cambiare z-indexl'immagine in modo che il video sia visibile quando inizi a riprodurlo.
tim peterson

2
.. il secondo esempio non ha funzionato in chrome? devi dare al div esterno una posizione come jsfiddle.net/xh8er ; allora funziona.
commonpike

87

A seconda dei browser a cui ti rivolgi, potresti utilizzare la proprietà object-fit per risolvere questo problema:

object-fit: cover;

o forse fillè quello che stai cercando. Ancora in esame per IE .


3
Questa è sicuramente la risposta.
cilphex

1
+1 per il collegamento alla proprietà di adattamento all'oggetto , l'utilizzo l'ha object-fit: initialfatto per me.
FireBrand

"object-fit: fill" ha fatto il trucco! come ha fatto "object-fit: initial" (stranamente, perché non vedo un valore "iniziale" nelle specifiche su developer.mozilla.org/en-US/docs/Web/CSS/object-fit ). Sia "cover" che "contengono" hanno distorto il poster in riproduzione nel browser nativo Samsung sotto Android 5.1.1. E non influisce su IE!
plugincontainer

1
Quale selettore CSS avete scelto come target per la regola di adattamento agli oggetti? Dal momento che non è possibile indirizzare l'immagine del poster, presumo che tu abbia utilizzato video{object-fit: cover;}?
zıəs uɐɟəʇs

@ zıəs uɐɟəʇs Nel mio css c'è ... video [poster] {object-fit: fill}
plugincontainer

27

Oppure puoi usare semplicemente l' preload="none"attributo per rendere visibile lo sfondo del VIDEO. E puoi usare background-size: cover;qui.

 video {
   background: transparent url('video-image.jpg') 50% 50% / cover no-repeat ;
 }

 <video preload="none" controls>
   <source src="movie.mp4" type="video/mp4">
   <source src="movie.ogg" type="video/ogg">
 </video>

2
risposta migliore. non rompe nulla e il mancato caricamento di un video non danneggia davvero la tua pagina a meno che non si tratti di un sito incentrato sui video. +1.
totalNotLizards

1
Ho avuto il ridimensionamento dello sfondo in riproduzione sui cellulari. Da altre domande / risposte qui (ad esempio stackoverflow.com/questions/18229974/… ) sembra che il problema sia la duplicazione delle immagini (lo sfondo css del lettore e il poster dell'elemento video). Questa correzione ha funzionato.
plugincontainer

1
Hmm ... ha funzionato in Chrome ma ha creato un nuovo problema nel browser Android nativo. Vedi: stackoverflow.com/questions/39546792/...
plugincontainer

Risolto finalmente - vedi la risposta di Lars Ericsson di seguito
plugincontainer

27

Stavo giocando con questo e ho provato tutte le soluzioni, alla fine la soluzione che ho scelto è stato un suggerimento dell'ispettore di Google Chrome. Se aggiungi questo al tuo CSS ha funzionato per me:

video{
   object-fit: inherit;
}

Grazie! Questa era la soluzione esatta che stavo cercando per RIMUOVERE il divario video in alto e in basso
cpcdev

11

La mia soluzione combina le risposte di user2428118 e Veiko Jääger, consentendo il precaricamento ma senza richiedere un'immagine trasparente separata. Usiamo invece un'immagine trasparente 1px codificata base64.

<style type="text/css" >
    video{
        background: transparent url("poster.jpg") 50% 50% / cover no-repeat ;
    }
</style>
<video controls poster="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" >
    <source src="movie.mp4" type="video/mp4">
    <source src="movie.ogg" type="video/ogg">
</video>

Deve essere solo il nome dell'immagine o il percorso completo?

Nel browser nativo di Android (il browser si chiama "Internet") sul mio Samsung il poster ridimensionato ... catastroficamente in riproduzione. Questa soluzione - una gif trasparente come poster e il "poster" come sfondo - ha risolto che, MA, .. ora il poster non viene visualizzato in IE-9, 10 o 11.
plugincontainer

1
La soluzione era abbandonare la gif trasparente e il poster come sfondo e utilizzare (vedi la risposta di Lars Ericsson sopra) il video [poster] {object-fit: fill}. Risolto problema sul browser nativo Samsung sotto Android 5.1.1. e IE mostra il poster senza problemi
plugincontainer

Questo approccio è migliore soprattutto per i dispositivi mobili. object-fitnon impedisce le distorsioni di dimensioni selvagge posterche si verificano su Android durante il caricamento del contenuto.
TheLinguist

5

Mi è venuta questa idea e funziona perfettamente. Ok, quindi in pratica vogliamo eliminare il primo fotogramma del video dal display e quindi ridimensionare il poster alle dimensioni effettive del video. Se poi impostiamo le dimensioni, abbiamo completato una di queste attività. Allora ne rimane solo uno. Quindi ora, l'unico modo che conosco per sbarazzarmi del primo fotogramma è definire effettivamente un poster. Comunque daremo al video uno falso, che non esiste. Ciò risulterà in una visualizzazione vuota con lo sfondo trasparente. Cioè lo sfondo del nostro div genitore sarà visibile.

Semplice da usare, tuttavia potrebbe non funzionare con tutti i browser web se vuoi ridimensionare la dimensione dello sfondo del div alla dimensione del video poiché il mio codice utilizza "background-size".

HTML / HTML5:

<div class="video_poster">
    <video poster="dasdsadsakaslmklda.jpg" controls>
        <source src="videos/myvideo.mp4" type="video/mp4">
        Your browser does not support the video tag.
    </video>
<div>

CSS:

video{
    width:694px;
    height:390px;
}
.video_poster{
    width:694px;
    height:390px;
    background-size:694px 390px;
    background-image:url(images/myvideo_poster.jpg);
}

è intelligente, ci ho provato. Non è perfetto ma arrivarci ... jsfiddle.net/trpeters1/NJtc9
tim peterson

Si hai ragione. Guardando il tuo jsfiddle ora mi rendo conto che anche la dimensione del video deve essere corretta e non solo l'elemento video. Immagino di essere stato solo fortunato quando l'ho provato sulla mia pagina.
Jonathan J

5
<video src="videofile.webm" poster="posterimage.jpg" controls preload="metadata">
    Sorry, your browser doesn't support embedded videos.
</video>

Copertina

video{
   object-fit: cover; /*to cover all the box*/
}

Riempire

video{
   object-fit: fill; /*to add black content at top and bottom*/
   object-position: 0 -14px; /* to center our image*/
}

Nota che i controlli video si trovano sulla nostra immagine , quindi la nostra immagine non viene mostrata completamente. Se stai usando una copertina adatta agli oggetti, modifica la tua immagine su un'app visiva come Photoshop e aggiungi un contenuto in basso a margine.


1

Ho avuto un problema simile e l'ho risolto creando un'immagine con le stesse proporzioni del mio video (16: 9). La mia larghezza è impostata al 100% sul tag video e ora l'immagine (320 x 180) si adatta perfettamente. Spero che aiuti!


1

È possibile ridimensionare le dimensioni dell'immagine dopo aver generato il pollice

exec("ffmpeg -i $video_image_dir/out.png -vf scale=320:240 {$video_image_dir}/resize.png",$out2, $return2);

1

Puoi utilizzare il poster per mostrare l'immagine invece del video sul dispositivo mobile (o sui dispositivi che non supportano la funzionalità di riproduzione automatica del video). Perché i dispositivi mobili non supportano la funzionalità di riproduzione automatica dei video.

<div id="wrap_video">
<video preload="preload" id="Video" autoplay="autoplay" loop="loop" poster="default.jpg">
<source src="Videos.mp4" type="video/mp4">
Your browser does not support the <code>video</code> tag.
</video>
</div>

Ora puoi semplicemente definire lo stile dell'attributo poster che si trova all'interno del tag video per il dispositivo mobile tramite media-query.

#wrap_video
{
width:480px;
height:360px;
position: relative;
} 
@media (min-width:360px) and (max-width:780px)
{
video[poster]
{
top:0 !important;
left:0 !important;
width:480px !important;
height:360px !important;
position: absolute !important;
}
}

In realtà, iOS 10+ supporta la funzionalità di riproduzione automatica del video con l'attributo playsinline.
Lukas Petr

Come si specifica quell'attributo?
Khom Nazid,

0
height:500px;
min-width:100%;
-webkit-background-size: 100% 100%;
-moz-background-size: 100% 100%;
-o-background-size: 100% 100%;
background-size:100% 100%;
object-fit:cover;

-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size:cover;

0

Questo ha funzionato

<video class="video-box" poster="/" controls>
    <source src="some source" type="video/mp4">
</video>

E il CSS

.video-box{
 background-image: 'some image';
 background-size: cover;
}

0
  <div class="container">
        <video poster="~/Content/WebSite/img/SiteSetting/Load.gif" autoplay muted loop class="myVideo">
            <source src="~/Content/WebSite/images/VideoTube.mp4" type="video/mp4" />
        </video>

    </div>



 <style>
    .myVideo {
position: absolute;
right: 0;
left: 0;
bottom: 0;
min-width: 100%;
min-height: 100%;
object-fit: inherit;
 }
@media only screen and (max-width:768px) {
.myVideo {
    position: absolute;
    right: 0;
    left: 0;
    bottom: 0;
    max-width: -webkit-fill-available;
    min-height: 100%;
    object-fit: cover;
    }
   }

     @media only screen and (max-width:320px) {
.myVideo {
    position: absolute;
    right: 0;
    left: 0;
    bottom: 0;
    max-width: -webkit-fill-available;
    min-height: 100%;
    object-fit: cover;
  }
}
</style>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.