Jak mogę zasymulować funkcjonalność background-size:cover
elementu HTML, takiego jak <video>
lub <img>
?
Chciałbym, żeby to działało
background-size: cover;
background-position: center center;
javascript
jquery
css
seron
źródło
źródło
cover
. Zobacz Rozmiar tła 101 pod linkiem .Odpowiedzi:
To jest coś, z czego przez chwilę wyrwałem włosy, ale natknąłem się na świetne rozwiązanie, które nie używa żadnego skryptu i może osiągnąć idealną symulację okładki na wideo z 5 liniami CSS (9, jeśli policzyć selektory i nawiasy ). Ma 0 skrajnych przypadków, w których nie działa idealnie, poza kompatybilnością z CSS3 .
Możesz zobaczyć przykład tutaj
Problem z rozwiązaniem Timothy'ego polega na tym, że nie obsługuje ono poprawnie skalowania. Jeśli otaczający element jest mniejszy niż plik wideo, nie jest zmniejszany. Nawet jeśli nadasz tagowi wideo niewielki rozmiar początkowy, na przykład 16 na 9 pikseli, w
auto
końcu zmusisz go do minimalnego rozmiaru pliku natywnego. Przy obecnym rozwiązaniu z największą liczbą głosów na tej stronie niemożliwe było zmniejszenie skali pliku wideo, co spowodowało drastyczny efekt powiększenia.Jeśli jednak znany jest współczynnik proporcji Twojego filmu, na przykład 16: 9, możesz wykonać następujące czynności:
Jeśli element nadrzędny wideo jest ustawiony tak, aby obejmował całą stronę (na przykład
position: fixed; width: 100%; height: 100vh;
), wideo również będzie.Jeśli chcesz, aby film również był wyśrodkowany, możesz zastosować metodę pewnego centrowania:
Oczywiście
vw
,vh
itransform
są CSS3, więc jeśli potrzebujesz kompatybilności z dużo starszymi przeglądarkami , będziesz musiał użyć skryptu.źródło
vh
ivw
mają do rzeczy?jsFiddle
Używanie okładki tła jest dobre w przypadku obrazów, podobnie jak szerokość 100%. Nie są one optymalne dla
<video>
, a te odpowiedzi są zbyt skomplikowane. Nie potrzebujesz jQuery ani JavaScript, aby uzyskać tło wideo o pełnej szerokości.Pamiętaj, że mój kod nie pokryje całkowicie tła filmem, takim jak okładka, ale zamiast tego sprawi, że wideo będzie tak duże, jak to konieczne, aby zachować proporcje i nadal pokrywać całe tło. Nadmiar wideo będzie spadał poza krawędź strony, które strony zależą od miejsca zakotwiczenia wideo.
Odpowiedź jest dość prosta.
Po prostu użyj tego kodu wideo HTML5 lub czegoś podobnego: (przetestuj na całej stronie)
Minimalna wysokość i minimalna szerokość pozwolą wideo zachować proporcje wideo, które zwykle są proporcjami każdej normalnej przeglądarki przy normalnej rozdzielczości. Nadmiar wideo znika z boku strony.
źródło
min-width
lubmin-height
załatwia sprawę.position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);
.W przypadku niektórych przeglądarek możesz użyć
http://caniuse.com/object-fit
źródło
height: 100%; width: 100%;
. dzięki za tę nowoczesną odpowiedźOto jak to zrobiłem. Działający przykład znajduje się w tym jsFiddle .
źródło
video { min-width: 100%; min-height: 100%; }
i działa jak urok.background-size: cover
wideo.Pozostałe odpowiedzi były dobre, ale obejmują javascript lub nie wyśrodkowują wideo w poziomie ORAZ w pionie.
Możesz użyć tego pełnego rozwiązania CSS, aby uzyskać wideo, które symuluje właściwość background-size: cover:
źródło
Na podstawie odpowiedzi i komentarzy Daniela de Wita szukałem nieco więcej. Dzięki za rozwiązanie.
Rozwiązaniem jest użycie,
object-fit: cover;
które ma świetne wsparcie ( obsługuje to każda nowoczesna przeglądarka). Jeśli naprawdę chcesz obsługiwać IE, możesz użyć wypełnienia typu polifill, takiego jak object-fit-images lub object-fit .Dema:
iz rodzicem:
źródło
object-fit: cover
iwidth
iheight
ustawionych na 100%, bez problemu uzyskasz proporcjonalnie skalowaneimg
lubvideo
powiększane na środku.Rozwiązanie M-Pixel jest świetne, ponieważ rozwiązuje problem skalowania odpowiedzi Timothy'ego (wideo będzie skalowane w górę, ale nie w dół, więc jeśli Twój film jest naprawdę duży, są duże szanse, że zobaczysz tylko niewielką część powiększoną). Jednak rozwiązanie to opiera się na fałszywych założeniach dotyczących rozmiaru kontenera wideo, a mianowicie, że musi to być 100% szerokości i wysokości widocznego obszaru. Znalazłem kilka przypadków, w których to nie zadziałało, więc postanowiłem sam rozwiązać problem i uważam, że znalazłem ostateczne rozwiązanie .
HTML
CSS
Jest również oparty na współczynniku wideo, więc jeśli Twój film ma współczynnik inny niż 16/9, będziesz chciał zmienić dolny procent wypełnienia. Poza tym działa po wyjęciu z pudełka. Przetestowano w IE9 +, Safari 9.0.1, Chrome 46 i Firefox 41.
EDYCJA (17 marca 2016 r.)
Od czasu, kiedy pisał tę odpowiedź Pisałem mały moduł do symulacji zarówno CSS
background-size: cover
ibackground-size: contain
na<video>
elementach: http://codepen.io/benface/pen/NNdBMjObsługuje różne wyrównania wideo (podobnie jak
background-position
). Należy również pamiętać, żecontain
implementacja nie jest doskonała. W przeciwieństwie dobackground-size: contain
tego, nie przeskaluje wideo powyżej jego rzeczywistego rozmiaru, jeśli szerokość i wysokość kontenera są większe, ale myślę, że w niektórych przypadkach może być przydatne. Dodałem również specjalnefill-width
ifill-height
klasy, z których możesz korzystać razem,contain
aby uzyskać specjalną mieszankęcontain
icover
... wypróbuj ją i nie krępuj się ją ulepszyć!źródło
object-fit: cover
do FF i chrome oraz twojego rozwiązania z Modernizr dla IEobject-fit: cover
to najlepsza odpowiedź z tym wypełnieniem IE, Safari.https://github.com/constancecchen/object-fit-polyfill
Jest to wsparcie
img
,video
apicture
elementy.źródło
CSS i little js mogą sprawić, że wideo zakryje tło i zostanie wyśrodkowane w poziomie.
CSS:
JS: (powiąż to ze zmianą rozmiaru okna i wywołaj raz osobno)
źródło
Zaraz po naszej długiej sekcji komentarzy myślę, że właśnie tego szukasz, jest oparty na jQuery:
HTML:
JS:
CSS:
Powyższy kod korzysta z szerokości i wysokości przeglądarki, jeśli robisz to w ramach elementu div, musisz zmienić to na coś takiego:
Dla Div:
HTML:
JS:
CSS:
Powinienem również stwierdzić, że przetestowałem tylko, że to Google Chrome ... tutaj jest jsfiddle: http://jsfiddle.net/ADCKk/
źródło
Najlepsza odpowiedź nie zmniejsza rozmiaru wideo, gdy szerokość przeglądarki jest mniejsza niż szerokość filmu. Spróbuj użyć tego kodu CSS (z #bgvid to identyfikator Twojego filmu wideo):
źródło
z-index
konieczne?Jestem gunna i publikuję to rozwiązanie, ponieważ miałem ten problem, ale inne rozwiązania nie działały w mojej sytuacji ...
Myślę, że aby poprawnie zasymulować
background-size:cover;
właściwość css na elemencie zamiast właściwości background-image elementów, musiałbyś porównać proporcje obrazu z obecnym współczynnikiem kształtu okna, więc bez względu na rozmiar (a także w przypadku, gdy obraz jest wyższy niż szerszy) okno to element, który wypełnia okno (i również go wyśrodkowuje, chociaż nie wiem, czy to był wymóg) ....używając obrazu, tylko dla uproszczenia, jestem pewien, że element wideo też będzie działał.
najpierw pobierz proporcje elementów (po załadowaniu), następnie dołącz moduł obsługi zmiany rozmiaru okna, uruchom go raz do początkowego rozmiaru:
następnie w programie obsługi zmiany rozmiaru należy najpierw określić, czy szerokość lub wysokość wypełnienia ma być wypełniona, porównując bieżące proporcje okna z oryginalnymi proporcjami obrazu.
}
.gif
jest znacznie większy, a jednocześnie bardziej rozmyty. Mój pogląd zmienił się, odkąd napisałem tę odpowiedź. Szkoda, że nie możesz połączyć tego, co najlepsze z obu.To podejście wykorzystuje tylko css i html. W rzeczywistości możesz łatwo układać elementy DIV pod wideo. Jest zakryta, ale nie jest wyśrodkowana podczas zmiany rozmiaru.
HTML:
CCS:
źródło
@Hidden Hobbes
Otworzyłeś nagrodę za to pytanie za rozwiązanie tylko dla CSS, więc spróbuję. Moim rozwiązaniem takiego problemu jest użycie stałego współczynnika do określenia wysokości i szerokości wideo. Zwykle używam Bootstrap, ale wyodrębniłem stamtąd niezbędny CSS, aby działał bez. Jest to kod, którego użyłem wcześniej, aby między innymi wyśrodkować osadzone wideo z odpowiednim współczynnikiem. Powinien działać dla elementów
<video>
i<img>
też. Najważniejszy jest tutaj istotny, ale podałem ci również pozostałe dwa, ponieważ już je miałem. Powodzenia! :)przykład pełnoekranowy jsfiddle
źródło
Aby odpowiedzieć na komentarz Weotch, że odpowiedź Timothy'ego Ryana Carpentera nie uwzględnia
cover
wyśrodkowania tła, oferuję tę szybką poprawkę CSS:CSS:
Dodanie tych dwóch linii spowoduje wyśrodkowanie dowolnego elementu. Co więcej, wszystkie przeglądarki obsługujące wideo HTML5 obsługują również transformacje CSS3, więc to zawsze będzie działać.
Kompletny CSS wygląda tak.
Skomentowałbym bezpośrednio odpowiedź Timothy'ego, ale nie mam wystarczającej reputacji, aby to zrobić.
źródło
Chłopaki mam lepsze rozwiązanie jest krótkie i na mnie działa idealnie. Użyłem go do wideo. I doskonale emuluje opcję okładki w css.
Javascript
Jeśli odwrócisz if, w przeciwnym razie otrzymasz zawartość.
A oto css. (Nie musisz go używać, jeśli nie chcesz pozycjonować na środku, nadrzędny element DIV musi mieć wartość „ position: względna ”)
CSS
źródło
Właśnie to rozwiązałem i chciałem się podzielić. Działa z Bootstrap 4. Działa z,
img
ale nie testowałem tego zvideo
. Oto HAML i SCSSHAML
SCSS
źródło
Stare pytanie, ale na wypadek, gdyby ktoś to zobaczył, najlepszą odpowiedzią moim zdaniem jest przekonwertowanie wideo na animowany GIF. Daje to znacznie większą kontrolę i możesz po prostu traktować to jak obraz. To także jedyny sposób, aby działał na telefonie komórkowym, ponieważ nie można automatycznie odtwarzać filmów. Wiem, że chodzi o zrobienie tego w
<img>
tagu, ale tak naprawdę nie widzę wad używania a<div>
i doingbackground-size: cover
źródło
.gif
jest znacznie większy, a jednocześnie bardziej rozmyty. Mój pogląd zmienił się, odkąd napisałem tę odpowiedź. Szkoda, że nie możesz połączyć tego, co najlepsze z obu.