Skip to content

Commit 493b547

Browse files
committed
1.update: 抽离模板独立import;
2.fix: 抽离独立loading以修正快速滑动时,如果图片未加完,loading无法正常隐藏的BUG;:bug:
1 parent f228181 commit 493b547

File tree

9 files changed

+225
-42
lines changed

9 files changed

+225
-42
lines changed

demo/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,13 @@
8585
// thumbnail: 缩略图的链接(非必传)
8686
// url: 原图的链接(必传)
8787
var images = [
88-
{url: 'images/2.jpg'},
88+
{url: 'thumbnails/2.jpg'},
8989
{thumbnail: 'thumbnails/3.jpg', url: 'images/3.jpg'},
9090
{thumbnail: 'thumbnails/4.jpg', url: 'images/4.jpg'},
9191
{thumbnail: 'thumbnails/5.jpg', url: 'images/5.jpg'},
9292
{thumbnail: 'thumbnails/6.jpg', url: 'images/6.jpg'},
9393
{thumbnail: 'thumbnails/7.jpg', url: 'images/7.jpg'},
94-
{url: 'images/8.jpg'}
94+
{url: 'thumbnails/8.jpg'}
9595
];
9696
window.imageViewer = new ImageViewer(images, {
9797
container: 'body',

dist/imageViewer.common.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/imageViewer.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 149 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"eslint-plugin-node": "^6.0.1",
3737
"eslint-plugin-promise": "^3.7.0",
3838
"eslint-plugin-standard": "^3.1.0",
39+
"html-loader": "^0.5.5",
3940
"postcss-loader": "^2.1.4",
4041
"style-loader": "^0.21.0",
4142
"stylus": "^0.54.5",

src/core/imageViewer.js

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {isNumber, isPlainObject} from '../common/utils';
1717
import lock from '../common/lock';
1818
import Touch from './touch';
1919
import Viewer from './viewer';
20+
import template from '../html/template.html';
2021

2122
const defaultImgOption = {thumbnail: '', url: ''};
2223

@@ -32,7 +33,6 @@ class ImageViewer {
3233
this.animationEl = null;
3334
this.currentNumberEl = null;
3435
this.totalNumberEl = null;
35-
this.loadingEl = null;
3636
this.images = images; // 图片数据
3737
this.imagesLength = images.length; // 图片数据
3838
this.container = opt.container || 'body';
@@ -52,31 +52,16 @@ class ImageViewer {
5252
_create() {
5353
this.el = query('.image-viewer')[0];
5454
this.destroy();
55-
let imageViewerTemplate =
56-
`<div class="image-viewer">
57-
<div class="image-header"></div>
58-
<div class="image-body">
59-
<div class="viewer-wrapper">
60-
<div class="viewer"><div class="panel"><img><span></span></div></div>
61-
<div class="viewer"><div class="panel"><img><span></span></div></div>
62-
<div class="viewer"><div class="panel"><img><span></span></div></div>
63-
</div>
64-
</div>
65-
<div class="image-footer"></div>
66-
<div class="image-animation hide"><img></div>
67-
<div class="ball-clip-rotate hide"><div></div></div>
68-
</div>`;
6955

7056
const divEl = document.createElement('div');
71-
divEl.innerHTML = imageViewerTemplate;
57+
divEl.innerHTML = template;
7258
this.el = divEl.firstElementChild;
7359
query(this.container)[0].appendChild(this.el);
7460
this.headerEl = query('.image-header', this.el)[0];
7561
this.bodyEl = query('.image-body', this.el)[0];
7662
this.footerEl = query('.image-footer', this.el)[0];
7763
this.viewerWrapperEl = query('.image-body .viewer-wrapper', this.el)[0];
7864
this.animationEl = query('.image-animation', this.el)[0];
79-
this.loadingEl = query('.ball-clip-rotate', this.el)[0];
8065
this.itemList = this.viewerWrapperEl.children;
8166
this.width = this.el.clientWidth;
8267
this.height = this.el.clientHeight;
@@ -429,14 +414,6 @@ class ImageViewer {
429414
}
430415
}
431416

432-
showLoading() {
433-
this.loadingEl.classList.remove('hide');
434-
}
435-
436-
hideLoading() {
437-
this.loadingEl.classList.add('hide');
438-
}
439-
440417
/**
441418
* 重置当前图片的缩放
442419
*/

src/core/viewer.js

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class Viewer {
2525
this.panelEl = el.firstElementChild; // .panel类
2626
this.imageEl = query('img', this.el)[0];
2727
this.tipsEl = query('span', this.el)[0];
28+
this.loadingEl = query('.ball-clip-rotate', this.el)[0];
2829
this.imageOption = null;
2930
this.index = index; // viewer排序用,记录原始的数组位置
3031
this.displayIndex = 0;
@@ -97,6 +98,7 @@ class Viewer {
9798
this.imageOption = imageOption;
9899
this.displayIndex = displayIndex;
99100

101+
this.hideLoading();
100102
if (needLoadLarge && this.src !== this.imageOption.url) {
101103
if (imageOption._hasLoadLarge) {
102104
// 大图已加载好的情况下
@@ -105,23 +107,25 @@ class Viewer {
105107
src = imageOption.thumbnail;
106108
if (src) {
107109
if (this.isActive()) {
108-
this.imageViewer.showLoading();
110+
this.showLoading();
109111
window.requestAnimationFrame(() => {
110112
// 缩略图存在的情况下,后台加载大图
111113
this.loadImg(imageOption.url, () => {
112114
// 判断当前viewer的url是否和当时正在加载的图片一致
113-
// 因为存在可能图片尚未加载完用户就切换到下一张图片的情况
114-
if (this.src === imageOption.thumbnail && this.isActive()) {
115-
this.imageViewer.hideLoading();
116-
this._setImageUrl(imageOption.url);
117-
success(true);
115+
if (this.src === imageOption.thumbnail) {
116+
this.hideLoading();
117+
if (this.isActive()) {
118+
// 非当前所展示的图片,加载完之后不需要立即初始化尺寸
119+
this._setImageUrl(imageOption.url);
120+
success(true);
121+
}
118122
}
119-
imageOption._hasLoadLarge = true;
120123
}, () => {
121-
if (this.src === imageOption.thumbnail && this.isActive()) {
122-
this.imageViewer.hideLoading();
123-
fail(true);
124+
if (this.src === imageOption.thumbnail) {
125+
this.hideLoading();
126+
this.isActive() && fail(true);
124127
}
128+
}, () => {
125129
imageOption._hasLoadLarge = true;
126130
});
127131
});
@@ -155,14 +159,29 @@ class Viewer {
155159
* @param url
156160
* @param success
157161
* @param fail
162+
* @param end
158163
*/
159-
loadImg(url = '', success, fail) {
164+
loadImg(url = '', success, fail, end) {
160165
const img = new Image();
161-
img.onload = () => success();
162-
img.onerror = () => fail();
166+
img.onload = () => {
167+
success();
168+
end();
169+
};
170+
img.onerror = () => {
171+
fail();
172+
end();
173+
};
163174
img.src = url;
164175
}
165176

177+
showLoading() {
178+
this.loadingEl.classList.remove('hide');
179+
}
180+
181+
hideLoading() {
182+
this.loadingEl.classList.add('hide');
183+
}
184+
166185
/**
167186
* 判断是否是当前所展示的viewer
168187
* @returns {boolean}

0 commit comments

Comments
 (0)