1(function($){ 2 3 $.fn.twentytwenty = function(options) { 4 var options = $.extend({default_offset_pct: 0.5, orientation: 'horizontal'}, options); 5 return this.each(function() { 6 7 var sliderPct = options.default_offset_pct; 8 var container = $(this); 9 var sliderOrientation = options.orientation; 10 var beforeDirection = (sliderOrientation === 'vertical') ? 'down' : 'left'; 11 var afterDirection = (sliderOrientation === 'vertical') ? 'up' : 'right'; 12 13 14 container.wrap("<div class='twentytwenty-wrapper twentytwenty-" + sliderOrientation + "'></div>"); 15 container.append("<div class='twentytwenty-overlay'></div>"); 16 var beforeImg = container.find("img:first"); 17 var afterImg = container.find("img:last"); 18 container.append("<div class='twentytwenty-handle'></div>"); 19 var slider = container.find(".twentytwenty-handle"); 20 slider.append("<span class='twentytwenty-" + beforeDirection + "-arrow'></span>"); 21 slider.append("<span class='twentytwenty-" + afterDirection + "-arrow'></span>"); 22 container.addClass("twentytwenty-container"); 23 beforeImg.addClass("twentytwenty-before"); 24 afterImg.addClass("twentytwenty-after"); 25 26 var overlay = container.find(".twentytwenty-overlay"); 27 overlay.append("<div class='twentytwenty-before-label'></div>"); 28 overlay.append("<div class='twentytwenty-after-label'></div>"); 29 30 var calcOffset = function(dimensionPct) { 31 var w = beforeImg.width(); 32 var h = beforeImg.height(); 33 return { 34 w: w+"px", 35 h: h+"px", 36 cw: (dimensionPct*w)+"px", 37 ch: (dimensionPct*h)+"px" 38 }; 39 }; 40 41 var adjustContainer = function(offset) { 42 if (sliderOrientation === 'vertical') { 43 beforeImg.css("clip", "rect(0,"+offset.w+","+offset.ch+",0)"); 44 } 45 else { 46 beforeImg.css("clip", "rect(0,"+offset.cw+","+offset.h+",0)"); 47 } 48 container.css("height", offset.h); 49 }; 50 51 var adjustSlider = function(pct) { 52 var offset = calcOffset(pct); 53 slider.css((sliderOrientation==="vertical") ? "top" : "left", (sliderOrientation==="vertical") ? offset.ch : offset.cw); 54 adjustContainer(offset); 55 } 56 57 $(window).on("resize.twentytwenty", function(e) { 58 adjustSlider(sliderPct); 59 }); 60 61 var offsetX = 0; 62 var imgWidth = 0; 63 64 slider.on("movestart", function(e) { 65 if (((e.distX > e.distY && e.distX < -e.distY) || (e.distX < e.distY && e.distX > -e.distY)) && sliderOrientation !== 'vertical') { 66 e.preventDefault(); 67 } 68 else if (((e.distX < e.distY && e.distX < -e.distY) || (e.distX > e.distY && e.distX > -e.distY)) && sliderOrientation === 'vertical') { 69 e.preventDefault(); 70 } 71 container.addClass("active"); 72 offsetX = container.offset().left; 73 offsetY = container.offset().top; 74 imgWidth = beforeImg.width(); 75 imgHeight = beforeImg.height(); 76 }); 77 78 slider.on("moveend", function(e) { 79 container.removeClass("active"); 80 }); 81 82 slider.on("move", function(e) { 83 if (container.hasClass("active")) { 84 sliderPct = (sliderOrientation === 'vertical') ? (e.pageY-offsetY)/imgHeight : (e.pageX-offsetX)/imgWidth; 85 if (sliderPct < 0) { 86 sliderPct = 0; 87 } 88 if (sliderPct > 1) { 89 sliderPct = 1; 90 } 91 adjustSlider(sliderPct); 92 } 93 }); 94 95 container.find("img").on("mousedown", function(event) { 96 event.preventDefault(); 97 }); 98 99 $(window).trigger("resize.twentytwenty"); 100 }); 101 }; 102 103})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.