mirror of
https://github.com/flynx/PortableMag.git
synced 2025-11-01 04:20:20 +00:00
reworked css-vendor acces attr, transition timing and lots of other minor stuff...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
c9f964c9cc
commit
9b926cfdc8
29
index.html
29
index.html
@ -17,24 +17,8 @@
|
|||||||
.magazine {
|
.magazine {
|
||||||
left: 150px;
|
left: 150px;
|
||||||
margin-left: 0px;
|
margin-left: 0px;
|
||||||
|
|
||||||
/* magic */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.current.page {
|
|
||||||
/*
|
|
||||||
z-index: 9000;
|
|
||||||
box-shadow: 10px 10px 150px -50px black;
|
|
||||||
border-bottom: solid yellow 10px;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
.page:hover {
|
|
||||||
z-index: 9000;
|
|
||||||
box-shadow: 10px 10px 150px 0px black;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
.page {
|
.page {
|
||||||
|
|
||||||
vertical-align:top;
|
vertical-align:top;
|
||||||
@ -130,13 +114,13 @@ $(document).ready(function(){
|
|||||||
hScroll: true,
|
hScroll: true,
|
||||||
vScroll: false,
|
vScroll: false,
|
||||||
// XXX still a bit flacky...
|
// XXX still a bit flacky...
|
||||||
//preCallback: function(){stopAnimation($('.magazine'))},
|
preCallback: function(){stopAnimation($('.magazine'))},
|
||||||
//enableMultiClicks: true,
|
//enableMultiClicks: true,
|
||||||
transitionEasing: 'cubic-bezier(0.33,0.66,0.66,1)',
|
transitionEasing: 'cubic-bezier(0.33,0.66,0.66,1)',
|
||||||
}).start()
|
}).start()
|
||||||
|
|
||||||
$('.viewer')
|
$('.viewer')
|
||||||
.on('scrollCancelled', function(){ setCurrentPage() })
|
.on('scrollCancelled swipeUp swipeDown', function(){ setCurrentPage() })
|
||||||
.on('shortClick', handleClick)
|
.on('shortClick', handleClick)
|
||||||
.on('swipeLeft', handleSwipeLeft)
|
.on('swipeLeft', handleSwipeLeft)
|
||||||
.on('swipeRight', handleSwipeRight)
|
.on('swipeRight', handleSwipeRight)
|
||||||
@ -145,18 +129,11 @@ $(document).ready(function(){
|
|||||||
.on('screenReleased swipeRight swipeLeft', handleScrollRelease)
|
.on('screenReleased swipeRight swipeLeft', handleScrollRelease)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// XXX stub...
|
|
||||||
//setTransitionEasing($('.magazine'), 'ease-out')
|
|
||||||
//setTransitionEasing($('.magazine'), 'cubic-bezier(0.33,0.66,0.66,1)')
|
|
||||||
prepareTransitions($('.magazine'))
|
|
||||||
$('.viewer').css('overflow', 'hidden')
|
$('.viewer').css('overflow', 'hidden')
|
||||||
|
|
||||||
runMagazineTemplates()
|
runMagazineTemplates()
|
||||||
setCurrentPage(0)
|
|
||||||
|
|
||||||
// XXX for some reason this does not work correctly on android the
|
|
||||||
// first time...
|
|
||||||
togglePageView('on')
|
togglePageView('on')
|
||||||
|
setCurrentPage(0)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
44
layout.js
44
layout.js
@ -72,7 +72,6 @@ function handleClick(evt, data){
|
|||||||
togglePageView()
|
togglePageView()
|
||||||
setCurrentPage(target)
|
setCurrentPage(target)
|
||||||
|
|
||||||
setTransitionDuration(mag, DEFAULT_TRANSITION_DURATION)
|
|
||||||
//setTransitionEasing(mag, 'ease')
|
//setTransitionEasing(mag, 'ease')
|
||||||
setTransitionEasing(mag, 'cubic-bezier(0.33,0.66,0.66,1)')
|
setTransitionEasing(mag, 'cubic-bezier(0.33,0.66,0.66,1)')
|
||||||
}
|
}
|
||||||
@ -93,7 +92,6 @@ function makeSwipeHandler(action){
|
|||||||
}
|
}
|
||||||
// full page view...
|
// full page view...
|
||||||
var mag = $('.magazine')
|
var mag = $('.magazine')
|
||||||
setTransitionDuration(mag, DEFAULT_TRANSITION_DURATION)
|
|
||||||
//setTransitionEasing(mag, 'ease-out')
|
//setTransitionEasing(mag, 'ease-out')
|
||||||
setTransitionEasing(mag, 'cubic-bezier(0.33,0.66,0.66,1)')
|
setTransitionEasing(mag, 'cubic-bezier(0.33,0.66,0.66,1)')
|
||||||
|
|
||||||
@ -157,6 +155,7 @@ function handleScrollRelease(evt, data){
|
|||||||
|
|
||||||
animateElementTo(mag, to, t, easing, speed)
|
animateElementTo(mag, to, t, easing, speed)
|
||||||
|
|
||||||
|
/*
|
||||||
// restore defaults...
|
// restore defaults...
|
||||||
// XXX this is a bit dumb at this point...
|
// XXX this is a bit dumb at this point...
|
||||||
// XXX run this as a transition end handler...
|
// XXX run this as a transition end handler...
|
||||||
@ -165,6 +164,7 @@ function handleScrollRelease(evt, data){
|
|||||||
setTransitionEasing(mag, 'cubic-bezier(0.33,0.66,0.66,1)')
|
setTransitionEasing(mag, 'cubic-bezier(0.33,0.66,0.66,1)')
|
||||||
setTransitionDuration(mag, DEFAULT_TRANSITION_DURATION)
|
setTransitionDuration(mag, DEFAULT_TRANSITION_DURATION)
|
||||||
}, t+10)
|
}, t+10)
|
||||||
|
*/
|
||||||
|
|
||||||
// check scroll bounds...
|
// check scroll bounds...
|
||||||
// do not let the user scroll out of view...
|
// do not let the user scroll out of view...
|
||||||
@ -186,23 +186,13 @@ var USE_TRANSITIONS_FOR_ANIMATION = false
|
|||||||
//var MIN_STEP = 24
|
//var MIN_STEP = 24
|
||||||
var MIN_STEP = 0
|
var MIN_STEP = 0
|
||||||
|
|
||||||
var animationFrame = (window.requestAnimationFrame
|
|
||||||
|| window.webkitRequestAnimationFrame
|
|
||||||
|| window.mozRequestAnimationFrame
|
|
||||||
|| window.oRequestAnimationFrame
|
|
||||||
|| window.msRequestAnimationFrame
|
|
||||||
|| function(callback){
|
|
||||||
window.setTimeout(callback, 1000 / 60)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// XXX make this a drop-in replacement for setElementTransform...
|
// XXX make this a drop-in replacement for setElementTransform...
|
||||||
// XXX cleanup, still flacky...
|
// XXX cleanup, still flacky...
|
||||||
function animateElementTo(elem, to, duration, easing, speed){
|
function animateElementTo(elem, to, duration, easing, speed){
|
||||||
// use transition for animation...
|
// use transition for animation...
|
||||||
if(USE_TRANSITIONS_FOR_ANIMATION){
|
if(USE_TRANSITIONS_FOR_ANIMATION){
|
||||||
setTransitionEasing(elem, easing)
|
setTransitionEasing(elem, easing)
|
||||||
setTransitionDuration(elem, duration)
|
duration == null && setTransitionDuration(elem, duration)
|
||||||
setElementTransform(elem, to)
|
setElementTransform(elem, to)
|
||||||
|
|
||||||
// manually animate...
|
// manually animate...
|
||||||
@ -219,6 +209,10 @@ function animateElementTo(elem, to, duration, easing, speed){
|
|||||||
y: 0,
|
y: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(duration == null){
|
||||||
|
duration = getElementTransitionDuration(elem)
|
||||||
|
}
|
||||||
|
|
||||||
setTransitionDuration(elem, 0)
|
setTransitionDuration(elem, 0)
|
||||||
|
|
||||||
var start = Date.now()
|
var start = Date.now()
|
||||||
@ -292,7 +286,7 @@ function animateElementTo(elem, to, duration, easing, speed){
|
|||||||
}
|
}
|
||||||
setElementTransform(elem, cur)
|
setElementTransform(elem, cur)
|
||||||
// sched next frame...
|
// sched next frame...
|
||||||
animationFrame(animate)
|
elem.next_frame = getAnimationFrame(animate)
|
||||||
}
|
}
|
||||||
|
|
||||||
animate()
|
animate()
|
||||||
@ -300,8 +294,8 @@ function animateElementTo(elem, to, duration, easing, speed){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function stopAnimation(elem){
|
function stopAnimation(elem){
|
||||||
if(elem.animating){
|
if(elem.next_frame){
|
||||||
delete elem.animating
|
cancelAnimationFrame(elem.next_frame)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,6 +316,10 @@ function isNavigationViewRelative(){
|
|||||||
function getMagazineOffset(page, scale, align){
|
function getMagazineOffset(page, scale, align){
|
||||||
if(page == null){
|
if(page == null){
|
||||||
page = $('.current.page')
|
page = $('.current.page')
|
||||||
|
// if no current page get the first...
|
||||||
|
if(page.length == 0){
|
||||||
|
page = $('.page').first()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(scale == null){
|
if(scale == null){
|
||||||
scale = getMagazineScale()
|
scale = getMagazineScale()
|
||||||
@ -391,6 +389,9 @@ function getMagazineScale(){
|
|||||||
function setMagazineScale(scale){
|
function setMagazineScale(scale){
|
||||||
var mag = $('.magazine')
|
var mag = $('.magazine')
|
||||||
var cur = $('.current.page')
|
var cur = $('.current.page')
|
||||||
|
if(cur.length == 0){
|
||||||
|
cur = $('.page').first()
|
||||||
|
}
|
||||||
|
|
||||||
// center-align ribbon view pages...
|
// center-align ribbon view pages...
|
||||||
var align = isNavigationViewRelative() ? 'center' : null
|
var align = isNavigationViewRelative() ? 'center' : null
|
||||||
@ -425,11 +426,10 @@ function setCurrentPage(n){
|
|||||||
var left = getMagazineOffset(cur, null, align)
|
var left = getMagazineOffset(cur, null, align)
|
||||||
|
|
||||||
if(USE_TRANSITIONS_FOR_ANIMATION){
|
if(USE_TRANSITIONS_FOR_ANIMATION){
|
||||||
setTransitionDuration($('.magazine'), DEFAULT_TRANSITION_DURATION)
|
|
||||||
setElementTransform($('.magazine'), left)
|
setElementTransform($('.magazine'), left)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
animateElementTo($('.magazine'), left, DEFAULT_TRANSITION_DURATION)
|
animateElementTo($('.magazine'), left)
|
||||||
}
|
}
|
||||||
|
|
||||||
return cur
|
return cur
|
||||||
@ -437,9 +437,13 @@ function setCurrentPage(n){
|
|||||||
|
|
||||||
|
|
||||||
function nextPage(page){
|
function nextPage(page){
|
||||||
|
// XXX is this the right place for this?
|
||||||
|
setTransitionDuration($('.magazine'), DEFAULT_TRANSITION_DURATION)
|
||||||
setCurrentPage(getPageNumber(page)+1)
|
setCurrentPage(getPageNumber(page)+1)
|
||||||
}
|
}
|
||||||
function prevPage(page){
|
function prevPage(page){
|
||||||
|
// XXX is this the right place for this?
|
||||||
|
setTransitionDuration($('.magazine'), DEFAULT_TRANSITION_DURATION)
|
||||||
var n = getPageNumber(page)-1
|
var n = getPageNumber(page)-1
|
||||||
n = n < 0 ? 0 : n
|
n = n < 0 ? 0 : n
|
||||||
setCurrentPage(n)
|
setCurrentPage(n)
|
||||||
@ -447,9 +451,13 @@ function prevPage(page){
|
|||||||
|
|
||||||
|
|
||||||
function firstPage(){
|
function firstPage(){
|
||||||
|
// XXX is this the right place for this?
|
||||||
|
setTransitionDuration($('.magazine'), DEFAULT_TRANSITION_DURATION)
|
||||||
setCurrentPage(0)
|
setCurrentPage(0)
|
||||||
}
|
}
|
||||||
function lastPage(){
|
function lastPage(){
|
||||||
|
// XXX is this the right place for this?
|
||||||
|
setTransitionDuration($('.magazine'), DEFAULT_TRANSITION_DURATION)
|
||||||
setCurrentPage(-1)
|
setCurrentPage(-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
148
lib/jli.js
148
lib/jli.js
@ -194,6 +194,64 @@ function unanimated(obj, func, time){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: this will only use the first element in a set.
|
||||||
|
// NOTE: if no element is given this will return null.
|
||||||
|
function makeCSSVendorAttrGetter(attr, dfl, callback){
|
||||||
|
return function(elem){
|
||||||
|
elem = $(elem)
|
||||||
|
if(elem.length == 0){
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
// using the attr...
|
||||||
|
var vendors = ['O', 'Moz', 'ms', 'webkit']
|
||||||
|
var data = elem[0].style[attr]
|
||||||
|
|
||||||
|
// go through vendor prefixes... (hate this!)
|
||||||
|
if(!data || data == 'none'){
|
||||||
|
for(var i in vendors){
|
||||||
|
data = elem[0].style[vendors[i] + attr.capitalize()]
|
||||||
|
if(data && data != 'none'){
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// no data is set...
|
||||||
|
if(!data || data == 'none'){
|
||||||
|
return dfl
|
||||||
|
}
|
||||||
|
return callback(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Return a scale value for the given element(s).
|
||||||
|
// NOTE: this will only return a single scale value...
|
||||||
|
var getElementScale = makeCSSVendorAttrGetter(
|
||||||
|
'transform',
|
||||||
|
1,
|
||||||
|
function(data){
|
||||||
|
return parseFloat((/(scale|matrix)\(([^),]*)\)/).exec(data)[2])
|
||||||
|
})
|
||||||
|
|
||||||
|
var getElementShift = makeCSSVendorAttrGetter(
|
||||||
|
'transform',
|
||||||
|
{left: 0, top: 0},
|
||||||
|
function(data){
|
||||||
|
res = /(translate\(|matrix\([^,]*,[^,]*,[^,]*,[^,]*,)([^,]*),([^\)]*)\)/.exec(data)
|
||||||
|
return {
|
||||||
|
left: parseFloat(res[2]),
|
||||||
|
top: parseFloat(res[3])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
var DEFAULT_TRANSITION_DURATION = 200
|
||||||
|
|
||||||
|
var getElementTransitionDuration = makeCSSVendorAttrGetter(
|
||||||
|
'transitionDuration',
|
||||||
|
DEFAULT_TRANSITION_DURATION,
|
||||||
|
parseInt)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var USE_3D_TRANSFORM = true
|
var USE_3D_TRANSFORM = true
|
||||||
|
|
||||||
@ -253,73 +311,11 @@ function setElementTransform(elem, offset, scale, duration){
|
|||||||
return elem
|
return elem
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a scale value for the given element(s).
|
|
||||||
// NOTE: this will only return a single scale value...
|
|
||||||
function getElementScale(elem){
|
|
||||||
elem = $(elem)
|
|
||||||
//var transform = elem.css('transform')
|
|
||||||
var vendors = ['o', 'moz', 'ms', 'webkit']
|
|
||||||
var transform = elem.css('transform')
|
|
||||||
var res
|
|
||||||
|
|
||||||
// go through vendor prefixes... (hate this!)
|
|
||||||
if(!transform || transform == 'none'){
|
|
||||||
for(var i in vendors){
|
|
||||||
transform = elem.css('-' + vendors[i] + '-transform')
|
|
||||||
if(transform && transform != 'none'){
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// no transform is set...
|
|
||||||
if(!transform || transform == 'none'){
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
// get the scale value -- first argument of scale/matrix...
|
|
||||||
return parseFloat((/(scale|matrix)\(([^,]*),.*\)/).exec(transform)[2])
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXX account for other transitions...
|
// XXX account for other transitions...
|
||||||
function setElementScale(elem, scale){
|
function setElementScale(elem, scale){
|
||||||
return setElementTransform(elem, null, scale)
|
return setElementTransform(elem, null, scale)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getElementShift(elem){
|
|
||||||
elem = $(elem)
|
|
||||||
// using transform...
|
|
||||||
if(USE_TRANSFORM){
|
|
||||||
var vendors = ['o', 'moz', 'ms', 'webkit']
|
|
||||||
var transform = elem.css('transform')
|
|
||||||
var res
|
|
||||||
|
|
||||||
// go through vendor prefixes... (hate this!)
|
|
||||||
if(!transform || transform == 'none'){
|
|
||||||
for(var i in vendors){
|
|
||||||
transform = elem.css('-' + vendors[i] + '-transform')
|
|
||||||
if(transform && transform != 'none'){
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// no transform is set...
|
|
||||||
if(!transform || transform == 'none'){
|
|
||||||
return {left: 0, top: 0}
|
|
||||||
}
|
|
||||||
res = /(translate\(|matrix\([^,]*,[^,]*,[^,]*,[^,]*,)([^,]*),([^\)]*)\)/.exec(transform)
|
|
||||||
return {
|
|
||||||
left: parseFloat(res[2]),
|
|
||||||
top: parseFloat(res[3])
|
|
||||||
}
|
|
||||||
// using left...
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
left: elem.position().left,
|
|
||||||
top: elem.position().top
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function setTransitionEasing(elem, ease){
|
function setTransitionEasing(elem, ease){
|
||||||
if(typeof(ms) == typeof(0)){
|
if(typeof(ms) == typeof(0)){
|
||||||
ms = ms + 'ms'
|
ms = ms + 'ms'
|
||||||
@ -1002,6 +998,34 @@ jQuery.fn.sortChildren = function(func){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************** JS utilities ***/
|
||||||
|
|
||||||
|
String.prototype.capitalize = function(){
|
||||||
|
return this[0].toUpperCase() + this.slice(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var getAnimationFrame = (window.requestAnimationFrame
|
||||||
|
|| window.webkitRequestAnimationFrame
|
||||||
|
|| window.mozRequestAnimationFrame
|
||||||
|
|| window.oRequestAnimationFrame
|
||||||
|
|| window.msRequestAnimationFrame
|
||||||
|
|| function(callback){
|
||||||
|
window.setTimeout(callback, 1000 / 60)
|
||||||
|
})
|
||||||
|
|
||||||
|
var cancelAnimationFrame = (window.cancelRequestAnimationFrame
|
||||||
|
|| window.webkitCancelAnimationFrame
|
||||||
|
|| window.webkitCancelRequestAnimationFrame
|
||||||
|
|| window.mozCancelRequestAnimationFrame
|
||||||
|
|| window.oCancelRequestAnimationFrame
|
||||||
|
|| window.msCancelRequestAnimationFrame
|
||||||
|
|| clearTimeout)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************************************************** logger ***/
|
/********************************************************** logger ***/
|
||||||
|
|
||||||
function Logger(){
|
function Logger(){
|
||||||
|
|||||||
10
magazine.js
10
magazine.js
@ -189,7 +189,7 @@ function getMagazineTitle(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getPageScale(){
|
function getMagazineScale(){
|
||||||
return getElementScale($('.scaler'))
|
return getElementScale($('.scaler'))
|
||||||
}
|
}
|
||||||
function setPageScale(scale){
|
function setPageScale(scale){
|
||||||
@ -236,7 +236,7 @@ function getPageTargetScale(n, fit_to_content){
|
|||||||
var cH = content.height()
|
var cH = content.height()
|
||||||
|
|
||||||
var scale = {
|
var scale = {
|
||||||
value: getPageScale(),
|
value: getMagazineScale(),
|
||||||
width: null,
|
width: null,
|
||||||
height: null,
|
height: null,
|
||||||
result_width: cW,
|
result_width: cW,
|
||||||
@ -380,7 +380,7 @@ function makeSwipeHandler(){
|
|||||||
pages = $('.page')
|
pages = $('.page')
|
||||||
cur = $('.current.page')
|
cur = $('.current.page')
|
||||||
n = pages.index(cur)
|
n = pages.index(cur)
|
||||||
scale = getPageScale()
|
scale = getMagazineScale()
|
||||||
mag = $('.magazine')
|
mag = $('.magazine')
|
||||||
pos = $('.navigator .bar .indicator')
|
pos = $('.navigator .bar .indicator')
|
||||||
|
|
||||||
@ -619,7 +619,7 @@ function setCurrentPage(n, offset, width){
|
|||||||
width = cur.width()
|
width = cur.width()
|
||||||
if(USE_REAL_PAGE_SIZES && togglePageView('?') == 'on'){
|
if(USE_REAL_PAGE_SIZES && togglePageView('?') == 'on'){
|
||||||
var align = getPageAlign(cur)
|
var align = getPageAlign(cur)
|
||||||
var scale = getPageScale()
|
var scale = getMagazineScale()
|
||||||
if(align == 'center'){
|
if(align == 'center'){
|
||||||
width = cur.width()
|
width = cur.width()
|
||||||
|
|
||||||
@ -638,7 +638,7 @@ function setCurrentPage(n, offset, width){
|
|||||||
|
|
||||||
// NOTE: this will be wrong during a transition, that's why we
|
// NOTE: this will be wrong during a transition, that's why we
|
||||||
// can pass the pre-calculated offset as an argument...
|
// can pass the pre-calculated offset as an argument...
|
||||||
shiftMagazineTo(-(offset == null ? cur.position()['left']/getPageScale() : offset))
|
shiftMagazineTo(-(offset == null ? cur.position()['left']/getMagazineScale() : offset))
|
||||||
|
|
||||||
// center the pages correctly...
|
// center the pages correctly...
|
||||||
// NOTE: this is the main reason we need width, and we can get it
|
// NOTE: this is the main reason we need width, and we can get it
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user