This is the base skin of Video.js that can be modified to make custom skins.
The great thing about Video.js skins is they work in both HTML5 video AND Flash!
A Pen by Steve Heffernan on CodePen.
| <!-- Not including the default CSS so it can be generated by the LESS --> | |
| <!--<link href="http://vjs.zencdn.net/4.3.0/video-js.css" rel="stylesheet"> --> | |
| <script src="http://vjs.zencdn.net/4.3/video.js"></script> | |
| <video id="my_video_1" class="video-js vjs-default-skin" | |
| controls preload="none" width="640px" height="267px" data-setup='{}' | |
| poster='http://video-js.zencoder.com/oceans-clip.jpg'> | |
| <source src="http://vjs.zencdn.net/v/oceans.mp4" type='video/mp4' /> | |
| <source src="http://vjs.zencdn.net/v/oceans.webm" type='video/webm' /> | |
| </video> | |
| <style> | |
| /* Show the controls (hidden at the start by default) */ | |
| .video-js .vjs-control-bar { display: block; } | |
| /* Make the CDN fonts accessible from the CSS */ | |
| @font-face { | |
| font-family: 'VideoJS'; | |
| src: url('http://vjs.zencdn.net/f/2/vjs.eot'); | |
| src: url('http://vjs.zencdn.net/f/2/vjs.eot?#iefix') format('embedded-opentype'), | |
| url('http://vjs.zencdn.net/f/2/vjs.woff') format('woff'), | |
| url('http://vjs.zencdn.net/f/2/vjs.ttf') format('truetype'); | |
| } | |
| /* Make the demo a little prettier */ | |
| body { background: #222; text-align: center; } | |
| .video-js { margin: 0 auto; } | |
| </style> |
| /*! | |
| Video.js Default Styles (http://videojs.com) | |
| Version 4.3.0 | |
| Create your own skin at http://designer.videojs.com | |
| */ | |
| // To customize the player skin, change the values of the variables or edit the | |
| // CSS below. | |
| // (This file uses LESS. Learn more at http://lesscss.org/) | |
| // The base font size controls the size of everything, not just text. All | |
| // diminensions use em-based sizes so that the scale along with the font size. | |
| // Try increasing it to 20px and see what happens. | |
| @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; | |
| /* 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 #fff); | |
| } | |
| .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 1.0s, opacity 1.0s; | |
| .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) /* IE8- Fallback */; | |
| 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 /* Minor adjustment */; | |
| } | |
| /* 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(50, 50, 50, 0.75); | |
| .box-shadow(0 0 3em #fff); | |
| .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 /* Needed for IE8 */; | |
| 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; | |
| /* Turn off user selection (text highlighting) by default. | |
| The majority of player components will not be text blocks. | |
| Text areas will need to turn user selection back on. */ | |
| .user-select(none); | |
| } | |
| /* Playback technology elements expand to the width/height of the containing div | |
| <video> or <object> */ | |
| .video-js .vjs-tech { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| /* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when | |
| checking fullScreenEnabled. */ | |
| .video-js:-moz-full-screen { position: absolute; } | |
| /* Fullscreen Styles */ | |
| body.vjs-full-window { | |
| padding: 0; | |
| margin: 0; | |
| height: 100%; | |
| /* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */// | |
| 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; | |
| /* IE6 full-window (underscore hack) */// | |
| _position: absolute; | |
| } | |
| .video-js:-webkit-full-screen { | |
| width: 100% !important; | |
| height: 100% !important; | |
| } | |
| .video-js.vjs-fullscreen.vjs-user-inactive { | |
| cursor: none; | |
| } | |
| /* Poster Styles */ | |
| .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%; | |
| } | |
| /* Hide the poster when native controls are used otherwise it covers them */ | |
| .video-js.vjs-using-native-controls .vjs-poster { | |
| display: none; | |
| } | |
| /* Text Track Styles */ | |
| /* Overall track holder for both captions and subtitles */ | |
| .video-js .vjs-text-track-display { | |
| text-align: center; | |
| position: absolute; | |
| bottom: 4em; | |
| /* Leave padding on left and right */// | |
| left: 1em; | |
| right: 1em; | |
| } | |
| /* Individual tracks */ | |
| .video-js .vjs-text-track { | |
| display: none; | |
| font-size: 1.4em; | |
| text-align: center; | |
| margin-bottom: 0.1em; | |
| /* Transparent black background, or fallback to all black (oldIE) */// | |
| .background-color-with-alpha(rgb(0, 0, 0), 0.5); | |
| } | |
| .video-js .vjs-subtitles { color: #fff /* Subtitles are white */; } | |
| .video-js .vjs-captions { color: #fc6 /* Captions are yellow */; } | |
| .vjs-tt-cue { display: block; } | |
| /* Hide disabled or unsupported controls */ | |
| .vjs-default-skin .vjs-hidden { display: none; } | |
| .vjs-lock-showing { | |
| display: block !important; | |
| opacity: 1; | |
| visibility: visible; | |
| } | |
| // 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) when (@align = top) { | |
| top: @margin; | |
| } | |
| .absolute-align (@align, @margin, @length) when (@align = bottom) { | |
| bottom: @margin; | |
| } | |
| .absolute-align (@align, @margin, @length) when (@align = left) { | |
| left: @margin; | |
| } | |
| .absolute-align (@align, @margin, @length) when (@align = right) { | |
| right: @margin; | |
| } | |
| .absolute-align (@align, @margin, @length) when (@align = center) { | |
| /* Center it horizontally */// | |
| left: 50%; | |
| margin-left: -(@length / 2); | |
| } | |
| .absolute-align (@align, @margin, @length) when (@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; | |
| } | |
| // NOTES ON LESS (tracking learnings so we don't forget) | |
| // ============================================================================= | |
| // * We want this file to continue to be accessible by people who don't know | |
| // LESS but know CSS. This means finding the balance between using the most | |
| // valuable LESS features (e.g. variables) and keeping it looking like CSS. | |
| // So it's best to avoid advanced LESS features like conditional statements. | |
| // (we're using one for the big play button position because that's a hot | |
| // topic) | |
| // | |
| // * We care about the readability of the CSS output of LESS, which means we | |
| // have to be careful about what features of LESS we use. (if you're building | |
| // your own skin this may not apply) | |
| // 1. Comments inside of rules (strangely) have an extra line added after | |
| // them in the CSS output. To avoid this we can add a LESS comment after | |
| // the CSS comment. | |
| // /* comment */// | |
| // | |
| // 2. In a rule with nested rules, any comments outside of a rule are moved | |
| // to the top of the parent rule. i.e. it might look like: | |
| // /* title of rule 1 */ | |
| // /* title of rule 2 */ | |
| // .rule1 {} | |
| // .rule2 {} | |
| // This is why we aren't using nested rules inside of the | |
| // vjs-default-skin class. | |
| /* ----------------------------------------------------------------------------- | |
| The original source of this file lives at | |
| https://github.com/videojs/video.js/blob/master/src/css/video-js.less */ |
This is the base skin of Video.js that can be modified to make custom skins.
The great thing about Video.js skins is they work in both HTML5 video AND Flash!
A Pen by Steve Heffernan on CodePen.