Skip to content

Instantly share code, notes, and snippets.

@seblambla
Created March 3, 2016 10:20
Show Gist options
  • Save seblambla/ff37fdc3488f78cf7010 to your computer and use it in GitHub Desktop.
Save seblambla/ff37fdc3488f78cf7010 to your computer and use it in GitHub Desktop.
Video-js styles (sass syntax)
$base-font-size: 10px
$touch-device-font-size: 15px
// The main font color controls the color of the text and the icons (font icons)
$main-font-color: #cccccc
// e.g. rgb(255, 255, 255) or #ffffff
// The default color of control backgrounds is mostly black but with a little
// bit of blue so it can still be seen on all black video frames, which are
// common.
$control-bg-color: #07141e
// e.g. rgb(255, 255, 255) or #ffffff
$control-bg-alpha: 0.7
// 1.0 = 100% opacity, 0.0 = 0% opacity
// The slider bar color is used for the progress bar and the volume bar
$slider-bar-color: #66a8cc
// e.g. rgb(255, 255, 255) or #ffffff
// The background of the progress bar and volume bar have a lined pattern that
// is created from a base64 encoded image. You can generate your own pattern at
// http://www.patternify.com/ then replace the value in the quotes with your own
$slider-bar-pattern: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC"
// The color of the slider background
$slider-background-color: #333333
$slider-background-alpha: 0.9
// 1.0 = 100% opacity, 0.0 = 0% opacity
// The "Big Play Button" is the play button that shows before the video plays.
// To center it set the align values to center and middle. The typical location
// of the button is the center, but there is trend towards moving it to a corner
// where it gets out of the way of valuable content in the poster image.
$big-play-align: left
// left, center, or right
$big-play-vertical-align: top
// top, middle, or bottom
// The button colors match the control colors by default but you can customize
// them by replace the variables ($control-bg-color) with your own color values.
$big-play-bg-color: $control-bg-color
$big-play-bg-alpha: $control-bg-alpha
// The font size is what makes the big play button, big. All width/height values
// use ems, which are a multiple of the font size.
// If the $base-font-size is 10px, then 3em equals 30px.
$big-play-font-size: 3em
// Now that font size is set, the following em values will be a multiple of the
// new font size. If $big-play-font-size is 3em (30px), then setting the any of
// the following values to 2em would equal 60px. 2 * font-size
$big-play-margin: 0.5em
$big-play-width: 4em
$big-play-height: 2.6em
$big-play-border-radius: 0.8em
$big-play-border-width: 0.1em
$big-play-border-color: #3b4249
// MIXINS
// =============================================================================
// Mixins are a LESS feature and are used to add vendor prefixes to CSS rules
// when needed.
// https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow
=box-shadow($string: 0 0 1em rgba(0, 0, 0, 0.25))
/* box-shadow */
//
-webkit-box-shadow: $string
-moz-box-shadow: $string
box-shadow: $string
// https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius
=border-radius($string: 5px)
/* border-radius */
//
-webkit-border-radius: $string
-moz-border-radius: $string
border-radius: $string
// https://developer.mozilla.org/en-US/docs/Web/CSS/transition
=transition($string: all 1s linear)
/* transition */
//
-webkit-transition: $string
-moz-transition: $string
-o-transition: $string
transition: $string
// https://developer.mozilla.org/en-US/docs/Web/CSS/transition
=transition-delay($string: 1s)
/* transition-delay */
//
-webkit-transition-delay: $string
-moz-transition-delay: $string
-o-transition-delay: $string
transition-delay: $string
// https://developer.mozilla.org/en-US/docs/Web/CSS/animation
=animation($string: spin 1s infinite linear)
/* animation */
//
-webkit-animation: $string
-moz-animation: $string
-o-animation: $string
animation: $string
// https://developer.mozilla.org/en-US/docs/Web/CSS/transform
=transform($string: rotate(-45deg))
/* transform */
//
-webkit-transform: $string
-moz-transform: $string
-ms-transform: $string
-o-transform: $string
transform: $string
// https://developer.mozilla.org/en-US/docs/Web/CSS/user-select
=user-select($string: none)
/* user-select */
//
-webkit-user-select: $string
-moz-user-select: $string
-ms-user-select: $string
user-select: $string
// Hide something visually but keep available for screen readers.
// http://h5bp.com/v
=hide-visually
/* hide-visually */
//
border: 0
clip: rect(0 0 0 0)
height: 1px
margin: -1px
overflow: hidden
padding: 0
position: absolute
width: 1px
// Align an object with absolute positioning
// Used to align the Big Play Button in the corners or center
=absolute-align($align, $margin, $length)
@if $align == top
top: $margin
@if $align == bottom
bottom: $margin
@if $align == left
left: $margin
@if $align == right
right: $margin
@if $align == center
/* Center it horizontally */
//
left: 50%
margin-left: -($length / 2)
@if $align == middle
/* Center it vertically */
//
top: 50%
margin-top: -($length / 2)
// http://stackoverflow.com/questions/637921/opacity-of-background-but-not-the-text
=background-color-with-alpha($color, $alpha)
$rgba: rgba(red($color), green($color), blue($color), $alpha)
/* background-color-with-alpha */
background-color: $color
background-color: $rgba
// No longer using MS filters because they break border radius in IE9
// $argb: argb($rgba);
// filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr=${argb}, endColorstr=${argb})";
// -ms-filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr=${argb}, endColorstr=${argb})";
=border-color-with-alpha($color, $alpha)
$rgba: rgba(red($color), green($color), blue($color), $alpha)
/* border-color-with-alpha */
//
border-color: $color
border-color: $rgba
/* SKIN
*================================================================================
*The main class name for all skin-specific styles. To make your own skin,
*replace all occurances of 'vjs-default-skin' with a new name. Then add your new
*skin name to your video tag instead of the default skin.
*e.g. <video class="video-js my-skin-name"> */
.vjs-default-skin
color: $main-font-color
/* Custom Icon Font
*--------------------------------------------------------------------------------
*The control icons are from a custom font. Each icon corresponds to a character
*(e.g. "\e001"). Font icons allow for easy scaling and coloring of icons. */
@font-face
font-family: 'VideoJS'
src: url("font/vjs.eot")
src: url("font/vjs.eot?#iefix") format("embedded-opentype"), url("font/vjs.woff") format("woff"), url("font/vjs.ttf") format("truetype")
font-weight: normal
font-style: normal
// Icon font character values
$play-icon: "\e001"
$pause-icon: "\e002"
$volume-muted-icon: "\e003"
$volume-low-icon: "\e004"
$volume-mid-icon: "\e005"
$volume-high-icon: "\e006"
$fullscreen-enter-icon: "\e000"
$fullscreen-exit-icon: "\e00b"
$square-icon: "\e009"
$spinner-icon: "\e00a"
$spinner2-icon: "\e00d"
$spinner3-icon: "\e01e"
$spinner4-icon: "\e01f"
$subtitles-icon: "\e00c"
$captions-icon: "\e008"
$share-icon: "\e00e"
/* Base UI Component Classes
*--------------------------------------------------------------------------------
/* Slider - used for Volume bar and Seek bar */
.vjs-default-skin .vjs-slider
/* Replace browser focus hightlight with handle highlight */
//
outline: 0
position: relative
cursor: pointer
padding: 0
+background-color-with-alpha($slider-background-color, $slider-background-alpha)
.vjs-default-skin .vjs-slider:focus
+box-shadow(0 0 2em white)
.vjs-default-skin .vjs-slider-handle
position: absolute
/* Needed for IE6 */
//
left: 0
top: 0
.vjs-default-skin .vjs-slider-handle:before
content: $square-icon
font-family: VideoJS
font-size: 1em
line-height: 1
text-align: center
text-shadow: 0em 0em 1em #fff
position: absolute
top: 0
left: 0
/* Rotate the square icon to make a diamond */
//
+transform(rotate(-45deg))
/* Control Bar
*--------------------------------------------------------------------------------
*The default control bar that is a container for most of the controls. */
.vjs-default-skin .vjs-control-bar
/* Start hidden */
//
display: none
position: absolute
/* Place control bar at the bottom of the player box/video.
* If you want more margin below the control bar, add more height. */
//
bottom: 0
/* Use left/right to stretch to 100% width of player div */
//
left: 0
right: 0
/* Height includes any margin you want above or below control items */
//
height: 3.0em
+background-color-with-alpha($control-bg-color, $control-bg-alpha)
/* Show the control bar only once the video has started playing */
.vjs-default-skin.vjs-has-started .vjs-control-bar
display: block
/* Visibility needed to make sure things hide in older browsers too. */
visibility: visible
opacity: 1
$trans: visibility 0.1s, opacity 0.1s
// Var needed because of comma
+transition($trans)
/* Hide the control bar when the video is playing and the user is inactive */
.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar
display: block
visibility: hidden
opacity: 0
$trans: visibility 1s, opacity 1s
+transition($trans)
.vjs-default-skin.vjs-controls-disabled .vjs-control-bar
display: none
.vjs-default-skin.vjs-using-native-controls .vjs-control-bar
display: none
/* IE8 is flakey with fonts, and you have to change the actual content to force
*fonts to show/hide properly.
* - "\9" IE8 hack didn't work for this
* - Found in XP IE8 from http://modern.ie. Does not show up in "IE8 mode" in IE9 */
$ie8screen: "\0screen"
.vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before
@media #{$ie8screen}
content: ""
/* General styles for individual controls. */
.vjs-default-skin .vjs-control
outline: none
position: relative
float: left
text-align: center
margin: 0
padding: 0
height: 3.0em
width: 4em
/* FontAwsome button icons */
.vjs-default-skin .vjs-control:before
font-family: VideoJS
font-size: 1.5em
line-height: 2
position: absolute
top: 0
left: 0
width: 100%
height: 100%
text-align: center
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5)
/* Replacement for focus outline */
.vjs-default-skin .vjs-control:focus:before,
.vjs-default-skin .vjs-control:hover:before
text-shadow: 0em 0em 1em rgba(255, 255, 255, 1)
.vjs-default-skin .vjs-control:focus
/* outline: 0;
//
/* keyboard-only users cannot see the focus on several of the UI elements when
*this is set to 0 */
/* Hide control text visually, but have it available for screenreaders */
.vjs-default-skin .vjs-control-text
+hide-visually
/* Play/Pause
*-------------------------------------------------------------------------------- */
.vjs-default-skin .vjs-play-control
width: 5em
cursor: pointer
.vjs-default-skin .vjs-play-control:before
content: $play-icon
.vjs-default-skin.vjs-playing .vjs-play-control:before
content: $pause-icon
/* Volume/Mute
*-------------------------------------------------------------------------------- */
.vjs-default-skin .vjs-mute-control,
.vjs-default-skin .vjs-volume-menu-button
cursor: pointer
float: right
.vjs-default-skin .vjs-mute-control:before,
.vjs-default-skin .vjs-volume-menu-button:before
content: $volume-high-icon
.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,
.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before
content: $volume-muted-icon
.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,
.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before
content: $volume-low-icon
.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,
.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before
content: $volume-mid-icon
.vjs-default-skin .vjs-volume-control
width: 5em
float: right
.vjs-default-skin .vjs-volume-bar
width: 5em
height: 0.6em
margin: 1.1em auto 0
.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content
height: 2.9em
.vjs-default-skin .vjs-volume-level
position: absolute
top: 0
left: 0
height: 0.5em
background: $slider-bar-color url($slider-bar-pattern) -50% 0 repeat
.vjs-default-skin .vjs-volume-bar .vjs-volume-handle
width: 0.5em
height: 0.5em
.vjs-default-skin .vjs-volume-handle:before
font-size: 0.9em
top: -0.2em
left: -0.2em
width: 1em
height: 1em
.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content
width: 6em
left: -4em
/* Progress
*-------------------------------------------------------------------------------- */
.vjs-default-skin .vjs-progress-control
position: absolute
left: 0
right: 0
width: auto
font-size: 0.3em
height: 1em
/* Set above the rest of the controls. */
//
top: -1em
/* Shrink the bar slower than it grows. */
//
+transition(all 0.4s)
/* On hover, make the progress bar grow to something that's more clickable.
* This simply changes the overall font for the progress bar, and this
* updates both the em-based widths and heights, as wells as the icon font */
.vjs-default-skin:hover .vjs-progress-control
font-size: .9em
/* Even though we're not changing the top/height, we need to include them in
* the transition so they're handled correctly. */
+transition(all 0.2s)
/* Box containing play and load progresses. Also acts as seek scrubber. */
.vjs-default-skin .vjs-progress-holder
height: 100%
/* Progress Bars */
.vjs-default-skin .vjs-progress-holder .vjs-play-progress,
.vjs-default-skin .vjs-progress-holder .vjs-load-progress
position: absolute
display: block
height: 100%
margin: 0
padding: 0
/* Needed for IE6 */
//
left: 0
top: 0
.vjs-default-skin .vjs-play-progress
/*
*Using a data URI to create the white diagonal lines with a transparent
* background. Surprisingly works in IE8.
* Created using http://www.patternify.com
*Changing the first color value will change the bar color.
*Also using a paralax effect to make the lines move backwards.
* The -50% left position makes that happen. */
background: $slider-bar-color url($slider-bar-pattern) -50% 0 repeat
.vjs-default-skin .vjs-load-progress
background: rgb(100, 100, 100)
background: rgba(255, 255, 255, 0.4)
.vjs-default-skin .vjs-seek-handle
width: 1.5em
height: 100%
.vjs-default-skin .vjs-seek-handle:before
padding-top: 0.1em
/* Time Display
*-------------------------------------------------------------------------------- */
.vjs-default-skin .vjs-time-controls
font-size: 1em
/* Align vertically by making the line height the same as the control bar */
//
line-height: 3em
.vjs-default-skin .vjs-current-time
float: left
.vjs-default-skin .vjs-duration
float: left
/* Remaining time is in the HTML, but not included in default design */
.vjs-default-skin .vjs-remaining-time
display: none
float: left
.vjs-time-divider
float: left
line-height: 3em
/* Fullscreen
*-------------------------------------------------------------------------------- */
.vjs-default-skin .vjs-fullscreen-control
width: 3.8em
cursor: pointer
float: right
.vjs-default-skin .vjs-fullscreen-control:before
content: $fullscreen-enter-icon
/* Switch to the exit icon when the player is in fullscreen */
.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before
content: $fullscreen-exit-icon
/* Big Play Button (play button at start)
*--------------------------------------------------------------------------------
*Positioning of the play button in the center or other corners can be done more
*easily in the skin designer. http://designer.videojs.com/ */
.vjs-default-skin .vjs-big-play-button
// Calculate total width/height so we're able to center the button
$total-width: $big-play-width + $big-play-border-width * 2
$total-height: $big-play-height + $big-play-border-width * 2
// Position the button using the absolute-align mixin (bottom of page)
+absolute-align($big-play-align, $big-play-margin, $total-width)
+absolute-align($big-play-vertical-align, $big-play-margin, $total-height)
font-size: $big-play-font-size
display: block
z-index: 2
position: absolute
width: $big-play-width
height: $big-play-height
text-align: center
vertical-align: middle
cursor: pointer
opacity: 1
/* Need a slightly gray bg so it can be seen on black backgrounds */
//
+background-color-with-alpha($big-play-bg-color, $big-play-bg-alpha)
border: $big-play-border-width solid $big-play-border-color
+border-radius($big-play-border-radius)
+box-shadow(0px 0px 1em rgba(255, 255, 255, 0.25))
+transition(all 0.4s)
/* Optionally center */
.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button
$total-width: $big-play-width + $big-play-border-width * 2
$total-height: $big-play-height + $big-play-border-width * 2
+absolute-align(center, $big-play-margin, $total-width)
+absolute-align(middle, $big-play-margin, $total-height)
/* Hide if controls are disabled */
.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button
display: none
/* Hide when video starts playing */
.vjs-default-skin.vjs-has-started .vjs-big-play-button
display: none
/* Hide on mobile devices. Remove when we stop using native controls
* by default on mobile */
.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button
display: none
.vjs-default-skin:hover .vjs-big-play-button,
.vjs-default-skin .vjs-big-play-button:focus
outline: 0
border-color: #fff
/* IE8 needs a non-glow hover state */
//
background-color: rgb(80, 80, 80)
background-color: rgba(10, 20, 50, 0.75)
+box-shadow(0 0 3em white)
+transition(all 0s)
.vjs-default-skin .vjs-big-play-button:before
content: $play-icon
font-family: VideoJS
/* In order to center the play icon vertically we need to set the line height
* to the same as the button height */
line-height: $big-play-height
text-shadow: 0.05em 0.05em 0.1em #000
text-align: center
position: absolute
left: 0
width: 100%
height: 100%
/* Loading Spinner
*-------------------------------------------------------------------------------- */
.vjs-loading-spinner
display: none
position: absolute
top: 50%
left: 50%
font-size: 4em
line-height: 1
width: 1em
height: 1em
margin-left: -0.5em
margin-top: -0.5em
opacity: 0.75
+animation(spin 1.5s infinite linear)
.vjs-default-skin .vjs-loading-spinner:before
content: $spinner3-icon
font-family: VideoJS
position: absolute
top: 0
left: 0
width: 1em
height: 1em
text-align: center
text-shadow: 0em 0em 0.1em #000
@-moz-keyframes spin
0%
-moz-transform: rotate(0deg)
100%
-moz-transform: rotate(359deg)
@-webkit-keyframes spin
0%
-webkit-transform: rotate(0deg)
100%
-webkit-transform: rotate(359deg)
@-o-keyframes spin
0%
-o-transform: rotate(0deg)
100%
-o-transform: rotate(359deg)
@keyframes spin
0%
transform: rotate(0deg)
100%
transform: rotate(359deg)
/* Menu Buttons (Captions/Subtitles/etc.)
*-------------------------------------------------------------------------------- */
.vjs-default-skin .vjs-menu-button
float: right
cursor: pointer
.vjs-default-skin .vjs-menu
display: none
position: absolute
bottom: 0
left: 0em
/* (Width of vjs-menu - width of button) / 2 */
width: 0em
height: 0em
margin-bottom: 3em
border-left: 2em solid transparent
border-right: 2em solid transparent
border-top: 1.55em solid rgb(0, 0, 0)
/* Same width top as ul bottom */
border-top-color: rgba(7, 40, 50, 0.5)
/* Same as ul background */
/* Button Pop-up Menu */
.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content
display: block
padding: 0
margin: 0
position: absolute
width: 10em
bottom: 1.5em
/* Same bottom as vjs-menu border-top */
max-height: 15em
overflow: auto
left: -5em
/* Width of menu - width of button / 2 */
+background-color-with-alpha($control-bg-color, $control-bg-alpha)
+box-shadow(-0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2))
.vjs-default-skin .vjs-menu-button:hover .vjs-menu
display: block
.vjs-default-skin .vjs-menu-button ul li
list-style: none
margin: 0
padding: 0.3em 0 0.3em 0
line-height: 1.4em
font-size: 1.2em
text-align: center
text-transform: lowercase
.vjs-default-skin .vjs-menu-button ul li.vjs-selected
background-color: #000
.vjs-default-skin .vjs-menu-button ul li:focus,
.vjs-default-skin .vjs-menu-button ul li:hover,
.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,
.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover
outline: 0
color: #111
+background-color-with-alpha(rgb(255, 255, 255), 0.75)
+box-shadow(0 0 1em rgba(255, 255, 255, 1))
.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title
text-align: center
text-transform: uppercase
font-size: 1em
line-height: 2em
padding: 0
margin: 0 0 0.3em 0
font-weight: bold
cursor: default
/* Subtitles Button */
.vjs-default-skin .vjs-subtitles-button:before
content: $subtitles-icon
/* Captions Button */
.vjs-default-skin .vjs-captions-button:before
content: $captions-icon
/* Replacement for focus outline */
.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,
.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before
+box-shadow(0 0 1em rgba(255, 255, 255, 1))
/*
*REQUIRED STYLES (be careful overriding)
*================================================================================
*When loading the player, the video tag is replaced with a DIV,
*that will hold the video tag or object tag for other playback methods.
*The div contains the video playback element (Flash or HTML5) and controls,
*and sets the width and height of the video.
*
*** If you want to add some kind of border/padding (e.g. a frame), or special
*positioning, use another containing element. Otherwise you risk messing up
*control positioning and full window mode. ** */
.video-js
background-color: #000
position: relative
padding: 0
/* Start with 10px for base font size so other dimensions can be em based and
* easily calculable. */
font-size: $base-font-size
/* Allow poster to be vertially aligned. */
vertical-align: middle
/* display: table-cell;
/*This works in Safari but not Firefox.
/* Provide some basic defaults for fonts */
font-weight: normal
font-style: normal
/* Avoiding helvetica: issue #376 */
font-family: Arial, sans-serif
+user-select(none)
.video-js .vjs-tech
position: absolute
top: 0
left: 0
width: 100%
height: 100%
.video-js:-moz-full-screen
position: absolute
body.vjs-full-window
padding: 0
margin: 0
height: 100%
overflow-y: auto
.video-js.vjs-fullscreen
position: fixed
overflow: hidden
z-index: 1000
left: 0
top: 0
bottom: 0
right: 0
width: 100% !important
height: 100% !important
_position: absolute
.video-js:-webkit-full-screen
width: 100% !important
height: 100% !important
.video-js.vjs-fullscreen.vjs-user-inactive
cursor: none
.vjs-poster
background-repeat: no-repeat
background-position: 50% 50%
background-size: contain
cursor: pointer
height: 100%
margin: 0
padding: 0
position: relative
width: 100%
.vjs-poster img
display: block
margin: 0 auto
max-height: 100%
padding: 0
width: 100%
.video-js.vjs-using-native-controls .vjs-poster
display: none
.video-js .vjs-text-track-display
text-align: center
position: absolute
bottom: 4em
left: 1em
right: 1em
.video-js .vjs-text-track
display: none
font-size: 1.4em
text-align: center
margin-bottom: 0.1em
+background-color-with-alpha(rgb(0, 0, 0), 0.5)
.video-js .vjs-subtitles
color: #fff
.video-js .vjs-captions
color: #fc6
.vjs-tt-cue
display: block
.vjs-default-skin .vjs-hidden
display: none
.vjs-lock-showing
display: block !important
opacity: 1
visibility: visible
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment