much improved distance measuring logic, improves performance on mobile and fixes some crashes

This commit is contained in:
Hakim El Hattab 2013-08-10 12:52:28 -04:00
parent fc43e905d5
commit 7b5e537157
2 changed files with 74 additions and 14 deletions

View file

@ -14,6 +14,8 @@ var Reveal = (function(){
VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section',
HOME_SLIDE_SELECTOR = '.reveal .slides>section:first-child',
IS_MOBILE = navigator.userAgent.match( /(iphone|ipod|android)/gi ),
// Configurations defaults, can be overridden at initialization time
config = {
@ -1029,7 +1031,6 @@ var Reveal = (function(){
htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)';
hslide.setAttribute( 'data-index-h', i );
hslide.style.display = 'block';
hslide.style.WebkitTransform = htransform;
hslide.style.MozTransform = htransform;
hslide.style.msTransform = htransform;
@ -1048,7 +1049,6 @@ var Reveal = (function(){
vslide.setAttribute( 'data-index-h', i );
vslide.setAttribute( 'data-index-v', j );
vslide.style.display = 'block';
vslide.style.WebkitTransform = vtransform;
vslide.style.MozTransform = vtransform;
vslide.style.msTransform = vtransform;
@ -1068,6 +1068,8 @@ var Reveal = (function(){
}
}
updateSlidesVisibility();
layout();
if( !wasActive ) {
@ -1309,6 +1311,9 @@ var Reveal = (function(){
indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );
indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );
// Update the visibility of slides now that the indices have changed
updateSlidesVisibility();
layout();
// Apply the new state
@ -1480,16 +1485,6 @@ var Reveal = (function(){
for( var i = 0; i < slidesLength; i++ ) {
var element = slides[i];
// Optimization; hide all slides that are three or more steps
// away from the present slide
if( isOverview() === false ) {
// The distance loops so that it measures 1 between the first
// and last slides
var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0;
element.style.display = distance > 3 ? 'none' : 'block';
}
var reverse = config.rtl && !isVerticalSlide( element );
element.classList.remove( 'past' );
@ -1555,6 +1550,71 @@ var Reveal = (function(){
}
/**
* Optimization method; hide all slides that are far away
* from the present slide.
*/
function updateSlidesVisibility() {
// Select all slides and convert the NodeList result to
// an array
var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ),
horizontalSlidesLength = horizontalSlides.length,
distance;
if( horizontalSlidesLength ) {
// The number of steps away from the present slide that will
// be visible
var threshold = 3;
// Heavily limited on weaker devices
if( IS_MOBILE ) {
threshold = 1;
}
if( isOverview() ) {
threshold = 6;
}
for( var x = 0; x < horizontalSlidesLength; x++ ) {
var horizontalSlide = horizontalSlides[x];
var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ),
verticalSlidesLength = verticalSlides.length;
if( verticalSlidesLength ) {
// Always show the vertical stack itself, even if its child
// slides are invisible
horizontalSlide.style.display = 'block';
for( var y = 0; y < verticalSlidesLength; y++ ) {
var verticalSlide = verticalSlides[y];
var dx = x - indexh,
dy = y - indexv;
distance = Math.sqrt( dx*dx + dy*dy );
verticalSlide.style.display = distance > threshold ? 'none' : 'block';
}
}
else {
// Loops so that it measures 1 between the first and last slides
distance = Math.abs( ( indexh - x ) % ( horizontalSlidesLength - threshold ) ) || 0;
horizontalSlide.style.display = distance > threshold ? 'none' : 'block';
}
}
}
}
/**
* Updates the progress bar to reflect the current slide.
*/

4
js/reveal.min.js vendored

File diff suppressed because one or more lines are too long