|
$.scrollLock = ( function scrollLockClosure() { |
|
'use strict'; |
|
|
|
var $html = $( 'html' ), |
|
// State: unlocked by default |
|
locked = false, |
|
// State: scroll to revert to |
|
prevScroll = { |
|
scrollLeft : $( window ).scrollLeft(), |
|
scrollTop : $( window ).scrollTop() |
|
}, |
|
// State: styles to revert to |
|
prevStyles = {}, |
|
lockStyles = { |
|
'overflow-y' : 'scroll', |
|
'position' : 'fixed', |
|
'width' : '100%' |
|
}; |
|
|
|
// Instantiate cache in case someone tries to unlock before locking |
|
saveStyles(); |
|
|
|
// Save context's inline styles in cache |
|
function saveStyles() { |
|
var styleAttr = $html.attr( 'style' ), |
|
styleStrs = [], |
|
styleHash = {}; |
|
|
|
if( !styleAttr ){ |
|
return; |
|
} |
|
|
|
styleStrs = styleAttr.split( /;\s/ ); |
|
|
|
$.each( styleStrs, function serializeStyleProp( styleString ){ |
|
if( !styleString ) { |
|
return; |
|
} |
|
|
|
var keyValue = styleString.split( /\s:\s/ ); |
|
|
|
if( keyValue.length < 2 ) { |
|
return; |
|
} |
|
|
|
styleHash[ keyValue[ 0 ] ] = keyValue[ 1 ]; |
|
} ); |
|
|
|
$.extend( prevStyles, styleHash ); |
|
} |
|
|
|
function lock() { |
|
var appliedLock = {}; |
|
|
|
// Duplicate execution will break DOM statefulness |
|
if( locked ) { |
|
return; |
|
} |
|
|
|
// Save scroll state... |
|
prevScroll = { |
|
scrollLeft : $( window ).scrollLeft(), |
|
scrollTop : $( window ).scrollTop() |
|
}; |
|
|
|
// ...and styles |
|
saveStyles(); |
|
|
|
// Compose our applied CSS |
|
$.extend( appliedLock, lockStyles, { |
|
// And apply scroll state as styles |
|
'left' : - prevScroll.scrollLeft + 'px', |
|
'top' : - prevScroll.scrollTop + 'px' |
|
} ); |
|
|
|
// Then lock styles... |
|
$html.css( appliedLock ); |
|
|
|
// ...and scroll state |
|
$( window ) |
|
.scrollLeft( 0 ) |
|
.scrollTop( 0 ); |
|
|
|
locked = true; |
|
} |
|
|
|
function unlock() { |
|
// Duplicate execution will break DOM statefulness |
|
if( !locked ) { |
|
return; |
|
} |
|
|
|
// Revert styles |
|
$html.attr( 'style', $( '<x>' ).css( prevStyles ).attr( 'style' ) || '' ); |
|
|
|
// Revert scroll values |
|
$( window ) |
|
.scrollLeft( prevScroll.scrollLeft ) |
|
.scrollTop( prevScroll.scrollTop ); |
|
|
|
locked = false; |
|
} |
|
|
|
return function scrollLock( on ) { |
|
// If an argument is passed, lock or unlock depending on truthiness |
|
if( arguments.length ) { |
|
if( on ) { |
|
lock(); |
|
} |
|
else { |
|
unlock(); |
|
} |
|
} |
|
// Otherwise, toggle |
|
else { |
|
if( locked ){ |
|
unlock(); |
|
} |
|
else { |
|
lock(); |
|
} |
|
} |
|
}; |
|
}() ); |
You sir, are my hero! you can't imagine just how much of my efforts are saved with this wonderful library. worked right off the bat! Thanks, keep up the good work!