Mercurial > repos > saskia-hiltemann > ireport
comparison jquery.zoom.js @ 0:ac5f9272033b draft
first upload
author | saskia-hiltemann |
---|---|
date | Tue, 01 Jul 2014 11:42:23 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:ac5f9272033b |
---|---|
1 /*! | |
2 Zoom v1.7.13 - 2014-04-29 | |
3 Enlarge images on click or mouseover. | |
4 (c) 2014 Jack Moore - http://www.jacklmoore.com/zoom | |
5 license: http://www.opensource.org/licenses/mit-license.php | |
6 */ | |
7 (function ($) { | |
8 var defaults = { | |
9 url: false, | |
10 callback: false, | |
11 target: false, | |
12 duration: 120, | |
13 on: 'mouseover', // other options: grab, click, toggle | |
14 touch: true, // enables a touch fallback | |
15 onZoomIn: false, | |
16 onZoomOut: false, | |
17 magnify: 1 | |
18 }; | |
19 | |
20 // Core Zoom Logic, independent of event listeners. | |
21 $.zoom = function(target, source, img, magnify) { | |
22 var targetHeight, | |
23 targetWidth, | |
24 sourceHeight, | |
25 sourceWidth, | |
26 xRatio, | |
27 yRatio, | |
28 offset, | |
29 position = $(target).css('position'), | |
30 $source = $(source); | |
31 | |
32 // The parent element needs positioning so that the zoomed element can be correctly positioned within. | |
33 target.style.position = /(absolute|fixed)/.test(position) ? position : 'relative'; | |
34 target.style.overflow = 'hidden'; | |
35 | |
36 img.style.width = img.style.height = ''; | |
37 | |
38 $(img) | |
39 .addClass('zoomImg') | |
40 .css({ | |
41 position: 'absolute', | |
42 top: 0, | |
43 left: 0, | |
44 opacity: 0, | |
45 width: img.width * magnify, | |
46 height: img.height * magnify, | |
47 border: 'none', | |
48 maxWidth: 'none', | |
49 maxHeight: 'none' | |
50 }) | |
51 .appendTo(target); | |
52 | |
53 return { | |
54 init: function() { | |
55 targetWidth = $(target).outerWidth(); | |
56 targetHeight = $(target).outerHeight(); | |
57 | |
58 if (source === target) { | |
59 sourceWidth = targetWidth; | |
60 sourceHeight = targetHeight; | |
61 } else { | |
62 sourceWidth = $source.outerWidth(); | |
63 sourceHeight = $source.outerHeight(); | |
64 } | |
65 | |
66 xRatio = (img.width - targetWidth) / sourceWidth; | |
67 yRatio = (img.height - targetHeight) / sourceHeight; | |
68 | |
69 offset = $source.offset(); | |
70 }, | |
71 move: function (e) { | |
72 var left = (e.pageX - offset.left), | |
73 top = (e.pageY - offset.top); | |
74 | |
75 top = Math.max(Math.min(top, sourceHeight), 0); | |
76 left = Math.max(Math.min(left, sourceWidth), 0); | |
77 | |
78 img.style.left = (left * -xRatio) + 'px'; | |
79 img.style.top = (top * -yRatio) + 'px'; | |
80 } | |
81 }; | |
82 }; | |
83 | |
84 $.fn.zoom = function (options) { | |
85 return this.each(function () { | |
86 var | |
87 settings = $.extend({}, defaults, options || {}), | |
88 //target will display the zoomed image | |
89 target = settings.target || this, | |
90 //source will provide zoom location info (thumbnail) | |
91 source = this, | |
92 $source = $(source), | |
93 img = document.createElement('img'), | |
94 $img = $(img), | |
95 mousemove = 'mousemove.zoom', | |
96 clicked = false, | |
97 touched = false, | |
98 $urlElement; | |
99 | |
100 // If a url wasn't specified, look for an image element. | |
101 if (!settings.url) { | |
102 $urlElement = $source.find('img'); | |
103 if ($urlElement[0]) { | |
104 settings.url = $urlElement.data('src') || $urlElement.attr('src'); | |
105 } | |
106 if (!settings.url) { | |
107 return; | |
108 } | |
109 } | |
110 | |
111 (function(){ | |
112 var position = target.style.position; | |
113 var overflow = target.style.overflow; | |
114 | |
115 $source.one('zoom.destroy', function(){ | |
116 $source.off(".zoom"); | |
117 target.style.position = position; | |
118 target.style.overflow = overflow; | |
119 $img.remove(); | |
120 }); | |
121 | |
122 }()); | |
123 | |
124 img.onload = function () { | |
125 var zoom = $.zoom(target, source, img, settings.magnify); | |
126 | |
127 function start(e) { | |
128 zoom.init(); | |
129 zoom.move(e); | |
130 | |
131 // Skip the fade-in for IE8 and lower since it chokes on fading-in | |
132 // and changing position based on mousemovement at the same time. | |
133 $img.stop() | |
134 .fadeTo($.support.opacity ? settings.duration : 0, 1, $.isFunction(settings.onZoomIn) ? settings.onZoomIn.call(img) : false); | |
135 } | |
136 | |
137 function stop() { | |
138 $img.stop() | |
139 .fadeTo(settings.duration, 0, $.isFunction(settings.onZoomOut) ? settings.onZoomOut.call(img) : false); | |
140 } | |
141 | |
142 // Mouse events | |
143 if (settings.on === 'grab') { | |
144 $source | |
145 .on('mousedown.zoom', | |
146 function (e) { | |
147 if (e.which === 1) { | |
148 $(document).one('mouseup.zoom', | |
149 function () { | |
150 stop(); | |
151 | |
152 $(document).off(mousemove, zoom.move); | |
153 } | |
154 ); | |
155 | |
156 start(e); | |
157 | |
158 $(document).on(mousemove, zoom.move); | |
159 | |
160 e.preventDefault(); | |
161 } | |
162 } | |
163 ); | |
164 } else if (settings.on === 'click') { | |
165 $source.on('click.zoom', | |
166 function (e) { | |
167 if (clicked) { | |
168 // bubble the event up to the document to trigger the unbind. | |
169 return; | |
170 } else { | |
171 clicked = true; | |
172 start(e); | |
173 $(document).on(mousemove, zoom.move); | |
174 $(document).one('click.zoom', | |
175 function () { | |
176 stop(); | |
177 clicked = false; | |
178 $(document).off(mousemove, zoom.move); | |
179 } | |
180 ); | |
181 return false; | |
182 } | |
183 } | |
184 ); | |
185 } else if (settings.on === 'toggle') { | |
186 $source.on('click.zoom', | |
187 function (e) { | |
188 if (clicked) { | |
189 stop(); | |
190 } else { | |
191 start(e); | |
192 } | |
193 clicked = !clicked; | |
194 } | |
195 ); | |
196 } else if (settings.on === 'mouseover') { | |
197 zoom.init(); // Preemptively call init because IE7 will fire the mousemove handler before the hover handler. | |
198 | |
199 $source | |
200 .on('mouseenter.zoom', start) | |
201 .on('mouseleave.zoom', stop) | |
202 .on(mousemove, zoom.move); | |
203 } | |
204 | |
205 // Touch fallback | |
206 if (settings.touch) { | |
207 $source | |
208 .on('touchstart.zoom', function (e) { | |
209 e.preventDefault(); | |
210 if (touched) { | |
211 touched = false; | |
212 stop(); | |
213 } else { | |
214 touched = true; | |
215 start( e.originalEvent.touches[0] || e.originalEvent.changedTouches[0] ); | |
216 } | |
217 }) | |
218 .on('touchmove.zoom', function (e) { | |
219 e.preventDefault(); | |
220 zoom.move( e.originalEvent.touches[0] || e.originalEvent.changedTouches[0] ); | |
221 }); | |
222 } | |
223 | |
224 if ($.isFunction(settings.callback)) { | |
225 settings.callback.call(img); | |
226 } | |
227 }; | |
228 | |
229 img.src = settings.url; | |
230 }); | |
231 }; | |
232 | |
233 $.fn.zoom.defaults = defaults; | |
234 }(window.jQuery)); |