mirror of https://github.com/toddmotto/echo.git
Todd Motto
12 years ago
commit
9847e92699
10 changed files with 403 additions and 0 deletions
@ -0,0 +1,20 @@
|
||||
# EditorConfig helps developers define and maintain consistent |
||||
# coding styles between different editors and IDEs |
||||
# editorconfig.org |
||||
|
||||
root = true |
||||
|
||||
[*] |
||||
|
||||
# Change these settings to your own preference |
||||
indent_style = space |
||||
indent_size = 2 |
||||
|
||||
# We recommend you to keep these unchanged |
||||
end_of_line = lf |
||||
charset = utf-8 |
||||
trim_trailing_whitespace = true |
||||
insert_final_newline = true |
||||
|
||||
[*.md] |
||||
trim_trailing_whitespace = false |
@ -0,0 +1,22 @@
|
||||
{ |
||||
"node": true, |
||||
"browser": true, |
||||
"es5": true, |
||||
"esnext": true, |
||||
"bitwise": true, |
||||
"camelcase": true, |
||||
"curly": true, |
||||
"eqeqeq": true, |
||||
"immed": true, |
||||
"indent": 2, |
||||
"latedef": true, |
||||
"newcap": true, |
||||
"noarg": true, |
||||
"quotmark": "single", |
||||
"regexp": true, |
||||
"undef": true, |
||||
"unused": true, |
||||
"strict": true, |
||||
"trailing": false, |
||||
"smarttabs": true |
||||
} |
@ -0,0 +1,5 @@
|
||||
language: node_js |
||||
node_js: |
||||
- "0.11" |
||||
- "0.10" |
||||
- "0.8" |
@ -0,0 +1,87 @@
|
||||
/*! |
||||
* Gruntfile.js configuration |
||||
*/ |
||||
|
||||
'use strict'; |
||||
|
||||
module.exports = function ( grunt ) { |
||||
|
||||
/* |
||||
* Dynamically load the npm tasks |
||||
*/ |
||||
require( 'matchdep' ).filterDev('grunt-*').forEach( grunt.loadNpmTasks ); |
||||
|
||||
/* |
||||
* Grunt init |
||||
*/ |
||||
grunt.initConfig({ |
||||
|
||||
/* |
||||
* Grunt JSON for project |
||||
*/ |
||||
pkg: grunt.file.readJSON( 'package.json' ), |
||||
|
||||
/* |
||||
* Credit banner |
||||
*/ |
||||
tag: { |
||||
banner: "/*!\n" + |
||||
" * <%= pkg.title %>\n" + |
||||
" * @version <%= pkg.version %>\n" + |
||||
" * @author <%= pkg.author[0].name %> <%= pkg.author[1].url %>\n" + |
||||
" * Project: <%= pkg.homepage %>\n" + |
||||
" *\n" + |
||||
" * <%= pkg.description %>\n" + |
||||
" * Copyright <%= pkg.year %>." + |
||||
" <%= pkg.licenses[0].type %> licensed.\n" + |
||||
" */\n" |
||||
}, |
||||
|
||||
/* |
||||
* jsHint |
||||
*/ |
||||
jshint: { |
||||
files: ["src/echo.js"], |
||||
options: { |
||||
jshintrc: ".jshintrc" |
||||
} |
||||
}, |
||||
|
||||
/* |
||||
* Concat |
||||
*/ |
||||
concat: { |
||||
dist: { |
||||
src: ["src/echo.js"], |
||||
dest: "dist/echo.js" |
||||
}, |
||||
options: { |
||||
banner: "<%= tag.banner %>" |
||||
} |
||||
}, |
||||
|
||||
/* |
||||
* UglifyJS |
||||
*/ |
||||
uglify: { |
||||
files: { |
||||
src: ["dist/echo.js"], |
||||
dest: "dist/echo.min.js" |
||||
}, |
||||
options: { |
||||
banner: "<%= tag.banner %>" |
||||
} |
||||
} |
||||
|
||||
}); |
||||
|
||||
/* |
||||
* Register tasks |
||||
*/ |
||||
grunt.registerTask("default", [ |
||||
"jshint", |
||||
"concat", |
||||
"uglify" |
||||
]); |
||||
|
||||
}; |
@ -0,0 +1,54 @@
|
||||
# Echo [![Build Status](https://travis-ci.org/toddmotto/echo.png)](https://travis-ci.org/toddmotto/echo) |
||||
|
||||
|
||||
|
||||
```html |
||||
<img src="img/blank.gif" alt="Photo" data-echo="img/photo.jpg"> |
||||
``` |
||||
|
||||
## Demo |
||||
Check out a [demo of Echo](http://toddmotto.com/labs/echo). |
||||
|
||||
## Installing with Bower |
||||
To install Echo into your project using Bower, use the GitHub repository hook: |
||||
|
||||
``` |
||||
bower install https://github.com/toddmotto/echo.git |
||||
``` |
||||
|
||||
## Manual installation |
||||
Drop your files into your required folders, make sure you're using the file(s) from the `dist` folder, which is the compiled production-ready code. Ensure you place the script before the closing `</body>` tag so the DOM tree is populated when the script runs. |
||||
|
||||
```html |
||||
<body> |
||||
<!-- html content above --> |
||||
<script src="dist/echo.js"></script> |
||||
</body> |
||||
``` |
||||
|
||||
## Configuring Echo |
||||
Echo config is super-simple, just add the image that needs to load when visible in a `data-echo` attribute: |
||||
|
||||
```html |
||||
<img src="img/blank.gif" alt="Photo" data-echo="img/photo.jpg"> |
||||
``` |
||||
|
||||
## Scaffolding |
||||
Project files and folder structure. |
||||
|
||||
``` |
||||
├── dist/ |
||||
│ ├── echo.js |
||||
│ └── echo.min.js |
||||
├── src/ |
||||
│ └── echo.js |
||||
├── .editorconfig |
||||
├── .gitignore |
||||
├── .jshintrc |
||||
├── .travis.yml |
||||
├── Gruntfile.js |
||||
└── package.json |
||||
``` |
||||
|
||||
## License |
||||
MIT license |
@ -0,0 +1,94 @@
|
||||
/*! |
||||
* Echo |
||||
* @version 1.0.0 |
||||
* @author Todd Motto http://toddmotto.com
|
||||
* Project: https://github.com/toddmotto/echo
|
||||
* |
||||
* Raw JavaScript lazy-loading images with HTML5 data-* attributes. |
||||
* Copyright 2013. MIT licensed. |
||||
*/ |
||||
window.echo = (function (window, document) { |
||||
|
||||
'use strict'; |
||||
|
||||
/* |
||||
* Constructor function |
||||
*/ |
||||
var Echo = function (elem) { |
||||
this.elem = elem; |
||||
this.render(); |
||||
this.listen(); |
||||
}; |
||||
|
||||
/* |
||||
* Images for echoing |
||||
*/ |
||||
var echoStore = []; |
||||
|
||||
/* |
||||
* Element in viewport logic |
||||
*/ |
||||
var scrolledIntoView = function (element) { |
||||
var coords = element.getBoundingClientRect(); |
||||
return ((coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight)); |
||||
}; |
||||
|
||||
/* |
||||
* Changing src attr logic |
||||
*/ |
||||
var echoSrc = function (img, callback) { |
||||
img.src = img.getAttribute('data-echo'); |
||||
if (callback) { |
||||
callback(); |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Remove loaded item from array |
||||
*/ |
||||
var removeEcho = function (element, index) { |
||||
if (echoStore.indexOf(element) !== -1) { |
||||
echoStore.splice(index, 1); |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Echo the images and callbacks |
||||
*/ |
||||
var echoImages = function () { |
||||
for (var i = 0; i < echoStore.length; i++) { |
||||
var self = echoStore[i]; |
||||
if (scrolledIntoView(self)) { |
||||
echoSrc(self, removeEcho(self, i)); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Prototypal setup |
||||
*/ |
||||
Echo.prototype = { |
||||
init : function () { |
||||
echoStore.push(this.elem); |
||||
}, |
||||
render : function () { |
||||
if (document.addEventListener) { |
||||
document.addEventListener('DOMContentLoaded', echoImages, false); |
||||
} else { |
||||
window.onload = echoImages; |
||||
} |
||||
}, |
||||
listen : function () { |
||||
window.onscroll = echoImages; |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Initiate the plugin |
||||
*/ |
||||
var lazyImgs = document.querySelectorAll('img[data-echo]'); |
||||
for (var i = 0; i < lazyImgs.length; i++) { |
||||
new Echo(lazyImgs[i]).init(); |
||||
} |
||||
|
||||
})(window, document); |
@ -0,0 +1,10 @@
|
||||
/*! |
||||
* Echo |
||||
* @version 1.0.0 |
||||
* @author Todd Motto http://toddmotto.com
|
||||
* Project: https://github.com/toddmotto/echo
|
||||
* |
||||
* Raw JavaScript lazy-loading images with HTML5 data-* attributes. |
||||
* Copyright 2013. MIT licensed. |
||||
*/ |
||||
window.echo=function(a,b){"use strict";var c=function(a){this.elem=a,this.render(),this.listen()},d=[],e=function(c){var d=c.getBoundingClientRect();return(d.top>=0&&d.left>=0&&d.top)<=(a.innerHeight||b.documentElement.clientHeight)},f=function(a,b){a.src=a.getAttribute("data-echo"),b&&b()},g=function(a,b){-1!==d.indexOf(a)&&d.splice(b,1)},h=function(){for(var a=0;a<d.length;a++){var b=d[a];e(b)&&f(b,g(b,a))}};c.prototype={init:function(){d.push(this.elem)},render:function(){b.addEventListener?b.addEventListener("DOMContentLoaded",h,!1):a.onload=h},listen:function(){a.onscroll=h}};for(var i=b.querySelectorAll("img[data-echo]"),j=0;j<i.length;j++)new c(i[j]).init()}(window,document); |
@ -0,0 +1,22 @@
|
||||
{ |
||||
"name": "Echo", |
||||
"title": "Echo", |
||||
"description": "Raw JavaScript lazy-loading images with HTML5 data-* attributes.", |
||||
"author": [ |
||||
{ "name" : "Todd Motto" }, |
||||
{ "url" : "http://toddmotto.com" } |
||||
], |
||||
"homepage": "https://github.com/toddmotto/echo", |
||||
"licenses": [ |
||||
{ "type": "MIT" } |
||||
], |
||||
"year" : "2013", |
||||
"version": "1.0.0", |
||||
"devDependencies": { |
||||
"grunt": "~0.4.1", |
||||
"grunt-contrib-concat": "~0.3.0", |
||||
"grunt-contrib-uglify": "~0.2.0", |
||||
"grunt-contrib-jshint": "~0.4.3", |
||||
"matchdep": "~0.1.2" |
||||
} |
||||
} |
@ -0,0 +1,85 @@
|
||||
window.echo = (function (window, document) { |
||||
|
||||
'use strict'; |
||||
|
||||
/* |
||||
* Constructor function |
||||
*/ |
||||
var Echo = function (elem) { |
||||
this.elem = elem; |
||||
this.render(); |
||||
this.listen(); |
||||
}; |
||||
|
||||
/* |
||||
* Images for echoing |
||||
*/ |
||||
var echoStore = []; |
||||
|
||||
/* |
||||
* Element in viewport logic |
||||
*/ |
||||
var scrolledIntoView = function (element) { |
||||
var coords = element.getBoundingClientRect(); |
||||
return ((coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight)); |
||||
}; |
||||
|
||||
/* |
||||
* Changing src attr logic |
||||
*/ |
||||
var echoSrc = function (img, callback) { |
||||
img.src = img.getAttribute('data-echo'); |
||||
if (callback) { |
||||
callback(); |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Remove loaded item from array |
||||
*/ |
||||
var removeEcho = function (element, index) { |
||||
if (echoStore.indexOf(element) !== -1) { |
||||
echoStore.splice(index, 1); |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Echo the images and callbacks |
||||
*/ |
||||
var echoImages = function () { |
||||
for (var i = 0; i < echoStore.length; i++) { |
||||
var self = echoStore[i]; |
||||
if (scrolledIntoView(self)) { |
||||
echoSrc(self, removeEcho(self, i)); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Prototypal setup |
||||
*/ |
||||
Echo.prototype = { |
||||
init : function () { |
||||
echoStore.push(this.elem); |
||||
}, |
||||
render : function () { |
||||
if (document.addEventListener) { |
||||
document.addEventListener('DOMContentLoaded', echoImages, false); |
||||
} else { |
||||
window.onload = echoImages; |
||||
} |
||||
}, |
||||
listen : function () { |
||||
window.onscroll = echoImages; |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Initiate the plugin |
||||
*/ |
||||
var lazyImgs = document.querySelectorAll('img[data-echo]'); |
||||
for (var i = 0; i < lazyImgs.length; i++) { |
||||
new Echo(lazyImgs[i]).init(); |
||||
} |
||||
|
||||
})(window, document); |
Loading…
Reference in new issue