Minimal HTML5 Video Player With Pure JavaScript

Category: Javascript | February 4, 2018
Author:w3bh4ck
Views Total:1,911 views
Official Page:Go to website
Last Update:February 4, 2018
License:MIT

Preview:

Minimal HTML5 Video Player With Pure JavaScript

Description:

A minimal, Vanilla JavaScript-based HTML5 video player with custom controls styled with your own CSS.

How to use it:

Embed an HTML5 video with player controls into the page.

<div class="player">
  <video class="player__video viewer" src="mov.mp4"></video>
  <div class="player__controls">
    <div class="progress">
      <div class="progress__filled"></div>
    </div>
    <button class="player__button toggle" title="Toggle Play">►</button>
    <input type="range" name="volume" class="player__slider" min="0" max="1" step="0.05" value="1">
    <input type="range" name="playbackRate" class="player__slider" min="0.5" max="2" step="0.1" value="1">
    <button data-skip="-10" class="player__button">« 10s</button>
    <button data-skip="25" class="player__button">25s »</button>
  </div>
</div>

Load the main player JavaScript at the end of the page.

<script src="js/index.js"></script>

The CSS to style the video player.

.player {
  max-width: 750px;
  border: 5px solid rgba(0, 0, 0, 0.2);
  box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
  position: relative;
  font-size: 0;
  overflow: hidden;
}
/* This css is only applied when fullscreen is active. */
.player:fullscreen {
 max-width: none;
 width: 100%;
}
 .player:-webkit-full-screen {
 max-width: none;
 width: 100%;
}
.player__video { width: 100%; }
.player__button {
  background: none;
  border: 0;
  line-height: 1;
  color: white;
  text-align: center;
  outline: 0;
  padding: 0;
  cursor: pointer;
  max-width: 50px;
}
.player__button:focus { border-color: #ffc600; }
.player__slider {
  width: 10px;
  height: 30px;
}
.player__controls {
  display: flex;
  position: absolute;
  bottom: 0;
  width: 100%;
  transform: translateY(100%) translateY(-5px);
  transition: all 0.3s;
  flex-wrap: wrap;
  background: rgba(0, 0, 0, 0.1);
}
.player:hover .player__controls { transform: translateY(0); }
.player:hover .progress { height: 15px; }
.player__controls > * { flex: 1; }
.progress {
  flex: 10;
  position: relative;
  display: flex;
  flex-basis: 100%;
  height: 5px;
  transition: height 0.3s;
  background: rgba(0, 0, 0, 0.5);
  cursor: ew-resize;
}
.progress__filled {
  width: 50%;
  background: #ffc600;
  flex: 0;
  flex-basis: 50%;
}
/* unholy css to style input type="range" */
input[type="range"] {
  -webkit-appearance: none;
  background: transparent;
  width: 100%;
  margin: 0 5px;
}
input[type="range"]:focus { outline: none; }
input[type="range"]::-webkit-slider-runnable-track {
 width: 100%;
 height: 8.4px;
 cursor: pointer;
 box-shadow: 1px 1px 1px rgba(0, 0, 0, 0), 0 0 1px rgba(13, 13, 13, 0);
 background: rgba(255, 255, 255, 0.8);
 border-radius: 1.3px;
 border: 0.2px solid rgba(1, 1, 1, 0);
}
input[type="range"]::-webkit-slider-thumb {
 height: 15px;
 width: 15px;
 border-radius: 50px;
 background: #ffc600;
 cursor: pointer;
 -webkit-appearance: none;
 margin-top: -3.5px;
 box-shadow: 0 0 2px rgba(0, 0, 0, 0.2);
}
input[type="range"]:focus::-webkit-slider-runnable-track {
 background: #bada55;
}
input[type="range"]::-moz-range-track {
 width: 100%;
 height: 8.4px;
 cursor: pointer;
 box-shadow: 1px 1px 1px rgba(0, 0, 0, 0), 0 0 1px rgba(13, 13, 13, 0);
 background: #ffffff;
 border-radius: 1.3px;
 border: 0.2px solid rgba(1, 1, 1, 0);
}
input[type="range"]::-moz-range-thumb {
 box-shadow: 0 0 0 rgba(0, 0, 0, 0), 0 0 0 rgba(13, 13, 13, 0);
 height: 15px;
 width: 15px;
 border-radius: 50px;
 background: #ffc600;
 cursor: pointer;
}

You Might Be Interested In:


Leave a Reply