lazy_img_rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +41 -0
- data/lib/lazy_img_rails.rb +9 -0
- data/lib/lazy_img_rails/railtie.rb +9 -0
- data/lib/lazy_img_rails/version.rb +3 -0
- data/lib/lazy_img_rails/view_helpers.rb +10 -0
- data/vendor/assets/javascripts/lazyload.js +337 -0
- metadata +93 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 39840ac81c2219c9d99b90c523527fe9d4c0e87f
|
4
|
+
data.tar.gz: 93006a07afaf56e8f0cd53a1a70e5e27ae1091d6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ccd26a8a4b2f828ca364354a18cb853b8595a6a813157ca95c64713527b296aef36ed8a1b585d816b12371211b1499989073c2310818ce6136908f211705e395
|
7
|
+
data.tar.gz: 62b360069d2b9f6c3dda0776596b3f9ccdc9fefff02dd020dd9cf276cc4dc7fd43e4ed55e895a4bd090ef063cfde0779af0599a5dca6285e66e0571eca7f4f56
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# LazyImgRails
|
2
|
+
|
3
|
+
Fork of https://github.com/angelodlfrtr/lazyloadjs
|
4
|
+
which use https://github.com/vvo/lazyload/ js lib
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'lazy_img_rails'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle install
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install lazy_img_rails
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
Add lazyloadjs in Assets Pipeline (e.g. `app/assets/javascripts/application.js`)
|
23
|
+
|
24
|
+
# Add it after all your others scripts
|
25
|
+
//= lazyload
|
26
|
+
|
27
|
+
Restart your application. Done.
|
28
|
+
|
29
|
+
This gem provides a helper that allows you to render `<img>` tag
|
30
|
+
|
31
|
+
# image_tag_lazy 'image_url', *options
|
32
|
+
# eg
|
33
|
+
= image_tag_lazy image_url("my_logo.png"), style: "height: 200px;", alt: "My logo"
|
34
|
+
|
35
|
+
## Contributing
|
36
|
+
|
37
|
+
1. Fork it ( https://github.com/trrbl/lazy_img_rails/fork )
|
38
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
39
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
40
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
41
|
+
5. Create new Pull Request
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module LazyImgRails
|
2
|
+
module ViewHelpers
|
3
|
+
def image_tag_lazy image_path, args = {}
|
4
|
+
options = ''
|
5
|
+
args.each{|arg| options += "#{arg[0]}='#{arg[1]}'"}
|
6
|
+
|
7
|
+
raw "<img data-src='#{image_path}' src=data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== onload=lzld(this) onerror=lzld(this) #{options} />"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,337 @@
|
|
1
|
+
/**
|
2
|
+
* @license in-viewport v0.4.1 | github.com/vvo/in-viewport#license
|
3
|
+
*/
|
4
|
+
|
5
|
+
(function(win, doc){
|
6
|
+
var instances = [];
|
7
|
+
|
8
|
+
win['inViewport'] = inViewport;
|
9
|
+
|
10
|
+
function inViewport(elt, params, cb) {
|
11
|
+
var opts = {
|
12
|
+
container: doc.body,
|
13
|
+
offset: 0
|
14
|
+
};
|
15
|
+
|
16
|
+
if (params === undefined || typeof params === 'function') {
|
17
|
+
cb = params;
|
18
|
+
params = {};
|
19
|
+
}
|
20
|
+
|
21
|
+
var container = opts.container = params['container'] || opts.container;
|
22
|
+
var offset = opts.offset = params['offset'] || opts.offset;
|
23
|
+
|
24
|
+
for (var i = 0; i < instances.length; i++) {
|
25
|
+
if (instances[i].container === container) {
|
26
|
+
return instances[i].inViewport(elt, offset, cb);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
return instances[
|
31
|
+
instances.push(createInViewport(container)) - 1
|
32
|
+
].inViewport(elt, offset, cb)
|
33
|
+
}
|
34
|
+
|
35
|
+
function addEvent( el, type, fn ) {
|
36
|
+
if (el.attachEvent) {
|
37
|
+
el.attachEvent( 'on' + type, fn );
|
38
|
+
} else {
|
39
|
+
el.addEventListener( type, fn, false );
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
function debounce(func, wait, immediate) {
|
44
|
+
var timeout;
|
45
|
+
return function() {
|
46
|
+
var context = this, args = arguments;
|
47
|
+
var later = function() {
|
48
|
+
timeout = null;
|
49
|
+
if (!immediate) func.apply(context, args);
|
50
|
+
};
|
51
|
+
var callNow = immediate && !timeout;
|
52
|
+
clearTimeout(timeout);
|
53
|
+
timeout = setTimeout(later, wait);
|
54
|
+
if (callNow) func.apply(context, args);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
// https://github.com/jquery/sizzle/blob/3136f48b90e3edc84cbaaa6f6f7734ef03775a07/sizzle.js#L708
|
59
|
+
var contains = document.documentElement.compareDocumentPosition ?
|
60
|
+
function( a, b ) {
|
61
|
+
return !!(a.compareDocumentPosition( b ) & 16);
|
62
|
+
} :
|
63
|
+
document.documentElement.contains ?
|
64
|
+
function( a, b ) {
|
65
|
+
return a !== b && ( a.contains ? a.contains( b ) : false );
|
66
|
+
} :
|
67
|
+
function( a, b ) {
|
68
|
+
while ( (b = b.parentNode) ) {
|
69
|
+
if ( b === a ) {
|
70
|
+
return true;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
return false;
|
74
|
+
};
|
75
|
+
|
76
|
+
function createInViewport(container) {
|
77
|
+
var watches = [];
|
78
|
+
var watching = [];
|
79
|
+
|
80
|
+
var scrollContainer = container === doc.body ? win : container;
|
81
|
+
var debouncedCheck = debounce(checkElements, 15);
|
82
|
+
|
83
|
+
addEvent(scrollContainer, 'scroll', debouncedCheck);
|
84
|
+
|
85
|
+
|
86
|
+
if (scrollContainer === win) {
|
87
|
+
addEvent(win, 'resize', debouncedCheck);
|
88
|
+
}
|
89
|
+
|
90
|
+
if (typeof window['MutationObserver'] === 'function') {
|
91
|
+
observeDOM(watching, container, debouncedCheck);
|
92
|
+
}
|
93
|
+
|
94
|
+
function inViewport(elt, offset, cb) {
|
95
|
+
if (!contains(doc.documentElement, elt) ||
|
96
|
+
!contains(doc.documentElement, container)) {
|
97
|
+
if (cb) {
|
98
|
+
return setTimeout(addWatch(elt, offset, cb), 0);
|
99
|
+
} else {
|
100
|
+
return false;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
var eltRect = elt.getBoundingClientRect();
|
105
|
+
var containerRect = container.getBoundingClientRect();
|
106
|
+
|
107
|
+
var pos = {
|
108
|
+
left: eltRect.left,
|
109
|
+
top: eltRect.top
|
110
|
+
};
|
111
|
+
|
112
|
+
var viewport = {
|
113
|
+
width: offset,
|
114
|
+
height: offset
|
115
|
+
};
|
116
|
+
|
117
|
+
if (container === doc.body) {
|
118
|
+
viewport.width += doc.documentElement.clientWidth;
|
119
|
+
viewport.height += doc.documentElement.clientHeight;
|
120
|
+
|
121
|
+
// We update body rect computing because
|
122
|
+
// when you have relative/absolute childs, you get bad compute
|
123
|
+
// we need to create a new Object, because it's read only
|
124
|
+
containerRect = {
|
125
|
+
bottom: container.scrollHeight,
|
126
|
+
top: 0,
|
127
|
+
left: 0,
|
128
|
+
right: container.scrollWidth
|
129
|
+
};
|
130
|
+
} else {
|
131
|
+
pos.left -= containerRect.left;
|
132
|
+
pos.top -= containerRect.top;
|
133
|
+
viewport.width += container.clientWidth;
|
134
|
+
viewport.height += container.clientHeight;
|
135
|
+
}
|
136
|
+
|
137
|
+
var visible =
|
138
|
+
// 1. They must overlap
|
139
|
+
!(
|
140
|
+
eltRect.right < containerRect.left ||
|
141
|
+
eltRect.left > containerRect.right ||
|
142
|
+
eltRect.bottom < containerRect.top ||
|
143
|
+
eltRect.top > containerRect.bottom
|
144
|
+
) && (
|
145
|
+
// 2. They must be visible in the viewport
|
146
|
+
pos.top <= viewport.height &&
|
147
|
+
pos.left <= viewport.width
|
148
|
+
);
|
149
|
+
|
150
|
+
if (visible) {
|
151
|
+
if (cb) {
|
152
|
+
watching.splice(indexOf.call(watching, elt), 1);
|
153
|
+
cb(elt);
|
154
|
+
} else {
|
155
|
+
return true;
|
156
|
+
}
|
157
|
+
} else {
|
158
|
+
if (cb) {
|
159
|
+
setTimeout(addWatch(elt, offset, cb), 0);
|
160
|
+
} else {
|
161
|
+
return false;
|
162
|
+
}
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
function addWatch(elt, offset, cb) {
|
167
|
+
if (indexOf.call(watching, elt) === -1) {
|
168
|
+
watching.push(elt);
|
169
|
+
}
|
170
|
+
|
171
|
+
return function() {
|
172
|
+
watches.push(function() {
|
173
|
+
inViewport(elt, offset, cb);
|
174
|
+
});
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
function checkElements() {
|
179
|
+
var cb;
|
180
|
+
while(cb = watches.shift()) {
|
181
|
+
cb();
|
182
|
+
}
|
183
|
+
}
|
184
|
+
|
185
|
+
return {
|
186
|
+
container: container,
|
187
|
+
inViewport: inViewport
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
function indexOf(value) {
|
192
|
+
for (var i = this.length; i-- && this[i] !== value;) {}
|
193
|
+
return i;
|
194
|
+
}
|
195
|
+
|
196
|
+
function observeDOM(elements, container, cb) {
|
197
|
+
var observer = new MutationObserver(watch);
|
198
|
+
var filter = Array.prototype.filter;
|
199
|
+
|
200
|
+
observer.observe(container, {
|
201
|
+
childList: true,
|
202
|
+
subtree: true
|
203
|
+
});
|
204
|
+
|
205
|
+
function watch(mutations) {
|
206
|
+
// some new DOM nodes where previously watched
|
207
|
+
// we should check their positions
|
208
|
+
if (mutations.some(knownNodes) === true) {
|
209
|
+
setTimeout(cb, 0);
|
210
|
+
}
|
211
|
+
}
|
212
|
+
|
213
|
+
function isWatched(node) {
|
214
|
+
return indexOf.call(elements, node) !== -1;
|
215
|
+
}
|
216
|
+
|
217
|
+
function knownNodes(mutation) {
|
218
|
+
return filter.call(mutation.addedNodes, isWatched).length > 0
|
219
|
+
}
|
220
|
+
}
|
221
|
+
|
222
|
+
})(window, document);
|
223
|
+
/**
|
224
|
+
* @license lazyload v2.1.1 | github.com/vvo/lazyload#license
|
225
|
+
*/
|
226
|
+
|
227
|
+
(function(window, document){
|
228
|
+
|
229
|
+
var lazyAttrs = ['data-src'];
|
230
|
+
|
231
|
+
window['lazyload'] = lazyload;
|
232
|
+
window['lzld'] = lazyload();
|
233
|
+
|
234
|
+
// Provide libs using getAttribute early to get the good src
|
235
|
+
// and not the fake data-src
|
236
|
+
replaceGetAttribute('Image');
|
237
|
+
replaceGetAttribute('IFrame');
|
238
|
+
|
239
|
+
function registerLazyAttr(attr) {
|
240
|
+
if (indexOf.call(lazyAttrs, attr) === -1) {
|
241
|
+
lazyAttrs.push(attr);
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
245
|
+
function lazyload(opts) {
|
246
|
+
|
247
|
+
if (arguments.length > 1) {
|
248
|
+
return inViewport.apply(undefined, arguments);
|
249
|
+
}
|
250
|
+
|
251
|
+
opts = merge({
|
252
|
+
'offset': 333,
|
253
|
+
'src': 'data-src',
|
254
|
+
'container': false
|
255
|
+
}, opts || {});
|
256
|
+
|
257
|
+
if (typeof opts['src'] === 'string') {
|
258
|
+
registerLazyAttr(opts['src']);
|
259
|
+
}
|
260
|
+
|
261
|
+
var elts = [];
|
262
|
+
|
263
|
+
function show(elt) {
|
264
|
+
var src = findRealSrc(elt);
|
265
|
+
|
266
|
+
if (src) {
|
267
|
+
elt.src = src;
|
268
|
+
}
|
269
|
+
|
270
|
+
elt['data-lzled'] = true;
|
271
|
+
elts[indexOf.call(elts, elt)] = null;
|
272
|
+
}
|
273
|
+
|
274
|
+
function findRealSrc(elt) {
|
275
|
+
if (typeof opts['src'] === 'function') {
|
276
|
+
return opts['src'](elt);
|
277
|
+
} else {
|
278
|
+
return elt.getAttribute(opts['src']);
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
function register(elt) {
|
283
|
+
// unsubscribe onload
|
284
|
+
// needed by IE < 9, otherwise we get another onload when changing the src
|
285
|
+
elt.onload = null;
|
286
|
+
elt.removeAttribute('onload');
|
287
|
+
|
288
|
+
if (indexOf.call(elts, elt) === -1) {
|
289
|
+
inViewport(elt, opts, show);
|
290
|
+
}
|
291
|
+
}
|
292
|
+
|
293
|
+
return register;
|
294
|
+
}
|
295
|
+
|
296
|
+
function replaceGetAttribute(elementName) {
|
297
|
+
var fullname = 'HTML' + elementName + 'Element';
|
298
|
+
if (fullname in window === false) {
|
299
|
+
return;
|
300
|
+
}
|
301
|
+
|
302
|
+
var original = window[fullname].prototype.getAttribute;
|
303
|
+
window[fullname].prototype.getAttribute = function(name) {
|
304
|
+
if(name === 'src') {
|
305
|
+
var realSrc;
|
306
|
+
for (var i = 0, max = lazyAttrs.length; i < max; i++) {
|
307
|
+
if (realSrc = original.call(this, lazyAttrs[i])) {
|
308
|
+
break;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
|
312
|
+
return realSrc || original.call(this, name);
|
313
|
+
} else {
|
314
|
+
// our own lazyloader will go through theses lines
|
315
|
+
// because we use getAttribute(opts.src)
|
316
|
+
return original.call(this, name);
|
317
|
+
}
|
318
|
+
}
|
319
|
+
}
|
320
|
+
|
321
|
+
function merge(defaults, opts) {
|
322
|
+
for (var name in defaults) {
|
323
|
+
if (opts[name] === undefined) {
|
324
|
+
opts[name] = defaults[name];
|
325
|
+
}
|
326
|
+
}
|
327
|
+
|
328
|
+
return opts;
|
329
|
+
}
|
330
|
+
|
331
|
+
// http://webreflection.blogspot.fr/2011/06/partial-polyfills.html
|
332
|
+
function indexOf(value) {
|
333
|
+
for (var i = this.length; i-- && this[i] !== value;) {}
|
334
|
+
return i;
|
335
|
+
}
|
336
|
+
|
337
|
+
}(window, document));
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lazy_img_rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Stanislav Schultz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: railties
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Implementing LazyLoad ( https://github.com/vvo/lazyload/ ) for Ruby on
|
56
|
+
Rails
|
57
|
+
email:
|
58
|
+
- trrblspirit@gmail.com
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- README.md
|
64
|
+
- lib/lazy_img_rails.rb
|
65
|
+
- lib/lazy_img_rails/railtie.rb
|
66
|
+
- lib/lazy_img_rails/version.rb
|
67
|
+
- lib/lazy_img_rails/view_helpers.rb
|
68
|
+
- vendor/assets/javascripts/lazyload.js
|
69
|
+
homepage: http://github.com/trrbl/lazy_img_rails/
|
70
|
+
licenses:
|
71
|
+
- MIT
|
72
|
+
metadata: {}
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
requirements: []
|
88
|
+
rubyforge_project:
|
89
|
+
rubygems_version: 2.2.2
|
90
|
+
signing_key:
|
91
|
+
specification_version: 4
|
92
|
+
summary: Implementing LazyLoad ( https://github.com/vvo/lazyload/ ) for Ruby on Rails
|
93
|
+
test_files: []
|