diff --git a/modules/controller.js b/modules/controller.js
index 44aeb6a02..b8931a06c 100644
--- a/modules/controller.js
+++ b/modules/controller.js
@@ -2,6 +2,7 @@
var
$pageContainer,
+ $overlay,
Parser = require( './Parser.js' ),
ThreadItem = require( './ThreadItem.js' ),
logger = require( './logger.js' ),
@@ -20,26 +21,42 @@ function getApi() {
function highlight( comment ) {
var padding = 5,
- // $container must be position:relative/absolute
- $container = OO.ui.getDefaultOverlay(),
- containerRect = $container[ 0 ].getBoundingClientRect(),
- rect = RangeFix.getBoundingClientRect( comment.getNativeRange() ),
+ overlayRect, rect,
$highlight = $( '
' ).addClass( 'dt-init-highlight' );
+ if ( !$overlay ) {
+ // $overlay must be position:relative/absolute
+ $overlay = $( '
' ).addClass( 'oo-ui-defaultOverlay' ).appendTo( 'body' );
+ }
+
+ overlayRect = $overlay[ 0 ].getBoundingClientRect();
+ rect = RangeFix.getBoundingClientRect( comment.getNativeRange() );
$highlight.css( {
- top: rect.top - containerRect.top - padding,
- left: rect.left - containerRect.left - padding,
+ top: rect.top - overlayRect.top - padding,
+ left: rect.left - overlayRect.left - padding,
width: rect.width + ( padding * 2 ),
height: rect.height + ( padding * 2 )
} );
- $container.prepend( $highlight );
+ $overlay.prepend( $highlight );
+ // Pause for 500ms
+ // Fade in for 100ms
+ // Show for 1000ms
+ // Fade out for 500ms
+ // (animation durations are defined in CSS)
OO.ui.Element.static.scrollIntoView( $highlight[ 0 ], { padding: { top: 10, bottom: 10 } } ).then( function () {
setTimeout( function () {
- $highlight.addClass( 'dt-init-highlight-fade' );
+ // Toggle the 'dt-init-highlight-overlay' class only when needed, because using mix-blend-mode
+ // affects the text rendering of the whole page, disabling subpixel antialiasing on Windows
+ $overlay.addClass( 'dt-init-highlight-overlay' );
+ $highlight.addClass( 'dt-init-highlight-fadein' );
setTimeout( function () {
- $highlight.remove();
- }, 500 );
+ $highlight.addClass( 'dt-init-highlight-fadeout' );
+ setTimeout( function () {
+ $highlight.remove();
+ $overlay.removeClass( 'dt-init-highlight-overlay' );
+ }, 500 );
+ }, 1000 + 100 );
}, 500 );
} );
}
diff --git a/modules/dt.init.less b/modules/dt.init.less
index 81c5ed9dc..d17ad1f4d 100644
--- a/modules/dt.init.less
+++ b/modules/dt.init.less
@@ -44,13 +44,31 @@
}
.dt-init-highlight {
- background: rgba( 255, 204, 51, 0.5 );
+ // Support: IE11
+ // On supporting browsers, we instead use non-transparent color with mix-blend-mode.
+ // Identical to #ffe29e on white background.
+ background-color: rgba( 255, 198, 60, 0.5 );
position: absolute;
pointer-events: none;
- opacity: 1;
- transition: opacity 500ms;
-}
-
-.dt-init-highlight-fade {
opacity: 0;
}
+
+@supports ( mix-blend-mode: multiply ) {
+ .dt-init-highlight-overlay {
+ mix-blend-mode: multiply;
+ }
+
+ .dt-init-highlight {
+ background-color: #ffe29e;
+ }
+}
+
+.dt-init-highlight-fadein {
+ opacity: 1;
+ transition: opacity 100ms;
+}
+
+.dt-init-highlight-fadeout {
+ opacity: 0;
+ transition: opacity 500ms ease-out;
+}