vendor: 5,414 bytes, lines 1-151
1(function($){ 2 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 24 container.wrap("<div class='twentytwenty-wrapper twentytwenty-" + sliderOrientation + "'></div>"); 25 if(!options.no_overlay) { 26 container.append("<div class='twentytwenty-overlay'></div>"); 27 var overlay = container.find(".twentytwenty-overlay"); 28 overlay.append("<div class='twentytwenty-before-label' data-content='"+options.before_label+"'></div>"); 29 overlay.append("<div class='twentytwenty-after-label' data-content='"+options.after_label+"'></div>"); 30 } 31 var beforeImg = container.find("img:first"); 32 var afterImg = container.find("img:last"); 33 container.append("<div class='twentytwenty-handle'></div>"); 34 var slider = container.find(".twentytwenty-handle"); 35 slider.append("<span class='twentytwenty-" + beforeDirection + "-arrow'></span>"); 36 slider.append("<span class='twentytwenty-" + afterDirection + "-arrow'></span>"); 37 container.addClass("twentytwenty-container"); 38 beforeImg.addClass("twentytwenty-before"); 39 afterImg.addClass("twentytwenty-after"); 40 41 var calcOffset = function(dimensionPct) { 42 var w = beforeImg.width(); 43 var h = beforeImg.height(); 44 return { 45 w: w+"px", 46 h: h+"px", 47 cw: (dimensionPct*w)+"px", 48 ch: (dimensionPct*h)+"px" 49 }; 50 }; 51 52 var adjustContainer = function(offset) { 53 if (sliderOrientation === 'vertical') { 54 beforeImg.css("clip", "rect(0,"+offset.w+","+offset.ch+",0)"); 55 afterImg.css("clip", "rect("+offset.ch+","+offset.w+","+offset.h+",0)"); 56 } 57 else { 58 beforeImg.css("clip", "rect(0,"+offset.cw+","+offset.h+",0)"); 59 afterImg.css("clip", "rect(0,"+offset.w+","+offset.h+","+offset.cw+")"); 60 } 61 container.css("height", offset.h); 62 }; 63 64 var adjustSlider = function(pct) { 65 var offset = calcOffset(pct); 66 slider.css((sliderOrientation==="vertical") ? "top" : "left", (sliderOrientation==="vertical") ? offset.ch : offset.cw); 67 adjustContainer(offset); 68 }; 69 70 // Return the number specified or the min/max number if it outside the range given. 71 var minMaxNumber = function(num, min, max) { 72 return Math.max(min, Math.min(max, num)); 73 }; 74 75 // Calculate the slider percentage based on the position. 76 var getSliderPercentage = function(positionX, positionY) { 77 var sliderPercentage = (sliderOrientation === 'vertical') ? 78 (positionY-offsetY)/imgHeight : 79 (positionX-offsetX)/imgWidth; 80 81 return minMaxNumber(sliderPercentage, 0, 1); 82 }; 83 84 85 $(window).on("resize.twentytwenty", function(e) { 86 adjustSlider(sliderPct); 87 }); 88 89 var offsetX = 0; 90 var offsetY = 0; 91 var imgWidth = 0; 92 var imgHeight = 0; 93 var onMoveStart = function(e) { 94 if (((e.distX > e.distY && e.distX < -e.distY) || (e.distX < e.distY && e.distX > -e.distY)) && sliderOrientation !== 'vertical') { 95 e.preventDefault(); 96 } 97 else if (((e.distX < e.distY && e.distX < -e.distY) || (e.distX > e.distY && e.distX > -e.distY)) && sliderOrientation === 'vertical') { 98 e.preventDefault(); 99 } 100 container.addClass("active"); 101 offsetX = container.offset().left; 102 offsetY = container.offset().top; 103 imgWidth = beforeImg.width(); 104 imgHeight = beforeImg.height(); 105 }; 106 var onMove = function(e) { 107 if (container.hasClass("active")) { 108 sliderPct = getSliderPercentage(e.pageX, e.pageY); 109 adjustSlider(sliderPct); 110 } 111 }; 112 var onMoveEnd = function() { 113 container.removeClass("active"); 114 }; 115 116 var moveTarget = options.move_with_handle_only ? slider : container; 117 moveTarget.on("movestart",onMoveStart); 118 moveTarget.on("move",onMove); 119 moveTarget.on("moveend",onMoveEnd); 120 121 if (options.move_slider_on_hover) { 122 container.on("mouseenter", onMoveStart); 123 container.on("mousemove", onMove); 124 container.on("mouseleave", onMoveEnd); 125 } 126 127 slider.on("touchmove", function(e) { 128 e.preventDefault(); 129 }); 130 131 container.find("img").on("mousedown", function(event) { 132 event.preventDefault(); 133 }); 134 135 if (options.click_to_move) { 136 container.on('click', function(e) { 137 offsetX = container.offset().left; 138 offsetY = container.offset().top; 139 imgWidth = beforeImg.width(); 140 imgHeight = beforeImg.height(); 141 142 sliderPct = getSliderPercentage(e.pageX, e.pageY); 143 adjustSlider(sliderPct); 144 }); 145 } 146 147 $(window).trigger("resize.twentytwenty"); 148 }); 149 }; 150 151})(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.