Brion VIBBER has uploaded a new change for review. https://gerrit.wikimedia.org/r/223586
Change subject: Hi-DPI spinner using CSS animation ...................................................................... Hi-DPI spinner using CSS animation Animated SVG seems pretty flaky, but animation/transforms with CSS seem to work fine. Built an equivalent to our GIF spinner with http://loading.io/ and cleaned up the generated HTML/CSS for use here. Small and large sizes supported. Doesn't appear to explode. Keeps on using the GIFs where CSS animation not supported. Bug: T61699 Change-Id: I56c7ab5deaa9d9718a7dfc074213f7a73e6a1639 --- M resources/src/jquery/jquery.spinner.css M resources/src/jquery/jquery.spinner.js 2 files changed, 126 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/86/223586/1 diff --git a/resources/src/jquery/jquery.spinner.css b/resources/src/jquery/jquery.spinner.css index a9e06db..e6527fe 100644 --- a/resources/src/jquery/jquery.spinner.css +++ b/resources/src/jquery/jquery.spinner.css @@ -38,3 +38,93 @@ zoom: 1; *display: inline; } + + +/* Spinner animation CSS generated via loader.io and manually cleaned up*/ + +@-webkit-keyframes mw-spinner-anim { + 0% { + opacity: 1 + } + 100% { + opacity: 0 + } +} +@keyframes mw-spinner-anim { + 0% { + opacity: 1 + } + 100% { + opacity: 0 + } +} + +.mw-spinner-small.mw-spinner-anim { + background: none; + -webkit-transform: scale(0.1); + transform: scale(0.1); +} +.mw-spinner-large.mw-spinner-anim { + background: none; + -webkit-transform: scale(0.16); + transform: scale(0.16); +} + +.mw-spinner-anim-inner { + position: relative; + background:none; + width:200px; + height:200px; +} +.mw-spinner-anim-inner > div { + -webkit-animation: mw-spinner-anim 1s linear infinite; + animation: mw-spinner-anim 1s linear infinite; +} +.mw-spinner-anim-inner > div:nth-of-type(1){ + -webkit-animation-delay: -0.5s; + animation-delay: -0.5s; +} +.mw-spinner-anim-inner > div:nth-of-type(2){ + -webkit-animation-delay: -0.4166666666666667s; + animation-delay: -0.4166666666666667s; +} +.mw-spinner-anim-inner > div:nth-of-type(3){ + -webkit-animation-delay: -0.33333333333333337s; + animation-delay: -0.33333333333333337s; +} +.mw-spinner-anim-inner > div:nth-of-type(4){ + -webkit-animation-delay: -0.25s; + animation-delay: -0.25s; +} +.mw-spinner-anim-inner > div:nth-of-type(5){ + -webkit-animation-delay: -0.16666666666666669s; + animation-delay: -0.16666666666666669s; +} +.mw-spinner-anim-inner > div:nth-of-type(6){ + -webkit-animation-delay: -0.08333333333333331s; + animation-delay: -0.08333333333333331s; +} +.mw-spinner-anim-inner > div:nth-of-type(7){ + -webkit-animation-delay: 0s; + animation-delay: 0s; +} +.mw-spinner-anim-inner > div:nth-of-type(8){ + -webkit-animation-delay: 0.08333333333333337s; + animation-delay: 0.08333333333333337s; +} +.mw-spinner-anim-inner > div:nth-of-type(9){ + -webkit-animation-delay: 0.16666666666666663s; + animation-delay: 0.16666666666666663s; +} +.mw-spinner-anim-inner > div:nth-of-type(10){ + -webkit-animation-delay: 0.25s; + animation-delay: 0.25s; +} +.mw-spinner-anim-inner > div:nth-of-type(11){ + -webkit-animation-delay: 0.33333333333333337s; + animation-delay: 0.33333333333333337s; +} +.mw-spinner-anim-inner > div:nth-of-type(12){ + -webkit-animation-delay: 0.41666666666666663s; + animation-delay: 0.41666666666666663s; +} diff --git a/resources/src/jquery/jquery.spinner.js b/resources/src/jquery/jquery.spinner.js index 361d3e0..063c33d 100644 --- a/resources/src/jquery/jquery.spinner.js +++ b/resources/src/jquery/jquery.spinner.js @@ -30,6 +30,7 @@ * - .mw-spinner for every spinner * - .mw-spinner-small / .mw-spinner-large for size * - .mw-spinner-block / .mw-spinner-inline for display types + * - .mw-spinner-svg when we're using animated SVG * * Example: * @@ -75,6 +76,13 @@ $spinner.addClass( opts.size === 'large' ? 'mw-spinner-large' : 'mw-spinner-small' ); $spinner.addClass( opts.type === 'block' ? 'mw-spinner-block' : 'mw-spinner-inline' ); + // HiDPI-friendly CSS animation based on sample from loader.io + if (supportsAnimation()) { + $spinner + .addClass('mw-spinner-anim') + .append(createAnimation()); + } + return $spinner; }, @@ -104,6 +112,34 @@ return this.after( $.createSpinner( opts ) ); }; + function supportsAnimation() { + var $div = $('<div>'), + div = $div[0], + style = div.style; + return (typeof style.animation === 'string') + || (typeof style.webkitAnimation === 'string'); + } + + function createAnimation() { + var $anim = $('<div>').addClass('mw-spinner-anim-inner'); + for (var i = 0; i < 12; i++) { + var deg = i * 30, + transform = 'rotate(' + deg + 'deg) translate(0,-60px)'; + $('<div>') + .css('top', '80px') + .css('left', '93px') + .css('width', '14px') + .css('height', '40px') + .css('background', 'black') + .css('-webkit-transform', transform) + .css('transform', transform) + .css('border-radius', '10px') + .css('position', 'absolute') + .appendTo($anim); + } + return $anim; + } + /** * @class jQuery * @mixins jQuery.plugin.spinner -- To view, visit https://gerrit.wikimedia.org/r/223586 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I56c7ab5deaa9d9718a7dfc074213f7a73e6a1639 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Brion VIBBER <br...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits