W erze dynamicznych stron internetowych tag <video> w HTML5 stał się kluczowym elementem do osadzania treści wideo bezpośrednio w kodzie, bez zależności od zewnętrznych wtyczek, takich jak Flash. Pozwala na natywne odtwarzanie filmów w przeglądarkach z pełną kontrolą nad formatami, stylami i zachowaniem.
Ten praktyczny poradnik dla programistów HTML/CSS/JavaScript omawia strukturę tagu, kluczowe atrybuty, obsługę wielu formatów, responsywne stylowanie, integrację z JavaScript oraz zaawansowane techniki, takie jak zapętlanie fragmentów czy wideo w tle. Wszystkie przykłady możesz skopiować i od razu przetestować.
Podstawowa składnia tagu <video>
Element <video> osadza odtwarzacz wideo z opcjonalnym interfejsem sterującym. Źródło pliku wskaż atrybutem src lub – zalecane – elementami potomnymi <source>. Zawsze dodaj treść zastępczą dla starszych przeglądarek.
Prosty przykład z pojedynczym plikiem
Bez <source> możesz osadzić jeden plik; określ typ MIME (type), by przeglądarka szybciej sprawdziła kompatybilność:
<video src="film.mp4" type="video/mp4" width="640" height="360">
Twoja przeglądarka nie obsługuje tagu <video>.
</video>
To wyświetli odtwarzacz tylko wtedy, gdy przeglądarka obsłuży format. W przeciwnym razie pokaże tekst błędu.
Lepszy przykład: wielokrotne źródła z <source>
Aby zapewnić zgodność między przeglądarkami, podaj kilka formatów (np. MP4 dla większości, WebM dla Chrome/Firefox). Przeglądarka wybierze pierwszy obsługiwany:
<video controls width="640" height="360">
<source src="film.webm" type="video/webm">
<source src="film.mp4" type="video/mp4">
Twoja przeglądarka nie obsługuje żadnego z podanych formatów wideo.
</video>
Najważniejsze zalety podejścia ze zdefiniowanymi źródłami to:
- automatyczne przełączanie formatów,
- szybsze sprawdzanie kompatybilności dzięki atrybutowi
type, - czytelny fallback w postaci treści zastępczej.
Najważniejsze atrybuty tagu <video>
Tag <video> obsługuje bogaty zestaw atrybutów – wiele z nich to atrybuty logiczne (np. autoplay). Poniżej znajdziesz najczęściej używane:
| Atrybut | Opis | Przykład użycia |
|---|---|---|
| controls | Wyświetla panel sterowania (play, pause, głośność, pasek postępu). | <video controls> |
| autoplay | Automatyczne odtwarzanie po załadowaniu (ograniczone; zwykle wymaga muted). |
<video autoplay muted> |
| loop | Zapętlanie wideo (odtwarza od początku po zakończeniu). | <video loop> |
| muted | Wyciszenie audio (wymagane dla autoplay w większości przeglądarek). | <video muted> |
| preload | Strategia ładowania: none (nic), metadata (tylko metadane), auto (cały plik). |
<video preload="metadata"> |
| poster | Obrazek wyświetlany przed odtwarzaniem (miniatura/placeholder). | <video poster="plakat.jpg"> |
| width/height | Wymiary w pikselach; dla responsywności lepiej użyć CSS. | <video style="width: 100%"> |
Przykład z atrybutami w akcji – autoplay + loop + muted sprawdzi się jako tło:
<video autoplay loop muted playsinline poster="preview.jpg">
<source src="tlo.webm" type="video/webm">
<source src="tlo.mp4" type="video/mp4">
</video>
Uwaga: playsinline zapobiega automatycznemu pełnoekranowi na iOS.
Responsywne wideo z CSS
Domyślnie <video> nie skaluje się responsywnie. Użyj kontenera z techniką intrinsic ratio (16:9 = 56.25%) i wypełnij go wideo:
.video-container {
position: relative;
width: 100%;
padding-bottom: 56.25%; /* 16:9 */
height: 0;
overflow: hidden;
}
.video-container video {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover; /* dopasowanie bez zniekształceń */
}
Użycie w HTML:
<div class="video-container">
<video controls autoplay muted loop>
<source src="film.mp4" type="video/mp4">
</video>
</div>
To rozwiązanie działa zarówno na urządzeniach mobilnych, jak i na komputerach stacjonarnych.
Wideo jako tło całej strony
Jeśli chcesz uzyskać pełnoekranowe tło:
video {
position: fixed;
top: 0;
left: 0;
min-width: 100%;
min-height: 100%;
object-fit: cover;
z-index: -1;
}
Dodaj delikatną nakładkę (np. przez ::after i półprzezroczysty background), aby poprawić czytelność tekstu na wideo.
Zaawansowane triki – fragmenty wideo i precyzyjne sterowanie
Aby odtwarzać tylko fragment zasobu, użyj Media Fragments: #t=[start][,end] w adresie źródła (sekundy lub HH:MM:SS):
<source src="film.webm#t=5,10" type="video/webm"> <!-- 5–10 sekund -->
<source src="film.mp4#t=00:01:05,00:02:00" type="video/mp4"> <!-- 1:05–2:00 -->
To świetne rozwiązanie do highlightów, teaserów lub podglądów lekcji.
Integracja z JavaScript
Steruj wideo w pełni programowo – od podglądu, po analitykę i interakcje:
<video id="mojeVideo" controls>
<source src="film.mp4" type="video/mp4">
</video>
<script>
const video = document.getElementById('mojeVideo');
video.addEventListener('loadedmetadata', () => {
video.currentTime = 10; // przeskocz do 10 s
video.play(); // odtwórz
});
video.addEventListener('ended', () => {
video.play(); // zapętl po zakończeniu
});
</script>
Pamiętaj: autoplay z dźwiękiem bywa blokowany – połącz autoplay z muted i/lub inicjuj odtwarzanie po interakcji użytkownika.
Obsługa formatów plików i kodeków
Najpopularniejsze formaty stosowane w sieci to:
- WebM (VP9) – bardzo dobry do internetu (Chrome, Firefox), zazwyczaj mniejszy rozmiar plików;
- MP4 (H.264) – najbardziej uniwersalny (obsługiwany przez wszystkie główne przeglądarki);
- Ogg (Theora) – opcja preferowana w środowiskach open source.
Zawsze sprawdzaj aktualną kompatybilność na caniuse.com. Przykładowe polecenie konwersji w FFmpeg:
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
Porównanie: <video> vs iframe (YouTube/Vimeo)
Poniżej znajdziesz szybkie porównanie obu metod osadzania:
| Metoda | Zalety | Wady |
|---|---|---|
<video> |
Pełna kontrola, brak zależności zewnętrznych, działa offline. | Wymaga własnego hostingu i transferu (bandwidth). |
| iframe | Ekspresowe wdrożenie, statystyki YouTube, adaptacyjna jakość w HD. | Wolniejsze ładowanie, ograniczone stylowanie, dodatkowe ciasteczka. |
Przykład osadzenia klipu z YouTube:
<div class="video-container">
<iframe src="https://www.youtube.com/embed/VIDEO_ID" frameborder="0" allowfullscreen></iframe>
</div>
Używaj <video> dla własnych treści i pełnej kontroli, a <iframe> dla materiałów hostowanych na platformach zewnętrznych.
Najczęstsze błędy i dobre praktyki
Poniżej lista problemów, na które warto zwrócić uwagę, oraz sprawdzone rozwiązania:
- brak atrybutu
typew<source>– powoduje zbędne pobieranie i wolniejszą detekcję wsparcia; - zbyt ciężkie pliki – kompresuj wideo (CRF w H.264/H.265), celuj w rozsądny bitrate i rozdzielczość;
- nieprzemyślany
preload– używajmetadatalubnonedla lepszej wydajności i oszczędzania transferu; - brak testów autoplay – sprawdzaj zachowanie na iOS/Safari/Chrome; łącz
autoplayzmutediplaysinline; - pomijanie dostępności – dodaj sensowny
aria-label, napisy (<track kind="subtitles">) i kontrastowe plakaty; - brak treści zastępczej/postera – umieszczaj czytelny komunikat fallback i
posterdla lepszego UX.