1(function($){ 2 'use strict'; 3 $.fn.twentytwenty = function(options) { 4 var options = $.extend({ 5 default_offset_pct: 0.5, 6 orientation: 'horizontal', 7 before_label: 'Before', 8 after_label: 'After', 9 no_overlay: false, 10 move_slider_on_hover: false, 11 move_with_handle_only: true, 12 click_to_move: false 13 }, options); 14 15 return this.each(function() { 16 17 var sliderPct = options.default_offset_pct; 18 var container = $(this); 19 var sliderOrientation = options.orientation; 20 var beforeDirection = (sliderOrientation === 'vertical') ? 'down' : 'left'; 21 var afterDirection = (sliderOrientation === 'vertical') ? 'up' : 'right'; 22 23 container.wrap("<div class='twentytwenty-wrapper twentytwenty-" + sliderOrientation + "'></div>"); 24 if(!options.no_overlay) { 25 container.append("<div class='twentytwenty-overlay'></div>"); 26 } 27 var beforeImg = container.find("img:first"); 28 var afterImg = container.find("img:last"); 29 container.append("<div class='twentytwenty-handle'></div>"); 30 var slider = container.find(".twentytwenty-handle"); 31 slider.append("<span class='twentytwenty-" + beforeDirection + "-arrow'></span>"); 32 slider.append("<span class='twentytwenty-" + afterDirection + "-arrow'></span>"); 33 container.addClass("twentytwenty-container"); 34 beforeImg.addClass("twentytwenty-before"); 35 afterImg.addClass("twentytwenty-after"); 36 37 var overlay = container.find(".twentytwenty-overlay"); 38 overlay.append("<div class='twentytwenty-before-label' data-content='"+options.before_label+"'></div>"); 39 overlay.append("<div class='twentytwenty-after-label' data-content='"+options.after_label+"'></div>"); 40 41 var calcOffset = function(dimensionPct) { 42 var w = beforeImg.width(); 43 var h = beforeImg.height(); 44 45 46 return { 47 w: w+"px", 48 h: h+"px", 49 cw: (dimensionPct*w)+"px", 50 ch: (dimensionPct*h)+"px" 51 }; 52 }; 53 54 var adjustContainer = function(offset) { 55 56 if (sliderOrientation === 'vertical') { 57 beforeImg.css("clip", "rect(0,"+offset.w+","+offset.ch+",0)"); 58 afterImg.css("clip", "rect("+offset.ch+","+offset.w+","+offset.h+",0)"); 59 } 60 else { 61 beforeImg.css("clip", "rect(0,"+offset.cw+","+offset.h+",0)"); 62 afterImg.css("clip", "rect(0,"+offset.w+","+offset.h+","+offset.cw+")"); 63 } 64 container.css("height", offset.h); 65 }; 66 67 var adjustSliderWidth = function(offset){ 68 container.css("max-width", offset.w); 69 } 70 71 var adjustSlider = function(pct) { 72 var offset = calcOffset(pct); 73 slider.css((sliderOrientation==="vertical") ? "top" : "left", (sliderOrientation==="vertical") ? offset.ch : offset.cw); 74 adjustContainer(offset); 75 }; 76 77 // Return the number specified or the min/max number if it outside the range given. 78 var minMaxNumber = function(num, min, max) { 79 return Math.max(min, Math.min(max, num)); 80 }; 81 82 // Calculate the slider percentage based on the position. 83 var getSliderPercentage = function(positionX, positionY) { 84 var sliderPercentage = (sliderOrientation === 'vertical') ? 85 (positionY-offsetY)/imgHeight : 86 (positionX-offsetX)/imgWidth; 87 88 return minMaxNumber(sliderPercentage, 0, 1); 89 }; 90 91 92 $(window).on("resize.twentytwenty", function(e) { 93 adjustSlider(sliderPct); 94 }); 95 96 jQuery(document).ready(function(){ 97 setTimeout(function(){ 98 var offset = calcOffset(sliderPct); 99 adjustSliderWidth(offset); 100 adjustSlider(sliderPct); 101 },500); 102 }); 103 104 var offsetX = 0; 105 var offsetY = 0; 106 var imgWidth = 0; 107 var imgHeight = 0; 108 var onMoveStart = function(e) { 109 if (((e.distX > e.distY && e.distX < -e.distY) || (e.distX < e.distY && e.distX > -e.distY)) && sliderOrientation !== 'vertical') { 110 e.preventDefault(); 111 } 112 else if (((e.distX < e.distY && e.distX < -e.distY) || (e.distX > e.distY && e.distX > -e.distY)) && sliderOrientation === 'vertical') { 113 e.preventDefault(); 114 } 115 container.addClass("active"); 116 offsetX = container.offset().left; 117 offsetY = container.offset().top; 118 imgWidth = beforeImg.width(); 119 imgHeight = beforeImg.height(); 120 }; 121 var onMove = function(e) { 122 if (container.hasClass("active")) { 123 sliderPct = getSliderPercentage(e.pageX, e.pageY); 124 adjustSlider(sliderPct); 125 if( e.type == 'mousemove' ){ 126 jQuery(this).find('.twentytwenty-overlay').addClass('hover'); 127 } 128 } 129 }; 130 var onMoveEnd = function(e) { 131 container.removeClass("active"); 132 if( e.type == 'mouseleave' ){ 133 jQuery(this).find('.twentytwenty-overlay').removeClass('hover'); 134 } 135 }; 136 137 var moveTarget = options.move_with_handle_only ? slider : container; 138 moveTarget.on("movestart",onMoveStart); 139 moveTarget.on("move",onMove); 140 141 if (options.move_slider_on_hover) { 142 container.on("mouseenter", onMoveStart); 143 container.on("mousemove", onMove); 144 container.on("mouseleave", onMoveEnd); 145 } 146 147 slider.on("touchmove", function(e) { 148 e.preventDefault(); 149 }); 150 151 container.find("img").on("mousedown", function(event) { 152 event.preventDefault(); 153 }); 154 155 if (options.click_to_move) { 156 container.on('click', function(e) { 157 offsetX = container.offset().left; 158 offsetY = container.offset().top; 159 imgWidth = beforeImg.width(); 160 imgHeight = beforeImg.height(); 161 162 sliderPct = getSliderPercentage(e.pageX, e.pageY); 163 adjustSlider(sliderPct); 164 }); 165 } 166 167 $(window).trigger("resize.twentytwenty"); 168 }); 169 }; 170 171})(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.