diff options
author | Sam Potts <me@sampotts.me> | 2017-10-18 12:43:10 +1100 |
---|---|---|
committer | Sam Potts <me@sampotts.me> | 2017-10-18 12:43:10 +1100 |
commit | 36a84c5c2da8dcb6678b9f2bba0216c1bbf76dac (patch) | |
tree | 9661278fcb888a42ff5e9d6d5d4de26e72c671f5 /src | |
parent | 4392abfc49d0847c7903d6b5854dabdb07b239ff (diff) | |
download | plyr-36a84c5c2da8dcb6678b9f2bba0216c1bbf76dac.tar.lz plyr-36a84c5c2da8dcb6678b9f2bba0216c1bbf76dac.tar.xz plyr-36a84c5c2da8dcb6678b9f2bba0216c1bbf76dac.zip |
Removed extra <progress> for populating lower fill on range inputs
Diffstat (limited to 'src')
-rw-r--r-- | src/js/plyr.js | 213 | ||||
-rw-r--r-- | src/less/mixins.less | 4 | ||||
-rw-r--r-- | src/less/plyr.less | 140 | ||||
-rw-r--r-- | src/less/variables.less | 10 |
4 files changed, 174 insertions, 193 deletions
diff --git a/src/js/plyr.js b/src/js/plyr.js index d5d9f11b..c0a39fb9 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -471,6 +471,7 @@ isFirefox: isFirefox, isChrome: isChrome, isSafari: isSafari, + isWebkit: 'WebkitAppearance' in document.documentElement.style, isIPhone: /(iPhone|iPod)/gi.test(navigator.platform), isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform), }; @@ -1429,6 +1430,45 @@ } } + // Webkit polyfill for lower fill range + function updateRangeFill(range) { + if (!player.browser.isWebkit) { + return; + } + + if (!utils.is.htmlElement(range)) { + return; + } + + // Inject the stylesheet if needed + if (!utils.is.htmlElement(player.elements.styleSheet)) { + player.elements.styleSheet = utils.createElement('style'); + player.elements.container.appendChild(player.elements.styleSheet); + } + + var styleSheet = player.elements.styleSheet.sheet; + var percentage = (range.value / range.max) * 100; + var selector = '#' + range.id + '::-webkit-slider-runnable-track'; + var styles = '{ background-image: linear-gradient(to right, currentColor ' + percentage + '%, transparent ' + percentage + '%) }'; + var index = -1; + + // Find old rule if it exists + [].some.call(styleSheet.rules, function(rule, i) { + if (rule.selectorText === selector) { + index = i; + return true; + } + })[0]; + + // Remove old rule + if (index !== -1) { + styleSheet.deleteRule(index); + } + + // Insert new one + styleSheet.insertRule([selector, styles].join(' ')); + } + // Get icon URL function getIconUrl() { return { @@ -1605,7 +1645,7 @@ type: 'range', min: 0, max: 100, - step: 0.1, + step: 0.01, value: 0, autocomplete: 'off', }, @@ -1738,14 +1778,11 @@ container.appendChild(seek.label); container.appendChild(seek.input); - // TODO: Add loop display indicator - - // Played progress - container.appendChild(createProgress('played')); - // Buffer progress container.appendChild(createProgress('buffer')); + // TODO: Add loop display indicator + // Seek tooltip if (player.config.tooltips.seek) { var tooltip = utils.createElement( @@ -1803,10 +1840,6 @@ volume.appendChild(range.label); volume.appendChild(range.input); - // Create the display progress - var progress = createProgress('volume', attributes); - volume.appendChild(progress); - controls.appendChild(volume); } @@ -2701,8 +2734,6 @@ // Display player.elements.display = { buffer: getElement(player.config.selectors.display.buffer), - played: getElement(player.config.selectors.display.played), - volume: getElement(player.config.selectors.display.volume), duration: getElement(player.config.selectors.display.duration), currentTime: getElement(player.config.selectors.display.currentTime), }; @@ -3043,7 +3074,6 @@ // Get current quality player.media.quality = instance.getPlaybackQuality(); - // Trigger timeupdate trigger(player.media, 'qualitychange'); }, onPlaybackRateChange: function(event) { @@ -3053,7 +3083,6 @@ // Get current speed player.media.playbackRate = instance.getPlaybackRate(); - // Trigger timeupdate trigger(player.media, 'ratechange'); }, onReady: function(event) { @@ -3097,10 +3126,7 @@ // Update UI embedReady(); - // Trigger timeupdate trigger(player.media, 'timeupdate'); - - // Trigger timeupdate trigger(player.media, 'durationchange'); // Reset timer @@ -3177,10 +3203,7 @@ // Poll to get playback progress timers.playing = window.setInterval(function() { - // Set the current time player.media.currentTime = instance.getCurrentTime(); - - // Trigger timeupdate trigger(player.media, 'timeupdate'); }, 100); @@ -3248,15 +3271,11 @@ player.embed.getCurrentTime().then(function(value) { player.media.currentTime = value; - - // Trigger timeupdate trigger(player.media, 'timeupdate'); }); player.embed.getDuration().then(function(value) { player.media.duration = value; - - // Trigger timeupdate trigger(player.media, 'durationchange'); }); @@ -3358,8 +3377,6 @@ player.embed.getPosition(function(value) { player.media.currentTime = value; - - // Trigger timeupdate trigger(player.media, 'timeupdate'); }); @@ -3554,10 +3571,7 @@ var value = player.media.muted ? 0 : player.media.volume; if (player.elements.inputs.volume) { - player.elements.inputs.volume.value = value; - } - if (player.elements.display.volume) { - player.elements.display.volume.value = value; + setRange(player.elements.inputs.volume, value); } } @@ -3592,13 +3606,48 @@ }, player.loading ? 250 : 0); } + // Update seek value and lower fill + function setRange(range, value) { + if (!utils.is.htmlElement(range)) { + return; + } + + range.value = value; + + // Webkit range fill + updateRangeFill(range); + } + + // Set <progress> value + function setProgress(progress, value) { + // Default to 0 + if (utils.is.undefined(value)) { + value = 0; + } + + // Default to buffer or bail + if (utils.is.undefined(progress)) { + progress = player.elements.display.buffer; + } + + // Update value and label + if (utils.is.htmlElement(progress)) { + progress.value = value; + + // Update text label inside + var label = progress.getElementsByTagName('span')[0]; + if (utils.is.htmlElement(label)) { + label.childNodes[0].nodeValue = value; + } + } + } + // Update <progress> elements function updateProgress(event) { if (!player.supported.full) { return; } - var progress = player.elements.display.played; var value = 0; var duration = player.getDuration(); @@ -3610,8 +3659,8 @@ value = utils.getPercentage(player.media.currentTime, duration); // Set seek range value only if it's a 'natural' time event - if (event.type === 'timeupdate' && player.elements.inputs.seek) { - player.elements.inputs.seek.value = value; + if (event.type === 'timeupdate') { + setRange(player.elements.inputs.seek, value); } break; @@ -3619,7 +3668,6 @@ // Check buffer status case 'playing': case 'progress': - progress = player.elements.display.buffer; value = (function() { var buffered = player.media.buffered; @@ -3634,6 +3682,8 @@ return 0; })(); + setProgress(player.elements.display.buffer, value); + break; } } @@ -3643,45 +3693,12 @@ console.warn('Looping'); player.seek(player.config.loop.start); }*/ - - setProgress(progress, value); - } - - // Set <progress> value - function setProgress(progress, value) { - if (!player.supported.full) { - return; - } - - // Default to 0 - if (utils.is.undefined(value)) { - value = 0; - } - // Default to buffer or bail - if (utils.is.undefined(progress)) { - if (utils.is.htmlElement(player.elements.display.buffer)) { - progress = player.elements.display.buffer; - } else { - return; - } - } - - // Update value and label - if (utils.is.htmlElement(progress)) { - progress.value = value; - - // Update text label inside - var label = progress.getElementsByTagName('span')[0]; - if (utils.is.htmlElement(label)) { - label.childNodes[0].nodeValue = value; - } - } } // Update the displayed time function updateTimeDisplay(time, element) { // Bail if there's no duration display - if (!element) { + if (!utils.is.htmlElement(element)) { return; } @@ -3749,27 +3766,6 @@ updateProgress(event); } - // Update seek range and progress - function updateSeekDisplay(time) { - // Default to 0 - if (!utils.is.number(time)) { - time = 0; - } - - var duration = player.getDuration(); - var value = utils.getPercentage(time, duration); - - // Update progress - if (player.elements.progress && player.elements.display.played) { - player.elements.display.played.value = value; - } - - // Update seek range input - if (player.elements.buttons && player.elements.inputs.seek) { - player.elements.inputs.seek.value = value; - } - } - // Update hover tooltip for seeking function updateSeekTooltip(event) { var duration = player.getDuration(); @@ -3828,17 +3824,13 @@ return; } - // Update seek range and progress - updateSeekDisplay(); - - // Reset buffer progress - setProgress(); - // Cancel current network requests cancelRequests(); // Destroy instance and re-setup player.destroy(function() { + // TODO: Reset menus here + // Remove elements removeElement(player.media); removeElement('captions'); @@ -3977,7 +3969,7 @@ var target = player.elements.buttons[play ? 'pause' : 'play']; // Transfer focus - if (target) { + if (utils.is.htmlElement(target)) { target.focus(); } } @@ -4262,11 +4254,12 @@ // Click anywhere closes menu utils.on(document.documentElement, 'click', toggleMenu); - // Show tab in menu - utils.on(player.elements.settings.form, 'click', showTab); - - // Settings menu items - use event delegation as items are added/removed + // Settings menu utils.on(player.elements.settings.form, 'click', function(event) { + // Show tab in menu + showTab(event); + + // Settings menu items - use event delegation as items are added/removed // Settings - Language if (utils.matches(event.target, player.config.selectors.inputs.language)) { handlerProxy.call(this, event, player.config.listeners.language, function() { @@ -4306,11 +4299,18 @@ player.seek(event.target.value / event.target.max * duration); }); - // Seek + // Volume utils.proxy(player.elements.inputs.volume, inputEvent, player.config.listeners.volume, function() { player.setVolume(event.target.value); }); + // Polyfill for lower fill in <input type="range"> for webkit + if (player.browser.isWebkit) { + utils.on(getElements('input[type="range"]'), [inputEvent, 'updated'].join(' '), function(event) { + updateRangeFill(event.target); + }); + } + // Seek tooltip utils.on(player.elements.progress, 'mouseenter mouseleave mousemove', updateSeekTooltip); @@ -4789,7 +4789,6 @@ setupCaptions: setupCaptions, toggleNativeControls: toggleNativeControls, updateTimeDisplay: updateTimeDisplay, - updateSeekDisplay: updateSeekDisplay, updateSource: updateSource, toggleMenu: toggleMenu, timers: timers, @@ -4925,9 +4924,6 @@ targetTime = duration; } - // Update seek range and progress - player.core.updateSeekDisplay(targetTime); - // Set the current time // Embeds if (utils.inArray(types.embed, player.type)) { @@ -4949,9 +4945,6 @@ player.pause(); } - // Trigger timeupdate - player.core.trigger(player.media, 'timeupdate'); - // Set seeking flag player.media.seeking = true; @@ -5196,7 +5189,7 @@ player.config.loop.end = null; } player.config.loop.start = currentTime; - player.config.loop.indicator.start = player.elements.display.played.value; + //player.config.loop.indicator.start = player.elements.display.played.value; break; case 'end': @@ -5204,7 +5197,7 @@ return; } player.config.loop.end = currentTime; - player.config.loop.indicator.end = player.elements.display.played.value; + //player.config.loop.indicator.end = player.elements.display.played.value; break; case 'all': diff --git a/src/less/mixins.less b/src/less/mixins.less index 0b75b2a6..a620a599 100644 --- a/src/less/mixins.less +++ b/src/less/mixins.less @@ -18,7 +18,7 @@ background: @plyr-range-thumb-bg; border: @plyr-range-thumb-border; border-radius: 100%; - transition: background .2s ease, border .2s ease, transform .2s ease; + transition: background 0.2s ease, border 0.2s ease, transform 0.2s ease; box-shadow: @plyr-range-thumb-shadow; box-sizing: border-box; } @@ -26,4 +26,4 @@ background: @plyr-range-thumb-active-bg; border-color: @plyr-range-thumb-active-border-color; transform: scale(@plyr-range-thumb-active-scale); -}
\ No newline at end of file +} diff --git a/src/less/plyr.less b/src/less/plyr.less index 0c36930c..22e29aa2 100644 --- a/src/less/plyr.less +++ b/src/less/plyr.less @@ -1,6 +1,7 @@ // ========================================================================== // Plyr styles // https://github.com/sampotts/plyr +// TODO: break into smaller files and look at use of BEM classnames // ========================================================================== @import 'variables'; @@ -57,7 +58,7 @@ } // ARIA - [aria-hidden="true"] { + [aria-hidden='true'] { display: none; } @@ -77,7 +78,7 @@ // Range inputs // Specificity is for bootstrap compatibility - input[type="range"] { + input[type='range'] { display: block; height: (@plyr-range-thumb-height * @plyr-range-thumb-active-scale); width: 100%; @@ -87,6 +88,9 @@ border: none; background: transparent; + // Used in JS to populate lower fill for WebKit + color: @plyr-range-selected-bg; + // WebKit -webkit-appearance: none; @@ -106,6 +110,11 @@ &::-moz-range-thumb { .plyr-range-thumb(); } + &::-moz-range-progress { + height: @plyr-range-track-height; + background: currentColor; + border-radius: (@plyr-range-track-height / 2); + } // Microsoft &::-ms-track { @@ -119,7 +128,7 @@ } &::-ms-fill-lower { .plyr-range-track(); - background: @plyr-range-selected-bg; + background: currentColor; } &::-ms-thumb { .plyr-range-thumb(); @@ -157,13 +166,37 @@ } // Video range inputs -.plyr--video input[type="range"].tab-focus { - outline: 1px dotted fade(@plyr-video-control-color, 50%); +.plyr--video input[type='range'] { + &::-webkit-slider-runnable-track { + background: @plyr-video-range-track-bg; + } + &::-moz-range-track { + background: @plyr-video-range-track-bg; + } + &::-ms-track { + background: @plyr-video-range-track-bg; + } + + &.tab-focus { + outline: 1px dotted fade(@plyr-video-control-color, 50%); + } } // Audio range inputs -.plyr--audio input[type="range"].tab-focus { - outline: 1px dotted fade(@plyr-audio-control-color, 50%); +.plyr--audio input[type='range'] { + &::-webkit-slider-runnable-track { + background: @plyr-audio-range-track-bg; + } + &::-moz-range-track { + background: @plyr-audio-range-track-bg; + } + &::-ms-track { + background: @plyr-audio-range-track-bg; + } + + &.tab-focus { + outline: 1px dotted fade(@plyr-audio-control-color, 50%); + } } // Screen reader only elements @@ -354,7 +387,6 @@ display: block; fill: currentColor; pointer-events: none; - filter: drop-shadow(0 1px 1px fade(#000, 15%)); } // Hide toggle icons by default @@ -378,17 +410,21 @@ bottom: 0; z-index: 2; padding: (@plyr-control-spacing * 3.5) @plyr-control-spacing @plyr-control-spacing; - background: linear-gradient(fade(@plyr-video-controls-bg, 0%), fade(@plyr-video-controls-bg, 85%)); + background: linear-gradient(fade(@plyr-video-controls-bg, 0%), fade(@plyr-video-controls-bg, 70%)); border-bottom-left-radius: inherit; border-bottom-right-radius: inherit; color: @plyr-video-control-color; transition: opacity 0.3s ease; .plyr__control { + svg { + filter: drop-shadow(0 1px 1px fade(#000, 15%)); + } + // Hover and tab focus &.tab-focus, &:hover, - &[aria-expanded="true"] { + &[aria-expanded='true'] { background: @plyr-video-control-bg-hover; color: @plyr-video-control-color-hover; } @@ -407,7 +443,7 @@ // Hover and tab focus &.tab-focus, &:hover, - &[aria-expanded="true"] { + &[aria-expanded='true'] { background: @plyr-audio-control-bg-hover; color: @plyr-audio-control-color-hover; } @@ -461,11 +497,11 @@ } // States -.plyr__controls [data-plyr="pause"], -.plyr--playing .plyr__controls [data-plyr="play"] { +.plyr__controls [data-plyr='pause'], +.plyr--playing .plyr__controls [data-plyr='play'] { display: none; } -.plyr--playing .plyr__controls [data-plyr="pause"] { +.plyr--playing .plyr__controls [data-plyr='pause'] { display: inline-block; } @@ -481,16 +517,16 @@ } // Some options are hidden by default -.plyr [data-plyr="captions"], -.plyr [data-plyr="fullscreen"], -.plyr [data-plyr="pip"], -.plyr [data-plyr="airplay"] { +.plyr [data-plyr='captions'], +.plyr [data-plyr='fullscreen'], +.plyr [data-plyr='pip'], +.plyr [data-plyr='airplay'] { display: none; } -.plyr--captions-enabled [data-plyr="captions"], -.plyr--fullscreen-enabled [data-plyr="fullscreen"], -.plyr--pip-enabled [data-plyr="pip"], -.plyr--airplay-enabled [data-plyr="airplay"] { +.plyr--captions-enabled [data-plyr='captions'], +.plyr--fullscreen-enabled [data-plyr='fullscreen'], +.plyr--pip-enabled [data-plyr='pip'], +.plyr--airplay-enabled [data-plyr='airplay'] { display: inline-block; } @@ -503,7 +539,7 @@ .plyr__control svg { transition: transform 0.3s ease; } - .plyr__control[aria-expanded="true"] { + .plyr__control[aria-expanded='true'] { svg { transform: rotate(45deg); } @@ -668,7 +704,7 @@ &::before { // Arrows - content: ""; + content: ''; position: absolute; width: 0; height: 0; @@ -739,16 +775,6 @@ input[type='range'] { position: relative; z-index: 2; - - &::-webkit-slider-runnable-track { - background: transparent; - } - &::-moz-range-track { - background: transparent; - } - &::-ms-fill-upper { - background: transparent; - } } // Seek tooltip to show time @@ -760,9 +786,7 @@ display: inline-block; } -.plyr__progress--buffer, -.plyr__progress--played, -.plyr__volume--display { +.plyr__progress--buffer { position: absolute; left: 0; top: 50%; @@ -770,8 +794,7 @@ height: @plyr-range-track-height; margin: -(@plyr-range-track-height / 2) 0 0; padding: 0; - vertical-align: top; - + background: transparent; border: none; border-radius: 100px; @@ -799,31 +822,6 @@ border-radius: 100px; } } -.plyr__progress--played, -.plyr__volume--display { - z-index: 1; - color: @plyr-range-selected-bg; - background: transparent; - transition: none; - - &::-webkit-progress-value { - min-width: @plyr-range-track-height; - max-width: 99%; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - transition: none; - } - &::-moz-progress-bar { - min-width: @plyr-range-track-height; - max-width: 99%; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - transition: none; - } - &::-ms-fill { - display: none; - } -} .plyr__progress--buffer { &::-webkit-progress-value { transition: width 0.2s ease; @@ -835,18 +833,10 @@ transition: width 0.2s ease; } } -.plyr--video .plyr__progress--buffer, -.plyr--video .plyr__volume--display { - background: @plyr-video-range-track-bg; - box-shadow: 0 1px 1px fade(#000, 15%); -} .plyr--video .plyr__progress--buffer { + box-shadow: 0 1px 1px fade(#000, 15%); color: @plyr-video-progress-buffered-bg; } -.plyr--audio .plyr__progress--buffer, -.plyr--audio .plyr__volume--display { - background: @plyr-audio-range-track-bg; -} .plyr--audio .plyr__progress--buffer { color: @plyr-audio-progress-buffered-bg; } @@ -892,7 +882,7 @@ // Add a slash in before &::before { - content: "\2044"; + content: '\2044'; margin-right: @plyr-control-spacing; } } @@ -926,7 +916,7 @@ // It's not supported to change volume using JavaScript: // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html .plyr--is-ios .plyr__volume, -.plyr--is-ios [data-plyr="mute"] { +.plyr--is-ios [data-plyr='mute'] { display: none !important; } diff --git a/src/less/variables.less b/src/less/variables.less index fe6e3e39..8232c3cb 100644 --- a/src/less/variables.less +++ b/src/less/variables.less @@ -29,8 +29,8 @@ // Controls @plyr-control-icon-size: 18px; @plyr-control-spacing: 10px; -@plyr-control-padding: (@plyr-control-spacing * .7); -@plyr-video-controls-bg: #343f4a; +@plyr-control-padding: (@plyr-control-spacing * 0.7); +@plyr-video-controls-bg: #000; @plyr-video-control-color: #fff; @plyr-video-control-color-hover: #fff; @plyr-video-control-bg-hover: @plyr-color-main; @@ -55,10 +55,8 @@ // Progress @plyr-progress-loading-size: 25px; @plyr-progress-loading-bg: fade(#343f4a, 20%); -@plyr-video-progress-bg: fade(#fff, 25%); -@plyr-video-progress-buffered-bg: @plyr-video-progress-bg; -@plyr-audio-progress-bg: fade(#c6d6db, 66%); -@plyr-audio-progress-buffered-bg: @plyr-audio-progress-bg; +@plyr-video-progress-buffered-bg: fade(#fff, 25%); +@plyr-audio-progress-buffered-bg: fade(#c6d6db, 66%); // Range sliders @plyr-range-track-height: 8px; |