Browse Source

further overview refactoring

Hakim El Hattab 10 years ago
parent
commit
e29c706533
3 changed files with 77 additions and 61 deletions
  1. 5 5
      css/reveal.css
  2. 4 3
      css/reveal.scss
  3. 68 53
      js/reveal.js

+ 5 - 5
css/reveal.css

@@ -645,8 +645,8 @@ body {
   outline-offset: 10px; }
 
 .reveal.overview .slides section, .reveal.overview-deactivating .slides section {
-  -webkit-transition: none !important;
-          transition: none !important; }
+  -webkit-transition: none;
+          transition: none; }
 
 .reveal.overview .slides section .fragment {
   opacity: 1; }
@@ -677,10 +677,10 @@ body {
   visibility: visible; }
 
 .reveal.overview .backgrounds .slide-background, .reveal.overview-deactivating .backgrounds .slide-background {
-  -webkit-transition: none !important;
-          transition: none !important; }
+  -webkit-transition: none;
+          transition: none; }
 
-.reveal.overview-animated .slides {
+.reveal.overview-animated .slides, .reveal.overview-animated .slides section {
   -webkit-transition: -webkit-transform 0.4s ease;
           transition: transform 0.4s ease; }
 

+ 4 - 3
css/reveal.scss

@@ -759,7 +759,7 @@ body {
 }
 .reveal.overview .slides section,
 .reveal.overview-deactivating .slides section {
-	transition: none !important;
+	transition: none;
 }
 .reveal.overview .slides section .fragment {
 	opacity: 1;
@@ -793,10 +793,11 @@ body {
 }
 .reveal.overview .backgrounds .slide-background,
 .reveal.overview-deactivating .backgrounds .slide-background {
-	transition: none !important;
+	transition: none;
 }
 
-.reveal.overview-animated .slides {
+.reveal.overview-animated .slides,
+.reveal.overview-animated .slides section {
 	transition: transform 0.4s ease;
 }
 

+ 68 - 53
js/reveal.js

@@ -1636,9 +1636,6 @@
 	/**
 	 * Displays the overview of slides (quick nav) by
 	 * scaling down and arranging all slide elements.
-	 *
-	 * Experimental feature, might be dropped if perf
-	 * can't be improved.
 	 */
 	function activateOverview() {
 
@@ -1657,64 +1654,32 @@
 			// Don't auto-slide while in overview mode
 			cancelAutoSlide();
 
-			var margin = 70;
-			var slideWidth = config.width + margin,
-				slideHeight = config.height + margin;
-
 			// Move the backgrounds element into the slide container to
 			// that the same scaling is applied
 			dom.slides.appendChild( dom.background );
 
-			var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),
-				horizontalBackgrounds = dom.background.childNodes;
-
-			for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) {
-				var hslide = horizontalSlides[i],
-					hbackground = horizontalBackgrounds[i],
-					hoffset = config.rtl ? -slideWidth : slideWidth;
+			// Bind events so that clicking on a slide navigates to it
+			toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( hslide, h ) {
 
-				var htransform = 'translateX(' + ( i * hoffset ) + 'px)';
-
-				hslide.setAttribute( 'data-index-h', i );
-
-				// Apply CSS transform
-				transformElement( hslide, htransform );
-				transformElement( hbackground, htransform );
+				hslide.setAttribute( 'data-index-h', h );
 
 				if( hslide.classList.contains( 'stack' ) ) {
+					toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) {
 
-					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 = 'translateY(' + ( j * slideHeight ) + 'px)';
-
-						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.setAttribute( 'data-index-h', h );
+						vslide.setAttribute( 'data-index-v', v );
 						vslide.addEventListener( 'click', onOverviewSlideClicked, true );
-					}
 
+					} );
 				}
 				else {
-
-					// Navigate to this slide on click
 					hslide.addEventListener( 'click', onOverviewSlideClicked, true );
-
 				}
-			}
+
+			} );
 
 			updateSlidesVisibility();
+			layoutOverview();
 			updateOverview();
 
 			layout();
@@ -1730,17 +1695,64 @@
 
 	}
 
+	/**
+	 * Moves the slides into a grid for display in 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 ) {
+			transformElement( hslide, 'translateX(' + ( h * slideWidth ) + 'px)' );
+
+			if( hslide.classList.contains( 'stack' ) ) {
+
+				toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) {
+					transformElement( vslide, 'translateY(' + ( v * slideHeight ) + 'px)' );
+				} );
+
+			}
+		} );
+
+		// Layout slide backgrounds
+		toArray( dom.background.childNodes ).forEach( function( hbackground, h ) {
+			transformElement( hbackground, 'translateX(' + ( h * slideWidth ) + 'px)' );
+
+			toArray( hbackground.querySelectorAll( '.slide-background' ) ).forEach( function( vbackground, v ) {
+				transformElement( vbackground, 'translateY(' + ( v * slideHeight ) + 'px)' );
+			} );
+		} );
+
+	}
+
+	/**
+	 * Moves the overview viewport to the current slides.
+	 * Called each time the current slide changes.
+	 */
 	function updateOverview() {
 
-		var z = window.innerWidth < 400 ? 1000 : 2500;
 		var margin = 70;
 		var slideWidth = config.width + margin,
 			slideHeight = config.height + margin;
 
+		// Reverse in RTL mode
+		if( config.rtl ) {
+			slideWidth = -slideWidth;
+		}
+
 		slidesTransform = [
 			'translateX('+ ( -indexh * slideWidth ) +'px)',
 			'translateY('+ ( -indexv * slideHeight ) +'px)',
-			'translateZ('+ ( -z ) +'px)'
+			'translateZ('+ ( window.innerWidth < 400 ? -1000 : -2500 ) +'px)'
 		].join( ' ' );
 
 		transformSlides();
@@ -1761,10 +1773,6 @@
 			overview = false;
 
 			dom.wrapper.classList.remove( 'overview' );
-
-			// Move the background element back out
-			dom.wrapper.appendChild( dom.background );
-
 			dom.wrapper.classList.remove( 'overview-animated' );
 
 			// Temporarily add a class so that transitions can do different things
@@ -1776,6 +1784,9 @@
 				dom.wrapper.classList.remove( 'overview-deactivating' );
 			}, 1 );
 
+			// Move the background element back out
+			dom.wrapper.appendChild( dom.background );
+
 			// Clean up changes made to slides
 			toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) {
 				transformElement( slide, '' );
@@ -2145,6 +2156,10 @@
 
 		formatEmbeddedContent();
 
+		if( isOverview() ) {
+			layoutOverview();
+		}
+
 	}
 
 	/**
@@ -2326,11 +2341,11 @@
 
 			// The number of steps away from the present slide that will
 			// be visible
-			var viewDistance = isOverview() ? 7 : config.viewDistance;
+			var viewDistance = isOverview() ? 10 : config.viewDistance;
 
 			// Limit view distance on weaker devices
 			if( isMobileDevice ) {
-				viewDistance = isOverview() ? 7 : 2;
+				viewDistance = isOverview() ? 6 : 2;
 			}
 
 			// Limit view distance on weaker devices