// // Based on zoom.js plugin of reveal.js // modified to correctly handle reveal's scaling // to react on dblclick // to remove (unused) panning code // /*! * zoom.js 0.3 (modified for use with reveal.js) * http://lab.hakim.se/zoom-js * MIT licensed * * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se */ var RevealZoom = window.RevealZoom || (function(){ // The current zoom level (scale) var level = 1; // The easing that will be applied when we zoom in/out document.body.style.transition = 'transform 0.8s ease'; document.body.style.OTransition = '-o-transform 0.8s ease'; document.body.style.msTransition = '-ms-transform 0.8s ease'; document.body.style.MozTransition = '-moz-transform 0.8s ease'; document.body.style.WebkitTransition = '-webkit-transform 0.8s ease'; /** * Applies the CSS required to zoom in, prefers the use of CSS3 * transforms but falls back on zoom for IE. * * @param {Object} rect * @param {Number} scale */ function magnify( rect, scale ) { // Ensure a width/height is set rect.width = rect.width || 1; rect.height = rect.height || 1; // Center the rect within the zoomed viewport rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2; rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2; // Reset if( scale === 1 ) { document.body.style.transform = ''; document.body.style.OTransform = ''; document.body.style.msTransform = ''; document.body.style.MozTransform = ''; document.body.style.WebkitTransform = ''; } // Scale else { var origin = '0px 0px'; var transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')'; document.body.style.transformOrigin = origin; document.body.style.OTransformOrigin = origin; document.body.style.msTransformOrigin = origin; document.body.style.MozTransformOrigin = origin; document.body.style.WebkitTransformOrigin = origin; document.body.style.transform = transform; document.body.style.OTransform = transform; document.body.style.msTransform = transform; document.body.style.MozTransform = transform; document.body.style.WebkitTransform = transform; } level = scale; } // zoom to element on double click document.querySelector( '.reveal .slides' ).addEventListener( 'dblclick', function( event ) { event.preventDefault(); zoomTo(event.target); }); // un-show answers on slide-change Reveal.addEventListener( 'slidechanged', function() { if( level !== 1 ) { zoomOut(); } }); /** * Zooms in on an HTML element. * * @param element: HTML element to zoom in on */ function zoomTo( element ) { // Due to an implementation limitation we can't zoom in // to another element without zooming out first if( level !== 1 ) { zoomOut(); } else { // Space around the zoomed in element to leave on screen var padding = 20; var bounds = element.getBoundingClientRect(); // are slides zoomed up, and is this done using CSS zoom? // then incorporate this zoom! var zoom = document.querySelector( '.reveal .slides' ).style.zoom; var scale = (zoom < 1) ? 1 : zoom; var options = { x: Math.round( bounds.left * scale - padding ), y: Math.round( bounds.top * scale - padding ), width: Math.round( bounds.width * scale + ( padding * 2 ) ), height: Math.round( bounds.height * scale + ( padding * 2 ) ) }; options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 ); if( options.scale > 1 ) { options.x *= options.scale; options.y *= options.scale; magnify( options, options.scale ); } } } // zoom out to normal scale function zoomOut() { magnify( { x: 0, y: 0 }, 1 ); level = 1; } return this; })();