/* Before and After image script By Dynamic Drive
* Created: Oct 15th', 2014 by DynamicDrive.com. This notice must stay intact for usage
* Author: Dynamic Drive at http://www.dynamicdrive.com/
* Visit http://www.dynamicdrive.com/ for full source code
*/
var ddbeforeandafter = (function($){
var gallerydefaults = {
dragUI: '
',
revealduration: 0.4,
initialreveal: ['30%', 1],
//initialrevealeasing: 'cubic-bezier(0.390, 0.575, 0.510, 1.650)',
hidedragbardelay: 1
}
var detecttouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0))
function ddbeforeandafter(options){
var s = $.extend({}, gallerydefaults, options)
s._imagesloaded = false
s._draghidetimer = null
var thisobj = this
var $container = $('#'+s.wrapperid)
var $before = $container.find('div.before:eq(0)')
var $after = $container.find('div.after:eq(0)')
$container.append(s.dragUI)
var $dragbar = $container.find('div.drag')
var $draghandle = $dragbar.find('div.draghandle')
var dimensions = {containerw: $container.width(), dragbarw: $dragbar.width(), draghandlew: $draghandle.outerWidth()}
s.defaultTimingFunction = $dragbar.css('transitionTimingFunction')
var isdirectclick = false
var mousemoveevtstr = 'mousemove.dragstart' + s.wrapperid + ' touchmove.dragstart' + s.wrapperid
this.s = s
this.$container = $container
this.$before = $before
this.$after = $after
this.$dragbar = $dragbar
this.$draghandle = $draghandle
this.dimensions = dimensions
this._init()
$container.on('mousedown touchstart', function(e){
isdirectclick = true
if (e.target.tagName != 'A')
e.preventDefault()
})
$container.on(detecttouch? 'touchstart' : 'click', function(e){
if (s._imagesloaded && (isdirectclick || detecttouch)){
var e = (e.type.indexOf('touch') != '-1')? e.originalEvent.changedTouches[0] : e
var newx = e.pageX - $container.offset().left
$dragbar.add($before).css({transitionTimingFunction: s.defaultTimingFunction, transitionDuration: s.revealduration+'s'})
$dragbar.css({left: newx})
$before.css({width: newx})
if (e.target.tagName != 'A')
e.preventDefault()
}
isdirectclick = false
})
$container.hover(
function(){
clearTimeout(s._draghidetimer)
$dragbar.stop().animate({opacity:1})
},
function(){
s._draghidetimer = setTimeout(function(){$dragbar.stop().animate({opacity:0.3})}, s.hidedragbardelay*1000)
}
)
$dragbar.bind('click', function(e){
e.stopPropagation()
})
$dragbar.bind('mousedown touchstart', function(e){
if (!s._imagesloaded)
return
var e = (e.type.indexOf('touch') != -1)? e.originalEvent.changedTouches[0] : e
dimensions = thisobj.dimensions // refresh dimensions var
var initialx = parseInt($dragbar.css('left'))
var containerleft = $container.offset().left
$dragbar.add($before).css({transitionDuration: '0s'})
$(document).bind(mousemoveevtstr, function(e){
var e = (e.type.indexOf('touch') != '-1')? e.originalEvent.changedTouches[0] : e
var dx=e.pageX-containerleft-initialx //distance to move horizontally
var newx=(dx<0)? Math.max(0, initialx+dx) : Math.min(dimensions.containerw-dimensions.dragbarw, initialx+dx) //Set horizonal bonds. dx>0 indicates drag right versus
$dragbar.css({left: newx})
$before.css({width: newx})
return false //cancel default drag action
})
return false //cancel default drag action
})
$(document).bind('mouseup touchend', function(e){
var e = (e.type.indexOf('touch') != -1)? e.originalEvent.changedTouches[0] : e
$(document).unbind(mousemoveevtstr)
})
$(window).bind('resize', function(e){
dimensions.containerw = $container.width()
thisobj._centerelement($dragbar, $draghandle)
$before.find('img:eq(0)').css({width: dimensions.containerw, height: 'auto'})
$after.find('img:eq(0)').css({width: dimensions.containerw, height: 'auto'})
thisobj.unveil(s.initialreveal[0], s.initialreveal[1], s.initialrevealeasing)
})
} // end main function
ddbeforeandafter.prototype = {
_centerelement: function($parent, $target, offsetx, offsety){
var dimensions = {parentw: $parent.width(), parenth: $parent.height(), targetw: $target.outerWidth(), targeth: $target.outerHeight()}
$target.css({left: dimensions.parentw/2 - dimensions.targetw/2 + (offsetx || 0), top: dimensions.parenth/2 - dimensions.targeth/2 + (offsety || 0)})
},
_init: function(initoptions){
var thisobj = this,
s = this.s,
$container = this.$container,
$before = this.$before,
$after = this.$after,
$dragbar = this.$dragbar,
$draghandle = this.$draghandle
s._imagesloaded = false
if (initoptions && initoptions.beforeafterhtml){
$before.html(initoptions.beforeafterhtml[0])
$after.html(initoptions.beforeafterhtml[1])
}
if (initoptions && initoptions.dimensions){
$container.css({width: initoptions.dimensions[0], height: initoptions.dimensions[1]})
this.dimensions = {containerw: $container.width(), dragbarw: $dragbar.width(), draghandlew: $draghandle.outerWidth()}
}
this._centerelement($dragbar, $draghandle)
this.unveil(0, 0)
clearTimeout(s._draghidetimer)
$dragbar.css({opacity:0.3})
var $beforeimage = this.$before.css({opacity:0.5}).find('img:eq(0)').css({width: this.dimensions.containerw, height: 'auto'})
var $afterimage = this.$after.css({opacity:0}).find('img:eq(0)').css({width: this.dimensions.containerw, height: 'auto'})
var imagesloadeddfd = [$.Deferred(), $.Deferred()]
if ($beforeimage.prop('complete') === true)
imagesloadeddfd[0].resolve()
if ($afterimage.prop('complete') === true)
imagesloadeddfd[1].resolve()
$beforeimage.on('load error', function(){imagesloadeddfd[0].resolve()})
$afterimage.on('load error', function(){imagesloadeddfd[1].resolve()})
$.when(imagesloadeddfd[0], imagesloadeddfd[1]).done(function(){
s._imagesloaded = true
$after.css({opacity:1})
$before.animate({opacity:1}, function(){
$dragbar.animate({opacity:1}, function(){
thisobj.unveil(s.initialreveal[0], s.initialreveal[1], s.initialrevealeasing)
})
})
})
},
reload: function(beforeafterhtml, dimensions){
var options = {beforeafterhtml: beforeafterhtml, dimensions: dimensions}
this._init(options)
},
unveil: function(amt, dur, timingfunc){
var s = this.s,
$container = this.$container,
$before = this.$before,
$dragbar = this.$dragbar,
dimensions = this.dimensions,
amt = parseInt(amt)
amt = (amt < 0)? 0 : (amt > 100)? 100 : amt
var dur = ((typeof dur != 'undefined')? dur : s.revealduration) + 's'
var timingfunction = timingfunc || s.defaultTimingFunction
amt = 100 - amt
var newx = (dimensions.containerw - dimensions.dragbarw) * amt/100
$dragbar.add($before).css({transitionTimingFunction: timingfunction, transitionDuration: dur})
$dragbar.css({left: newx})
$before.css({width: newx})
}
}
return ddbeforeandafter
}) (jQuery)