图片大小不一放在div中的兼容方案
css部分:
.img-center { width: 200px; height: 150px; margin: 20px; overflow: hidden; position: relative; } .img-center img { display: block; position: absolute; } .img-center img.aspectFill-x { width: 100%; top: 50%; transform: translateY(-50%); } .img-center img.aspectFill-y { height: 100%; left: 50%; transform: translateX(-50%); }
js部分
// components/imageCenter.js define(function(require) { // 利用Promise封装一个加载函数,这里也是可以单独放在一个功能模块中进一步优化 var imageLoad = function(img) { return new Promise(function(resolve, reject) { if (img.complete) { resolve(); } else { img.onload = function(event) { resolve(event); } img.onerror = function(err) { reject(err); } } }) } var imageCenter = function(domList, mode) { domList.forEach(function(item) { var img = item.children[0]; var itemW = item.offsetWidth; var itemH = item.offsetHeight; var itemR = itemW / itemH; imageLoad(img).then(function() { var imgW = img.naturalWidth; var imgH = img.naturalHeight; var imgR = imgW / imgH; var resultMode = null; switch (mode) { // 这样写是因为期待未来可以扩展其他的展示方式 case 'aspectFill': resultMode = imgR > 1 ? 'aspectFill-x' : 'aspectFill-y'; break; case 'wspectFill': resultMode = itemR > imgR ? 'aspectFill-x' : 'aspectFill-y' break; default: } $(img).addClass(resultMode); }) }) } return imageCenter; })
引用:
// index.js var imageCenter = require('imageCenter'); var imageWrapList = document.querySelectorAll('.img-center'); imageCenter(imageWrapList, 'wspectFill');