|
| 1 | + |
| 2 | +## 处理图片加载 |
| 3 | + |
| 4 | +1. 懒加载 |
| 5 | +2. 响应式图片自动匹配尺寸 |
| 6 | + |
| 7 | +> https://github.com/aFarkas/lazysizes |
| 8 | +
|
| 9 | +## 生成图片资源 |
| 10 | + |
| 11 | +通过gulp生成响应式图片的方法,限于篇幅,这里只生成了90,180和360和原始图片。实际推荐生成以下宽度的图片90, 180, 360, 540, 720, 900, 1080, 1296, 1512, 1728, 2048。以便覆盖从小屏幕到大屏幕的大部分情况(包括设备分辨率为2x的情况)。 |
| 12 | + |
| 13 | +> *可以考虑生成32像素以下图片,用来做低分辨率的占位图 |
| 14 | +
|
| 15 | +1.安装gulp, gulp-responsive |
| 16 | + |
| 17 | +```shell |
| 18 | +yarn add --dev gulp |
| 19 | +yarn add --dev gulp-responsive |
| 20 | +``` |
| 21 | + |
| 22 | +2.编写 `gulpfile.js`,如下所示 |
| 23 | + |
| 24 | +```javascript |
| 25 | +var gulp = require('gulp') |
| 26 | +var responsive = require('gulp-responsive') |
| 27 | +gulp.task('default', function (){ |
| 28 | + return gulp |
| 29 | + .src('images/*.{png, jpg}') |
| 30 | + .pipe( |
| 31 | + responsive({ |
| 32 | + '*': [ |
| 33 | + { |
| 34 | + width: 90, |
| 35 | + quality: 50, |
| 36 | + rename:{ |
| 37 | + suffix:'-90' |
| 38 | + } |
| 39 | + }, |
| 40 | + { |
| 41 | + width: 180, |
| 42 | + quality: 75, |
| 43 | + rename:{ |
| 44 | + suffix:'-180' |
| 45 | + } |
| 46 | + }, |
| 47 | + { |
| 48 | + width: 360, |
| 49 | + rename: { |
| 50 | + suffix:'-360' |
| 51 | + } |
| 52 | + }, |
| 53 | + { |
| 54 | + rename: { |
| 55 | + suffix: '-original' |
| 56 | + } |
| 57 | + } |
| 58 | + ] |
| 59 | + }, { |
| 60 | + errorOnEnlargement: false, |
| 61 | + skipOnEnlargement: true, |
| 62 | + withoutEnlargement: true |
| 63 | + }) |
| 64 | + ) |
| 65 | + .pipe(gulp.dest('dist/images')) |
| 66 | +}) |
| 67 | +``` |
| 68 | + |
| 69 | +3.`npx gulp` 生成目标图片 |
| 70 | + |
| 71 | +## 配置使用 |
| 72 | + |
| 73 | +1. 初始化配置(对背景图片懒加载处理) |
| 74 | + |
| 75 | +```html |
| 76 | +<script> |
| 77 | +function LoadJS(u) { |
| 78 | + var r = document.getELementsByTagName("script")[0], |
| 79 | + s = document.createElement("script"); |
| 80 | + s.src = u; |
| 81 | + r.parentNode.insertBefore(s, r); |
| 82 | +} |
| 83 | +if (!window.HTMLPictureELement) { |
| 84 | + loadJS("js/ls. resp img.min.js"); |
| 85 | +} |
| 86 | +</script> |
| 87 | +<script src="https://afarkas.github.io/lazysizes/plugins/bgset/ls.bgset.min.js"></script> |
| 88 | +<script src="js/lazysizes.min. js" async></script> |
| 89 | +``` |
| 90 | +2. 修改图片引用 |
| 91 | + |
| 92 | +```html |
| 93 | +<img |
| 94 | + class="img-fluid lazyload" |
| 95 | + data-src="dist/images/p2604517782-32.jpg" |
| 96 | + data-srcset="dist/images/p2684517782-98.jpg 90w,dist/images/p2604517782-188.jpg 180w,dist/images/p2604517782-original.jpg" data-sizes="auto" alt="" |
| 97 | +> |
| 98 | +``` |
| 99 | + |
| 100 | +3. 对背景的引用(注意引入依赖插件) |
| 101 | + |
| 102 | +```html |
| 103 | +<section |
| 104 | + class="banner lazyload" |
| 105 | + data-bgset="dist/images/sky-540.jpg 540w, dist/images/sky-1080.jpg 1080w, dist/images/sky-original.jpg" |
| 106 | + data-sizes="auto"> |
| 107 | +</section> |
| 108 | +``` |
| 109 | + |
| 110 | +相关示例: |
| 111 | + |
| 112 | +1. https://github.com/aFarkas/lazysizes |
| 113 | +2. https://jsfiddle.net/trixta/bfqqnosp/ |
| 114 | +3. https://github.com/aFarkas/lazysizes/tree/e305d28d4b6c4ff9f12dd4d438d5d7c5d41574db/plugins/bgset |
| 115 | + |
| 116 | + |
| 117 | +## 其他注意点 |
| 118 | + |
| 119 | +移动设备优先: 确保适当的绘制和触屏缩放,需要在网页的 head 之中添加 viewport meta 标签,如下所示: |
| 120 | +```html |
| 121 | +<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
| 122 | +``` |
| 123 | +width-device-width 表示宽度是设备屏幕的宽度。 |
| 124 | + |
| 125 | +initial-scale-1 表示初始的缩放比例。 |
| 126 | + |
| 127 | +shrink-to-fit=no 自动适应手机屏幕的宽度。 |
| 128 | + |
| 129 | +## 效果测试 |
| 130 | + |
| 131 | +### 手动测试 |
| 132 | + |
| 133 | +使用Chrome自带的移动端调试功能 |
| 134 | + |
| 135 | +### 自动测试 |
| 136 | + |
| 137 | +Chrome的手动测试主要在方便开发者调试,最终还是要保证在用户的真机上可以正常浏览。可以像开头图片显示的,整一些手机做测试,但是没有群控的话,测试效率过低,做群控本身工程量也不小。因此,一般推荐直接使用相关的云服务,比如BrowserStack。 |
| 138 | + |
| 139 | +资源链接:[BrowserStack](https://www.browserstack.com/screenshots) |
| 140 | + |
| 141 | + |
0 commit comments