impressive 3d support, yeah!

This commit is contained in:
Bartek Szopka
2011-12-29 23:34:26 +01:00
parent 336f6c7704
commit 273393942f

View File

@@ -52,9 +52,21 @@
return [].slice.call( context.querySelectorAll(selector) ); return [].slice.call( context.querySelectorAll(selector) );
}; };
var translate = function (x,y) { return " translate3d(" + x + "px," + y + "px, 0) "; } var translate = function ( t ) {
var rotate = function (a) { return " rotate(" + a + "deg) "; } return " translate3d(" + t.x + "px," + t.y + "px," + t.z + "px) ";
var scale = function (s) { return " scale(" + s + ") "; } };
var rotate = function ( r, revert ) {
var rX = " rotateX(" + r.x + "deg) ",
rY = " rotateY(" + r.y + "deg) ",
rZ = " rotatez(" + r.z + "deg) ";
return revert ? rZ+rY+rX : rX+rY+rZ;
};
var scale = function ( s ) {
return " scaleX(" + s.x + ") scaleY(" + s.y + ") scaleZ(" + s.z + ") ";
}
// DOM ELEMENTS // DOM ELEMENTS
@@ -75,29 +87,46 @@
var props = { var props = {
position: "absolute", position: "absolute",
top: "50%",
left: "50%",
transformOrigin: "top left", transformOrigin: "top left",
transition: "all 1s ease-in-out" transition: "all 1s ease-in-out",
transformStyle: "preserve-3d"
} }
css(impress, props); css(impress, props);
css(impress, {
top: "50%",
left: "50%",
perspective: "1000px"
});
css(canvas, props); css(canvas, props);
var current = { var current = {
x: 0, translate: { x: 0, y: 0, z: 0 },
y: 0, rotate: { x: 0, y: 0, z: 0 },
rotate: 0, scale: { x: 1, y: 1, z: 1 }
scale: 1
}; };
steps.forEach(function ( el, idx ) { steps.forEach(function ( el, idx ) {
var step = el.dataset; var data = el.dataset,
step = {
translate: {
x: data.x || 0,
y: data.y || 0,
z: data.z || 0
},
rotate: {
x: data.rotateX || 0,
y: data.rotateY || 0,
z: data.rotateZ || data.rotate || 0
},
scale: {
x: data.scaleX || data.scale || 1,
y: data.scaleY || data.scale || 1,
z: data.scaleZ || 1
}
};
step.x = step.x || 0; el.stepData = step;
step.y = step.y || 0;
step.rotate = step.rotate || 0;
step.scale = step.scale || 1;
if ( !el.id ) { if ( !el.id ) {
el.id = "step-" + idx; el.id = "step-" + idx;
@@ -106,7 +135,7 @@
css(el, { css(el, {
position: "absolute", position: "absolute",
transform: "translate(-50%,-50%)" + transform: "translate(-50%,-50%)" +
translate(step.x, step.y) + translate(step.translate) +
rotate(step.rotate) + rotate(step.rotate) +
scale(step.scale) scale(step.scale)
}); });
@@ -116,7 +145,7 @@
// making given step active // making given step active
var select = function ( el ) { var select = function ( el ) {
var step = el.dataset; var step = el.stepData;
if ( $(".step.active", impress) ) { if ( $(".step.active", impress) ) {
$(".step.active", impress).classList.remove("active"); $(".step.active", impress).classList.remove("active");
@@ -126,20 +155,35 @@
impress.className = "step-" + el.id; impress.className = "step-" + el.id;
var target = { var target = {
rotate: -parseInt(step.rotate, 10), rotate: {
scale: 1 / parseFloat(step.scale), x: -parseInt(step.rotate.x, 10),
x: -step.x, y: -parseInt(step.rotate.y, 10),
y: -step.y z: -parseInt(step.rotate.z, 10),
},
scale: {
x: 1 / parseFloat(step.scale.x),
y: 1 / parseFloat(step.scale.y),
z: 1 / parseFloat(step.scale.z),
},
translate: {
x: -step.translate.x,
y: -step.translate.y,
z: -step.translate.z
}
}; };
var zoomin = target.scale.x > current.scale.x ||
target.scale.y > current.scale.y ||
target.scale.z > current.scale.z;
css(impress, { css(impress, {
transform: scale(target.scale), transform: scale(target.scale),
transitionDelay: (target.scale > current.scale ? "300ms" : "0") transitionDelay: (zoomin ? "300ms" : "0")
}); });
css(canvas, { css(canvas, {
transform: rotate(target.rotate) + translate(target.x, target.y), transform: rotate(target.rotate, true) + translate(target.translate),
transformDelay: (target.scale > current.scale ? "0" : "300ms") transformDelay: (zoomin ? "0" : "300ms")
}); });
current = target; current = target;