Flat Responsive HTML5 Video Player With jQuery And CSS3
File Size: | 9.98 KB |
---|---|
Views Total: | 9691 |
Last Update: | |
Publish Date: | |
Official Website: | Go to website |
License: | MIT |

This is a pretty nice, flat style, fully responsive, mobile-friendly HTML5 video player built using jQuery, HTML5, CSS/CSS3 and a little JavaScript.
How to use it:
1. Build the html structure for the video player and embed an HTML5 video into it.
<div id="videoContainer"> <div class="overlay"> <div class="button"></div> </div> <div id="video"> <video src="sample.mp4"> </video> </div> <div id="controls"> <div class="playButton"> <div class="playPause"></div> </div> <div class="ProgressContainer"> <div class="timer intialTime"> 00:00 </div> <div class="progressBar"> <div class="progress"></div> </div> <div class="time"> 00:00 </div> <div class="timer fullTime"> 00:00 </div> </div> <div class="volume"> <div class="icon"></div> <div class="intensityBar"> <div class="intensity"></div> </div> </div> <div class="scale"> <div class="icon"></div> </div> </div> </div>
2. Place the following CSS snippets into your existing CSS file.
#videoContainer { width: 70vw; height: 65vh; background: #39a072; margin: 30px auto; border-radius: 5px; box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.2); margin-bottom: 20px; position: relative; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; user-select: none; } #videoContainer.fullScreen { width: 100vw !important; height: 100vh !important; } #videoContainer.small .intensityBar { width: 50px !important; } #videoContainer.small .playButton { margin: 0 !important; margin-right: 5px !important; } #videoContainer.small .timer { display: none !important; } #videoContainer.small .playPause, #videoContainer.small .volume .icon, #videoContainer.small .scale .icon { width: 15px !important; height: 15px !important; } #videoContainer.small .progressBar { height: 6px !important; } #videoContainer.small .overlay .button { width: 50px !important; height: 50px !important; } #videoContainer.small .time { display: none !important; } #videoContainer .overlay { width: 100%; height: 100%; background: radial-gradient(circle, rgba(77, 191, 140, 0.9), rgba(41, 115, 82, 0.9)); position: absolute; top: 0; left: 0; z-index: 999; border-radius: 5px; } #videoContainer .overlay .button { width: 80px; height: 80px; position: absolute; top: 50%; left: 50%; background: url(play-button.svg); background-size: 100% 100%; transform: translate(-50%, calc(-50% - 30px)); cursor: pointer; transition: width 0.2s, height 0.2s; } #videoContainer .overlay .button:hover { width: 90px; height: 90px; } #videoContainer #video { width: 100%; height: calc(100% - 60px); position: relative; top: 0; left: 0; overflow: hidden; border-radius: 5px; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } #videoContainer #video video { width: 100%; height: 100%; position: absolute; top: 0; left: 0; border-radius: 5px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } #videoContainer #controls { width: 100%; height: 60px; background: #4dbf8c; position: absolute; right: 0; bottom: 0; display: flex; align-items: center; justify-content: space-between; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; z-index: 9999; } #videoContainer #controls .playButton { width: 70px; height: 100%; background: #4dbf8c; display: flex; align-items: center; justify-content: center; margin-right: 20px; cursor: pointer; transition: all 0.4s; border-bottom-left-radius: 5px; } #videoContainer #controls .playButton:hover { background: #41b682; } #videoContainer #controls .playButton .playPause { width: 25px; height: 25px; background: url(play.svg); background-size: 100% 100%; } #videoContainer #controls .ProgressContainer { color: #fff; width: calc(100% - 100px); height: 100%; display: flex; align-items: center; justify-content: flex-start; position: relative; } #videoContainer #controls .ProgressContainer .progressBar { width: 100%; height: 8px; background: #39a072; border-radius: 20px; cursor: pointer; overflow: hidden; } #videoContainer #controls .ProgressContainer .progressBar:hover + .time { opacity: 1; transform: translateY(0); } #videoContainer #controls .ProgressContainer .progressBar .progress { width: 0%; height: 100%; background: #fff; border-radius: 20px; } #videoContainer #controls .ProgressContainer .timer { margin: 0 10px; font-family: Arial, sans-serif; font-weight: 300; font-size: 12px; font-weight: 300; color: #2c7a57; letter-spacing: 1px; } #videoContainer #controls .ProgressContainer .time { width: 80px; height: 25px; background: #2c7a57; position: absolute; top: -20px; left: 0; border-radius: 5px; color: #fff; font-family: Arial, sans-serif; text-align: center; line-height: 25px; font-size: 12px; letter-spacing: 1px; opacity: 0; transform: translateY(10px); transition: transform 0.3s, opacity 0.3s; } #videoContainer #controls .ProgressContainer .time::after { content: ""; display: block; width: 0; height: 0; position: absolute; top: 25px; left: 33px; border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 6px solid #2c7a57; } #videoContainer #controls .volume { width: 150px; height: 100%; display: flex; align-items: center; justify-content: flex-end; position: relative; } #videoContainer #controls .volume .icon { width: 25px; height: 25px; background: url(volume.svg); background-size: 100% 100%; cursor: pointer; margin-right: 10px; } #videoContainer #controls .volume .intensityBar { width: 100px; height: 4px; background: #39a072; border-radius: 20px; max-width: 100px; overflow: hidden; transform-origin: right center; cursor: pointer; transition: all 0.5s; } #videoContainer #controls .volume .intensityBar .intensity { width: 50%; height: 100%; background: #fff; } #videoContainer #controls .scale { width: 70px; height: 100%; background: #4dbf8c; display: flex; align-items: center; justify-content: center; margin-left: 5px; cursor: pointer; transition: all 0.4s; border-bottom-right-radius: 5px; } #videoContainer #controls .scale:hover { background: #40b27f; } #videoContainer #controls .scale .icon { width: 25px; height: 25px; background-size: 100% 100%; background: url(expand.svg); background-size: 100% 100%; }
3. Load the latest version of jQuery JavaScript library (slim build) at the end of the document.
<script src="//code.jquery.com/jquery-3.1.1.slim.min.js"></script>
4. The main JavaScript snippets to active the video player.
$(document).ready(function () { 'use strict'; var play_pause = $('.playButton'), container = $('#videoContainer'), playIcon = $('.playButton .playPause'), video = $('video'), play = $('.play'), volume = $('.volume .icon'), volumeIntesity = $('.volume .intensityBar'), intensity = $('.intensity'), progressBar = $('.progressBar'), progress = $('.progressBar .progress'), timer = $('.intialTime'), vidDuration = $('.fullTime'), expandButton = $('.scale .icon'), overlayScreen = $('.overlay'), timeState = $('.time'), overlayButton = $('.overlay .button'), update; $(window).resize(function () { resizeVid(); }); resizeVid(); updateplayer(); play_pause.add(video).click(function () { playVid(); }); progressBar.click(function () {skip(); }); progressBar.mousemove(function () { timeState.text(getTimeState()); }); volume.click(function () { toggleMute(); }); volumeIntesity.click(function () { changeVolume(); }); expandButton.click(function () { fullScreen(); }); overlayButton.click(function () { playVid();}); vidDuration.text(getFormatedFullTime()); function playVid() { if (video.get(0).paused) { video.get(0).play(); playIcon.css({ 'background': 'url(pause.svg)', 'background-size': '100% 100%' }); overlayScreen.hide(); update = setInterval(updateplayer, 1); } else { video.get(0).pause(); playIcon.css({ 'background': 'url(play.svg)', 'background-size': '100% 100%' }); overlayScreen.show(); clearInterval(update); } } function updateplayer() { var percentage = (video[0].currentTime / video[0].duration) * 100; progress.css({'width': percentage + '%'}); timer.text(getFormatedTime()); vidDuration.text(getFormatedFullTime()); if (video[0].ended) { playIcon.css({ 'background': 'url(play.svg)', 'background-size': '100% 100%' }); overlayScreen.show(); overlayButton.css({ 'background': 'url(replay.svg)', 'background-size': '100% 100%' }); } else if (video[0].paused) { overlayButton.css({ 'background': 'url(play-button.svg)', 'background-size': '100% 100%' }); } } function getTimeState() { var mouseX = event.pageX - progressBar.offset().left, width = progressBar.outerWidth(); var currentSeconeds = Math.round((mouseX / width) * video[0].duration); var currentMinutes = Math.floor(currentSeconeds/60); if (currentMinutes > 0) { currentSeconeds -= currentMinutes * 60; } if (currentSeconeds.toString().length === 1) { currentSeconeds = "0" + currentSeconeds; } if (currentMinutes.toString().length === 1) { currentMinutes = "0" + currentMinutes; } timeState.css('left', (mouseX / width) * progressBar.width() + 18 + 'px'); return currentMinutes + ':' + currentSeconeds; } function skip() { var mouseX = event.pageX - progressBar.offset().left, width = progressBar.outerWidth(); video[0].currentTime = (mouseX / width) * video[0].duration; updateplayer(); } function getFormatedFullTime() { var totalSeconeds = Math.round(video[0].duration); var totalMinutes = Math.floor(totalSeconeds/60); if (totalMinutes > 0) { totalSeconeds -= totalMinutes * 60; } if (totalSeconeds.toString().length === 1) { totalSeconeds = "0" + totalSeconeds; } if (totalMinutes.toString().length === 1) { totalMinutes = "0" + totalMinutes; } return totalMinutes + ':' + totalSeconeds; } function getFormatedTime() { var seconeds = Math.round(video[0].currentTime); var minutes = Math.floor(seconeds / 60); if (minutes > 0) { seconeds -= minutes * 60; } if (seconeds.toString().length === 1) { seconeds = "0" + seconeds; } if (minutes.toString().length === 1) { minutes = "0" + minutes; } return minutes + ':' + seconeds; } function toggleMute() { if (!video[0].muted) { video[0].muted = true; volume.css({ 'background': 'url(mute.svg)', 'background-size': '100% 100%' }); intensity.hide(); } else { video[0].muted = false; volume.css({ 'background': 'url(volume.svg)', 'background-size': '100% 100%' }); intensity.show(); } } function changeVolume() { var mouseX = event.pageX - volumeIntesity.offset().left, width = volumeIntesity.outerWidth(); video[0].volume = (mouseX / width); intensity.css('width', (mouseX / width) * width + 'px'); video[0].muted = false; volume.css({ 'background': 'url(volume.svg)', 'background-size': '100% 100%' }); intensity.show(); } function fullScreen() { if (video[0].requestFullscreen) { video[0].requestFullscreen(); } else if (video[0].webkitRequestFullscreen) { video[0].webkitRequestFullscreen(); } else if (video[0].mozRequestFullscreen) { video[0].mozRequestFullscreen(); } else if (video[0].msRequestFullscreen) { video[0].msRequestFullscreen(); } else { video.dblclick(function () { fullScreen(); }); } } function resizeVid() { if (container.width() < 600) { container.addClass('small'); } else { container.removeClass('small'); } } $(window).keypress(function (e) { if (e.keyCode === 0 || e.keyCode === 32) { e.preventDefault() playVid(); } }); for (var i = 0, l = videos.length; i < l; i++) { var video = videos[i]; var src = video.src || (function () { var sources = video.querySelectorAll("source"); for (var j = 0, sl = sources.length; j < sl; j++) { var source = sources[j]; var type = source.type; var isMp4 = type.indexOf("mp4") != -1; if (isMp4) return source.src; } return null; })(); if (src) { var isYoutube = src && src.match(/(?:youtu|youtube)(?:\.com|\.be)\/([\w\W]+)/i); if (isYoutube) { var id = isYoutube[1].match(/watch\?v=|[\w\W]+/gi); id = (id.length > 1) ? id.splice(1) : id; id = id.toString(); var mp4url = "http://www.youtubeinmp4.com/redirect.php?video="; video.src = mp4url + id; } } } });
This awesome jQuery plugin is developed by Mhmdhasan. For more Advanced Usages, please check the demo page or visit the official website.