Merge pull request #1119 from hakimel/feature/new-overview
Refactored overview mode
This commit is contained in:
commit
03400478bd
109
css/reveal.css
109
css/reveal.css
@ -624,63 +624,6 @@ body {
|
|||||||
-webkit-transition: none;
|
-webkit-transition: none;
|
||||||
transition: none; }
|
transition: none; }
|
||||||
|
|
||||||
/*********************************************
|
|
||||||
* OVERVIEW
|
|
||||||
*********************************************/
|
|
||||||
.reveal.overview {
|
|
||||||
-webkit-perspective-origin: 50% 50%;
|
|
||||||
perspective-origin: 50% 50%;
|
|
||||||
-webkit-perspective: 700px;
|
|
||||||
perspective: 700px; }
|
|
||||||
|
|
||||||
.reveal.overview .slides section {
|
|
||||||
height: 700px;
|
|
||||||
overflow: hidden;
|
|
||||||
opacity: 1 !important;
|
|
||||||
visibility: visible !important;
|
|
||||||
cursor: pointer;
|
|
||||||
background: rgba(0, 0, 0, 0.1);
|
|
||||||
-moz-box-sizing: border-box;
|
|
||||||
box-sizing: border-box; }
|
|
||||||
|
|
||||||
.reveal.overview .slides section, .reveal.overview-deactivating .slides section {
|
|
||||||
-webkit-transition: none !important;
|
|
||||||
transition: none !important; }
|
|
||||||
|
|
||||||
.reveal.overview .slides section .fragment {
|
|
||||||
opacity: 1; }
|
|
||||||
|
|
||||||
.reveal.overview .slides section:after, .reveal.overview .slides section:before {
|
|
||||||
display: none !important; }
|
|
||||||
|
|
||||||
.reveal.overview .slides section > section {
|
|
||||||
opacity: 1;
|
|
||||||
cursor: pointer; }
|
|
||||||
|
|
||||||
.reveal.overview .slides section:hover {
|
|
||||||
background: rgba(0, 0, 0, 0.3); }
|
|
||||||
|
|
||||||
.reveal.overview .slides section.present {
|
|
||||||
background: rgba(0, 0, 0, 0.3); }
|
|
||||||
|
|
||||||
.reveal.overview .slides > section.stack {
|
|
||||||
padding: 0;
|
|
||||||
top: 0 !important;
|
|
||||||
background: none;
|
|
||||||
overflow: visible; }
|
|
||||||
|
|
||||||
.reveal.overview .backgrounds {
|
|
||||||
-webkit-perspective: inherit;
|
|
||||||
perspective: inherit; }
|
|
||||||
|
|
||||||
.reveal.overview .backgrounds .slide-background {
|
|
||||||
opacity: 1;
|
|
||||||
visibility: visible; }
|
|
||||||
|
|
||||||
.reveal.overview .backgrounds .slide-background, .reveal.overview-deactivating .backgrounds .slide-background {
|
|
||||||
-webkit-transition: none !important;
|
|
||||||
transition: none !important; }
|
|
||||||
|
|
||||||
/*********************************************
|
/*********************************************
|
||||||
* PAUSED MODE
|
* PAUSED MODE
|
||||||
*********************************************/
|
*********************************************/
|
||||||
@ -901,6 +844,58 @@ body {
|
|||||||
-webkit-transition-duration: 1200ms;
|
-webkit-transition-duration: 1200ms;
|
||||||
transition-duration: 1200ms; }
|
transition-duration: 1200ms; }
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
* OVERVIEW
|
||||||
|
*********************************************/
|
||||||
|
.reveal.overview {
|
||||||
|
-webkit-perspective-origin: 50% 50%;
|
||||||
|
perspective-origin: 50% 50%;
|
||||||
|
-webkit-perspective: 700px;
|
||||||
|
perspective: 700px; }
|
||||||
|
.reveal.overview .slides section {
|
||||||
|
height: 700px;
|
||||||
|
opacity: 1 !important;
|
||||||
|
overflow: hidden;
|
||||||
|
visibility: visible !important;
|
||||||
|
cursor: pointer;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.reveal.overview .slides section:hover, .reveal.overview .slides section.present {
|
||||||
|
outline: 10px solid rgba(150, 150, 150, 0.4);
|
||||||
|
outline-offset: 10px; }
|
||||||
|
.reveal.overview .slides section .fragment {
|
||||||
|
opacity: 1;
|
||||||
|
-webkit-transition: none;
|
||||||
|
transition: none; }
|
||||||
|
.reveal.overview .slides section:after, .reveal.overview .slides section:before {
|
||||||
|
display: none !important; }
|
||||||
|
.reveal.overview .slides > section.stack {
|
||||||
|
padding: 0;
|
||||||
|
top: 0 !important;
|
||||||
|
background: none;
|
||||||
|
outline: none;
|
||||||
|
overflow: visible; }
|
||||||
|
.reveal.overview .backgrounds {
|
||||||
|
-webkit-perspective: inherit;
|
||||||
|
perspective: inherit; }
|
||||||
|
.reveal.overview .backgrounds .slide-background {
|
||||||
|
opacity: 1;
|
||||||
|
visibility: visible;
|
||||||
|
outline: 10px solid rgba(150, 150, 150, 0.1);
|
||||||
|
outline-offset: 10px; }
|
||||||
|
|
||||||
|
.reveal.overview .slides section, .reveal.overview-deactivating .slides section {
|
||||||
|
-webkit-transition: none;
|
||||||
|
transition: none; }
|
||||||
|
|
||||||
|
.reveal.overview .backgrounds .slide-background, .reveal.overview-deactivating .backgrounds .slide-background {
|
||||||
|
-webkit-transition: none;
|
||||||
|
transition: none; }
|
||||||
|
|
||||||
|
.reveal.overview-animated .slides, .reveal.overview-animated .slides section, .reveal.overview-animated .backgrounds .slide-background {
|
||||||
|
-webkit-transition: -webkit-transform 0.4s ease;
|
||||||
|
transition: transform 0.4s ease; }
|
||||||
|
|
||||||
/*********************************************
|
/*********************************************
|
||||||
* RTL SUPPORT
|
* RTL SUPPORT
|
||||||
*********************************************/
|
*********************************************/
|
||||||
|
128
css/reveal.scss
128
css/reveal.scss
@ -739,64 +739,6 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*********************************************
|
|
||||||
* OVERVIEW
|
|
||||||
*********************************************/
|
|
||||||
|
|
||||||
.reveal.overview {
|
|
||||||
perspective-origin: 50% 50%;
|
|
||||||
perspective: 700px;
|
|
||||||
}
|
|
||||||
.reveal.overview .slides section {
|
|
||||||
height: 700px;
|
|
||||||
overflow: hidden;
|
|
||||||
opacity: 1 !important;
|
|
||||||
visibility: visible !important;
|
|
||||||
cursor: pointer;
|
|
||||||
background: rgba(0,0,0,0.1);
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.reveal.overview .slides section,
|
|
||||||
.reveal.overview-deactivating .slides section {
|
|
||||||
transition: none !important;
|
|
||||||
}
|
|
||||||
.reveal.overview .slides section .fragment {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
.reveal.overview .slides section:after,
|
|
||||||
.reveal.overview .slides section:before {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
.reveal.overview .slides section>section {
|
|
||||||
opacity: 1;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.reveal.overview .slides section:hover {
|
|
||||||
background: rgba(0,0,0,0.3);
|
|
||||||
}
|
|
||||||
.reveal.overview .slides section.present {
|
|
||||||
background: rgba(0,0,0,0.3);
|
|
||||||
}
|
|
||||||
.reveal.overview .slides>section.stack {
|
|
||||||
padding: 0;
|
|
||||||
top: 0 !important;
|
|
||||||
background: none;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.reveal.overview .backgrounds {
|
|
||||||
perspective: inherit;
|
|
||||||
}
|
|
||||||
.reveal.overview .backgrounds .slide-background {
|
|
||||||
opacity: 1;
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
.reveal.overview .backgrounds .slide-background,
|
|
||||||
.reveal.overview-deactivating .backgrounds .slide-background {
|
|
||||||
transition: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************
|
/*********************************************
|
||||||
* PAUSED MODE
|
* PAUSED MODE
|
||||||
*********************************************/
|
*********************************************/
|
||||||
@ -1037,6 +979,76 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
* OVERVIEW
|
||||||
|
*********************************************/
|
||||||
|
|
||||||
|
.reveal.overview {
|
||||||
|
perspective-origin: 50% 50%;
|
||||||
|
perspective: 700px;
|
||||||
|
|
||||||
|
.slides section {
|
||||||
|
height: 700px;
|
||||||
|
opacity: 1 !important;
|
||||||
|
overflow: hidden;
|
||||||
|
visibility: visible !important;
|
||||||
|
cursor: pointer;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.slides section:hover,
|
||||||
|
.slides section.present {
|
||||||
|
outline: 10px solid rgba(150,150,150,0.4);
|
||||||
|
outline-offset: 10px;
|
||||||
|
}
|
||||||
|
.slides section .fragment {
|
||||||
|
opacity: 1;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
.slides section:after,
|
||||||
|
.slides section:before {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
.slides>section.stack {
|
||||||
|
padding: 0;
|
||||||
|
top: 0 !important;
|
||||||
|
background: none;
|
||||||
|
outline: none;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backgrounds {
|
||||||
|
perspective: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backgrounds .slide-background {
|
||||||
|
opacity: 1;
|
||||||
|
visibility: visible;
|
||||||
|
|
||||||
|
// This can't be applied to the slide itself in Safari
|
||||||
|
outline: 10px solid rgba(150,150,150,0.1);
|
||||||
|
outline-offset: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable transitions transitions while we're activating
|
||||||
|
// or deactivating the overview mode.
|
||||||
|
.reveal.overview .slides section,
|
||||||
|
.reveal.overview-deactivating .slides section {
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reveal.overview .backgrounds .slide-background,
|
||||||
|
.reveal.overview-deactivating .backgrounds .slide-background {
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reveal.overview-animated .slides,
|
||||||
|
.reveal.overview-animated .slides section,
|
||||||
|
.reveal.overview-animated .backgrounds .slide-background {
|
||||||
|
transition: transform 0.4s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*********************************************
|
/*********************************************
|
||||||
* RTL SUPPORT
|
* RTL SUPPORT
|
||||||
*********************************************/
|
*********************************************/
|
||||||
|
217
js/reveal.js
217
js/reveal.js
@ -147,6 +147,9 @@
|
|||||||
// Flags if reveal.js is loaded (has dispatched the 'ready' event)
|
// Flags if reveal.js is loaded (has dispatched the 'ready' event)
|
||||||
loaded = false,
|
loaded = false,
|
||||||
|
|
||||||
|
// Flags if the overview mode is currently active
|
||||||
|
overview = false,
|
||||||
|
|
||||||
// The horizontal and vertical index of the currently active slide
|
// The horizontal and vertical index of the currently active slide
|
||||||
indexh,
|
indexh,
|
||||||
indexv,
|
indexv,
|
||||||
@ -165,8 +168,9 @@
|
|||||||
// The current scale of the presentation (see width/height config)
|
// The current scale of the presentation (see width/height config)
|
||||||
scale = 1,
|
scale = 1,
|
||||||
|
|
||||||
// The current z position of the presentation container
|
// CSS transform that is currently applied to the slides container,
|
||||||
z = 0,
|
// split into two groups
|
||||||
|
slidesTransform = { layout: '', overview: '' },
|
||||||
|
|
||||||
// Cached references to DOM elements
|
// Cached references to DOM elements
|
||||||
dom = {},
|
dom = {},
|
||||||
@ -296,7 +300,11 @@
|
|||||||
|
|
||||||
features.touch = !!( 'ontouchstart' in window );
|
features.touch = !!( 'ontouchstart' in window );
|
||||||
|
|
||||||
isMobileDevice = navigator.userAgent.match( /(iphone|ipod|ipad|android)/gi );
|
// Transitions in the overview are disabled in desktop and
|
||||||
|
// mobile Safari due to lag
|
||||||
|
features.overviewTransitions = !/Version\/[\d\.]+.*Safari/.test( navigator.userAgent );
|
||||||
|
|
||||||
|
isMobileDevice = /(iphone|ipod|ipad|android)/gi.test( navigator.userAgent );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1058,6 +1066,27 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies CSS transforms to the slides container. The container
|
||||||
|
* is transformed from two separate sources: layout and the overview
|
||||||
|
* mode.
|
||||||
|
*/
|
||||||
|
function transformSlides( transforms ) {
|
||||||
|
|
||||||
|
// Pick up new transforms from arguments
|
||||||
|
if( typeof transforms.layout === 'string' ) slidesTransform.layout = transforms.layout;
|
||||||
|
if( typeof transforms.overview === 'string' ) slidesTransform.overview = transforms.overview;
|
||||||
|
|
||||||
|
// Apply the transforms to the slides container
|
||||||
|
if( slidesTransform.layout ) {
|
||||||
|
transformElement( dom.slides, slidesTransform.layout + ' ' + slidesTransform.overview );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
transformElement( dom.slides, slidesTransform.overview );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects the given CSS styles into the DOM.
|
* Injects the given CSS styles into the DOM.
|
||||||
*/
|
*/
|
||||||
@ -1446,7 +1475,6 @@
|
|||||||
var size = getComputedSlideSize();
|
var size = getComputedSlideSize();
|
||||||
|
|
||||||
var slidePadding = 20; // TODO Dig this out of DOM
|
var slidePadding = 20; // TODO Dig this out of DOM
|
||||||
var zTransform = z !== 0 ? 'translateZ(-'+ z +'px)' : '';
|
|
||||||
|
|
||||||
// Layout the contents of the slides
|
// Layout the contents of the slides
|
||||||
layoutSlideContents( config.width, config.height, slidePadding );
|
layoutSlideContents( config.width, config.height, slidePadding );
|
||||||
@ -1468,13 +1496,13 @@
|
|||||||
dom.slides.style.top = '';
|
dom.slides.style.top = '';
|
||||||
dom.slides.style.bottom = '';
|
dom.slides.style.bottom = '';
|
||||||
dom.slides.style.right = '';
|
dom.slides.style.right = '';
|
||||||
transformElement( dom.slides, zTransform );
|
transformSlides( { layout: '' } );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Prefer zooming in desktop Chrome so that content remains crisp
|
// Prefer zooming in desktop Chrome so that content remains crisp
|
||||||
if( !isMobileDevice && /chrome/i.test( navigator.userAgent ) && typeof dom.slides.style.zoom !== 'undefined' ) {
|
if( !isMobileDevice && /chrome/i.test( navigator.userAgent ) && typeof dom.slides.style.zoom !== 'undefined' ) {
|
||||||
dom.slides.style.zoom = scale;
|
dom.slides.style.zoom = scale;
|
||||||
transformElement( dom.slides, zTransform );
|
transformSlides( { layout: '' } );
|
||||||
}
|
}
|
||||||
// Apply scale transform as a fallback
|
// Apply scale transform as a fallback
|
||||||
else {
|
else {
|
||||||
@ -1482,7 +1510,7 @@
|
|||||||
dom.slides.style.top = '50%';
|
dom.slides.style.top = '50%';
|
||||||
dom.slides.style.bottom = 'auto';
|
dom.slides.style.bottom = 'auto';
|
||||||
dom.slides.style.right = 'auto';
|
dom.slides.style.right = 'auto';
|
||||||
transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +') ' + zTransform );
|
transformSlides( { layout: 'translate(-50%, -50%) scale('+ scale +')' } );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1624,98 +1652,122 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the overview of slides (quick nav) by
|
* Displays the overview of slides (quick nav) by scaling
|
||||||
* scaling down and arranging all slide elements.
|
* down and arranging all slide elements.
|
||||||
*
|
|
||||||
* Experimental feature, might be dropped if perf
|
|
||||||
* can't be improved.
|
|
||||||
*/
|
*/
|
||||||
function activateOverview() {
|
function activateOverview() {
|
||||||
|
|
||||||
// Only proceed if enabled in config
|
// Only proceed if enabled in config
|
||||||
if( config.overview ) {
|
if( config.overview && !isOverview() ) {
|
||||||
|
|
||||||
// Don't auto-slide while in overview mode
|
overview = true;
|
||||||
cancelAutoSlide();
|
|
||||||
|
|
||||||
var wasActive = dom.wrapper.classList.contains( 'overview' );
|
|
||||||
|
|
||||||
// Set the depth of the presentation. This determinse how far we
|
|
||||||
// zoom out and varies based on display size. It gets applied at
|
|
||||||
// the layout step.
|
|
||||||
z = window.innerWidth < 400 ? 1000 : 2500;
|
|
||||||
|
|
||||||
dom.wrapper.classList.add( 'overview' );
|
dom.wrapper.classList.add( 'overview' );
|
||||||
dom.wrapper.classList.remove( 'overview-deactivating' );
|
dom.wrapper.classList.remove( 'overview-deactivating' );
|
||||||
|
|
||||||
|
if( features.overviewTransitions ) {
|
||||||
|
setTimeout( function() {
|
||||||
|
dom.wrapper.classList.add( 'overview-animated' );
|
||||||
|
}, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't auto-slide while in overview mode
|
||||||
|
cancelAutoSlide();
|
||||||
|
|
||||||
// Move the backgrounds element into the slide container to
|
// Move the backgrounds element into the slide container to
|
||||||
// that the same scaling is applied
|
// that the same scaling is applied
|
||||||
dom.slides.appendChild( dom.background );
|
dom.slides.appendChild( dom.background );
|
||||||
|
|
||||||
var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),
|
// Clicking on an overview slide navigates to it
|
||||||
horizontalBackgrounds = dom.background.childNodes;
|
toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) {
|
||||||
|
if( !slide.classList.contains( 'stack' ) ) {
|
||||||
for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) {
|
slide.addEventListener( 'click', onOverviewSlideClicked, true );
|
||||||
var hslide = horizontalSlides[i],
|
|
||||||
hbackground = horizontalBackgrounds[i],
|
|
||||||
hoffset = config.rtl ? -105 : 105;
|
|
||||||
|
|
||||||
var htransform = 'translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)';
|
|
||||||
|
|
||||||
hslide.setAttribute( 'data-index-h', i );
|
|
||||||
|
|
||||||
// Apply CSS transform
|
|
||||||
transformElement( hslide, htransform );
|
|
||||||
transformElement( hbackground, htransform );
|
|
||||||
|
|
||||||
if( hslide.classList.contains( 'stack' ) ) {
|
|
||||||
|
|
||||||
var verticalSlides = hslide.querySelectorAll( 'section' ),
|
|
||||||
verticalBackgrounds = hbackground.querySelectorAll( '.slide-background' );
|
|
||||||
|
|
||||||
for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
|
|
||||||
var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide );
|
|
||||||
|
|
||||||
var vslide = verticalSlides[j],
|
|
||||||
vbackground = verticalBackgrounds[j];
|
|
||||||
|
|
||||||
var vtransform = 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)';
|
|
||||||
|
|
||||||
vslide.setAttribute( 'data-index-h', i );
|
|
||||||
vslide.setAttribute( 'data-index-v', j );
|
|
||||||
|
|
||||||
// Apply CSS transform
|
|
||||||
transformElement( vslide, vtransform );
|
|
||||||
transformElement( vbackground, vtransform );
|
|
||||||
|
|
||||||
// Navigate to this slide on click
|
|
||||||
vslide.addEventListener( 'click', onOverviewSlideClicked, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
// Navigate to this slide on click
|
|
||||||
hslide.addEventListener( 'click', onOverviewSlideClicked, true );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
updateSlidesVisibility();
|
updateSlidesVisibility();
|
||||||
|
layoutOverview();
|
||||||
|
updateOverview();
|
||||||
|
|
||||||
layout();
|
layout();
|
||||||
|
|
||||||
if( !wasActive ) {
|
|
||||||
// Notify observers of the overview showing
|
// Notify observers of the overview showing
|
||||||
dispatchEvent( 'overviewshown', {
|
dispatchEvent( 'overviewshown', {
|
||||||
'indexh': indexh,
|
'indexh': indexh,
|
||||||
'indexv': indexv,
|
'indexv': indexv,
|
||||||
'currentSlide': currentSlide
|
'currentSlide': currentSlide
|
||||||
} );
|
} );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses CSS transforms to position all slides in a grid for
|
||||||
|
* display inside of the overview mode.
|
||||||
|
*/
|
||||||
|
function layoutOverview() {
|
||||||
|
|
||||||
|
var margin = 70;
|
||||||
|
var slideWidth = config.width + margin,
|
||||||
|
slideHeight = config.height + margin;
|
||||||
|
|
||||||
|
// Reverse in RTL mode
|
||||||
|
if( config.rtl ) {
|
||||||
|
slideWidth = -slideWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Layout slides
|
||||||
|
toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( hslide, h ) {
|
||||||
|
hslide.setAttribute( 'data-index-h', h );
|
||||||
|
transformElement( hslide, 'translate3d(' + ( h * slideWidth ) + 'px, 0, 0)' );
|
||||||
|
|
||||||
|
if( hslide.classList.contains( 'stack' ) ) {
|
||||||
|
|
||||||
|
toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) {
|
||||||
|
vslide.setAttribute( 'data-index-h', h );
|
||||||
|
vslide.setAttribute( 'data-index-v', v );
|
||||||
|
|
||||||
|
transformElement( vslide, 'translate3d(0, ' + ( v * slideHeight ) + 'px, 0)' );
|
||||||
|
} );
|
||||||
|
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Layout slide backgrounds
|
||||||
|
toArray( dom.background.childNodes ).forEach( function( hbackground, h ) {
|
||||||
|
transformElement( hbackground, 'translate3d(' + ( h * slideWidth ) + 'px, 0, 0)' );
|
||||||
|
|
||||||
|
toArray( hbackground.querySelectorAll( '.slide-background' ) ).forEach( function( vbackground, v ) {
|
||||||
|
transformElement( vbackground, 'translate3d(0, ' + ( v * slideHeight ) + 'px, 0)' );
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the overview viewport to the current slides.
|
||||||
|
* Called each time the current slide changes.
|
||||||
|
*/
|
||||||
|
function updateOverview() {
|
||||||
|
|
||||||
|
var margin = 70;
|
||||||
|
var slideWidth = config.width + margin,
|
||||||
|
slideHeight = config.height + margin;
|
||||||
|
|
||||||
|
// Reverse in RTL mode
|
||||||
|
if( config.rtl ) {
|
||||||
|
slideWidth = -slideWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
transformSlides( {
|
||||||
|
overview: [
|
||||||
|
'translateX('+ ( -indexh * slideWidth ) +'px)',
|
||||||
|
'translateY('+ ( -indexv * slideHeight ) +'px)',
|
||||||
|
'translateZ('+ ( window.innerWidth < 400 ? -1000 : -2500 ) +'px)'
|
||||||
|
].join( ' ' )
|
||||||
|
} );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1727,10 +1779,10 @@
|
|||||||
// Only proceed if enabled in config
|
// Only proceed if enabled in config
|
||||||
if( config.overview ) {
|
if( config.overview ) {
|
||||||
|
|
||||||
dom.wrapper.classList.remove( 'overview' );
|
overview = false;
|
||||||
|
|
||||||
// Move the background element back out
|
dom.wrapper.classList.remove( 'overview' );
|
||||||
dom.wrapper.appendChild( dom.background );
|
dom.wrapper.classList.remove( 'overview-animated' );
|
||||||
|
|
||||||
// Temporarily add a class so that transitions can do different things
|
// Temporarily add a class so that transitions can do different things
|
||||||
// depending on whether they are exiting/entering overview, or just
|
// depending on whether they are exiting/entering overview, or just
|
||||||
@ -1741,6 +1793,9 @@
|
|||||||
dom.wrapper.classList.remove( 'overview-deactivating' );
|
dom.wrapper.classList.remove( 'overview-deactivating' );
|
||||||
}, 1 );
|
}, 1 );
|
||||||
|
|
||||||
|
// Move the background element back out
|
||||||
|
dom.wrapper.appendChild( dom.background );
|
||||||
|
|
||||||
// Clean up changes made to slides
|
// Clean up changes made to slides
|
||||||
toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) {
|
toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) {
|
||||||
transformElement( slide, '' );
|
transformElement( slide, '' );
|
||||||
@ -1753,8 +1808,12 @@
|
|||||||
transformElement( background, '' );
|
transformElement( background, '' );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
transformSlides( { overview: '' } );
|
||||||
|
|
||||||
slide( indexh, indexv );
|
slide( indexh, indexv );
|
||||||
|
|
||||||
|
layout();
|
||||||
|
|
||||||
cueAutoSlide();
|
cueAutoSlide();
|
||||||
|
|
||||||
// Notify observers of the overview hiding
|
// Notify observers of the overview hiding
|
||||||
@ -1793,7 +1852,7 @@
|
|||||||
*/
|
*/
|
||||||
function isOverview() {
|
function isOverview() {
|
||||||
|
|
||||||
return dom.wrapper.classList.contains( 'overview' );
|
return overview;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1943,7 +2002,7 @@
|
|||||||
|
|
||||||
// If no vertical index is specified and the upcoming slide is a
|
// If no vertical index is specified and the upcoming slide is a
|
||||||
// stack, resume at its previous vertical index
|
// stack, resume at its previous vertical index
|
||||||
if( v === undefined ) {
|
if( v === undefined && !isOverview() ) {
|
||||||
v = getPreviousVerticalIndex( horizontalSlides[ h ] );
|
v = getPreviousVerticalIndex( horizontalSlides[ h ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1993,9 +2052,9 @@
|
|||||||
document.documentElement.classList.remove( stateBefore.pop() );
|
document.documentElement.classList.remove( stateBefore.pop() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the overview is active, re-activate it to update positions
|
// Update the overview if it's currently active
|
||||||
if( isOverview() ) {
|
if( isOverview() ) {
|
||||||
activateOverview();
|
updateOverview();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the current horizontal slide and any possible vertical slides
|
// Find the current horizontal slide and any possible vertical slides
|
||||||
@ -2108,6 +2167,10 @@
|
|||||||
|
|
||||||
formatEmbeddedContent();
|
formatEmbeddedContent();
|
||||||
|
|
||||||
|
if( isOverview() ) {
|
||||||
|
layoutOverview();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user