├── .gitignore
├── README.md
├── bower.json
├── index.html
├── me-lazyload.js
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | bower_components
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## me-lazyload
2 | Images lazyload directive for angular.
3 |
4 | ### Demo
5 | Demo Site: http://treri.github.io/me-lazyload
6 |
7 | ### Basic Usage
8 | 1. include me-lazyload.js as dependence.
9 |
10 | var app = angular.module('myApp', ['me-lazyload'])
11 |
12 | 2. instead `src` with `lazy-src`.
13 |
14 |
15 |
16 | 3. All Done!
17 |
18 | ### Optional Parameters
19 | Additional parameters can be added, example:
20 |
21 |
22 |
23 | The following is a list of all the additional parameters:
24 |
25 | | Paramater | Remark | Value (Example) | Default Value |
26 | | --- | --- | --- | --- |
27 | | `animate-visible` | If set true, all images (include those initially visible) will be animated. Please note that by default initial visible images will be displayed immediately without fading | "true" | "false" |
28 | | `animate-speed` | The speed of the animation in seconds or milliseconds | "0.5s" | "1s" |
29 |
30 | ### License
31 | MIT
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "me-lazyload",
3 | "main": "me-lazyload.js",
4 | "version": "0.0.5",
5 | "homepage": "https://github.com/jeremial/me-lazyload",
6 | "authors": [
7 | "Jeremial "
8 | ],
9 | "description": "image lazyload directive for angular",
10 | "keywords": [
11 | "angular",
12 | "lazyload"
13 | ],
14 | "license": "MIT",
15 | "ignore": [
16 | "**/.*",
17 | "node_modules",
18 | "bower_components",
19 | "test",
20 | "tests"
21 | ],
22 | "dependencies": {
23 | "angular": "~1.2.20"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | me-lazyload
6 |
27 |
28 |
29 | me-lazyload
30 |
31 |
32 |
![]()
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
52 |
53 |
--------------------------------------------------------------------------------
/me-lazyload.js:
--------------------------------------------------------------------------------
1 | angular.module('me-lazyload', [])
2 | .directive('lazySrc', ['$window', '$document', function($window, $document){
3 | var doc = $document[0],
4 | body = doc.body,
5 | win = $window,
6 | $win = angular.element(win),
7 | uid = 0,
8 | elements = {};
9 |
10 | function getUid(el){
11 | var __uid = el.data("__uid");
12 | if (! __uid) {
13 | el.data("__uid", (__uid = '' + ++uid));
14 | }
15 | return __uid;
16 | }
17 |
18 | function getWindowOffset(){
19 | var t,
20 | pageXOffset = (typeof win.pageXOffset == 'number') ? win.pageXOffset : (((t = doc.documentElement) || (t = body.parentNode)) && typeof t.scrollLeft == 'number' ? t : body).scrollLeft,
21 | pageYOffset = (typeof win.pageYOffset == 'number') ? win.pageYOffset : (((t = doc.documentElement) || (t = body.parentNode)) && typeof t.scrollTop == 'number' ? t : body).scrollTop;
22 | return {
23 | offsetX: pageXOffset,
24 | offsetY: pageYOffset
25 | };
26 | }
27 |
28 | function isVisible(iElement){
29 | var elem = iElement[0],
30 | elemRect = elem.getBoundingClientRect(),
31 | windowOffset = getWindowOffset(),
32 | winOffsetX = windowOffset.offsetX,
33 | winOffsetY = windowOffset.offsetY,
34 | elemWidth = elemRect.width || elem.width,
35 | elemHeight = elemRect.height || elem.height,
36 | elemOffsetX = elemRect.left + winOffsetX,
37 | elemOffsetY = elemRect.top + winOffsetY,
38 | viewWidth = Math.max(doc.documentElement.clientWidth, win.innerWidth || 0),
39 | viewHeight = Math.max(doc.documentElement.clientHeight, win.innerHeight || 0),
40 | xVisible,
41 | yVisible;
42 |
43 | if(elemOffsetY <= winOffsetY){
44 | if(elemOffsetY + elemHeight >= winOffsetY){
45 | yVisible = true;
46 | }
47 | }else if(elemOffsetY >= winOffsetY){
48 | if(elemOffsetY <= winOffsetY + viewHeight){
49 | yVisible = true;
50 | }
51 | }
52 |
53 | if(elemOffsetX <= winOffsetX){
54 | if(elemOffsetX + elemWidth >= winOffsetX){
55 | xVisible = true;
56 | }
57 | }else if(elemOffsetX >= winOffsetX){
58 | if(elemOffsetX <= winOffsetX + viewWidth){
59 | xVisible = true;
60 | }
61 | }
62 |
63 | return xVisible && yVisible;
64 | };
65 |
66 | function checkImage(){
67 | angular.forEach(elements, function(obj, key) {
68 | var iElement = obj.iElement,
69 | $scope = obj.$scope;
70 | if(isVisible(iElement)){
71 | iElement.attr('src', $scope.lazySrc);
72 | }
73 | });
74 | }
75 |
76 | $win.bind('scroll', checkImage);
77 | $win.bind('resize', checkImage);
78 |
79 | function onLoad(){
80 | var $el = angular.element(this),
81 | uid = getUid($el);
82 |
83 | $el.css('opacity', 1);
84 |
85 | if(elements.hasOwnProperty(uid)){
86 | delete elements[uid];
87 | }
88 | }
89 |
90 | return {
91 | restrict: 'A',
92 | scope: {
93 | lazySrc: '@',
94 | animateVisible: '@',
95 | animateSpeed: '@'
96 | },
97 | link: function($scope, iElement){
98 | iElement.bind('load', onLoad);
99 |
100 | $scope.$watch('lazySrc', function(){
101 | var speed = "1s";
102 | if ($scope.animateSpeed != null) {
103 | speed = $scope.animateSpeed;
104 | }
105 | if(isVisible(iElement)){
106 | if ($scope.animateVisible) {
107 | iElement.css({
108 | 'opacity': 0,
109 | '-webkit-transition': 'opacity ' + speed,
110 | 'transition': 'opacity ' + speed
111 | });
112 | }
113 | iElement.attr('src', $scope.lazySrc);
114 | }else{
115 | var uid = getUid(iElement);
116 | iElement.css({
117 | 'opacity': 0,
118 | '-webkit-transition': 'opacity ' + speed,
119 | 'transition': 'opacity ' + speed
120 | });
121 | elements[uid] = {
122 | iElement: iElement,
123 | $scope: $scope
124 | };
125 | }
126 | });
127 |
128 | $scope.$on('$destroy', function(){
129 | iElement.unbind('load');
130 | var uid = getUid(iElement);
131 | if(elements.hasOwnProperty(uid)){
132 | delete elements[uid];
133 | }
134 | });
135 | }
136 | };
137 | }]);
138 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "me-lazyload",
3 | "version": "0.0.6",
4 | "description": "image lazyload directive for angular",
5 | "main": "me-lazyload.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/Treri/me-lazyload.git"
12 | },
13 | "keywords": [
14 | "angular",
15 | "lazyload"
16 | ],
17 | "author": "Treri",
18 | "license": "MIT",
19 | "bugs": {
20 | "url": "https://github.com/Treri/me-lazyload/issues"
21 | },
22 | "homepage": "https://github.com/Treri/me-lazyload"
23 | }
24 |
--------------------------------------------------------------------------------