JS實現等比例縮放圖片
有時候我們前端頁面只有500×500像素的寬和高的布局,但是后台返回的數據圖片是1000×1000,那么這種情況下 如果我直接返回的話 那么圖片肯定有一部分沒有顯示出來,在這種情況下我是想能不能在我們前端開發實現圖片等比例縮放。比如如下HTML代碼:
<div id="demo1"> <img src="http://img01.taobaocdn.com/imgextra/i1/397746073/T2BDE8Xb0bXXXXXXXX-397746073.jpg" alt=""> </div>
CSS代碼如下:
#demo1{width:800px;height:300px;overflow:hidden;}
外層div的css樣式定了寬度是800像素 高度是300像素,但是這張圖片的寬度和高度分別是1060像素和300像素,如果我們不做任何處理的話,那么圖片肯定會有260像素被隱藏掉了,而我們現在想要圖片被渲染出來后 根據外層容器800像素×300像素的寬度和高度分別等比例縮放,這樣的話 不管圖片的寬度和高度是多少,都可以自適應!
下面我們可以先看看JSFIddle效果是什么樣的!第一張圖片是沒有任何處理的,第2張小的是根據寬度800像素進行等比例縮放后的。
已知圖片的寬度和高度的等比例縮放的原理是:

HTML代碼如下:
<img src="http://img01.taobaocdn.com/imgextra/i1/397746073/T2BDE8Xb0bXXXXXXXX-397746073.jpg" width="1060" height="300" alt=""> <div id="demo1"> <img src="http://img01.taobaocdn.com/imgextra/i1/397746073/T2BDE8Xb0bXXXXXXXX-397746073.jpg" alt=""> </div>
CSS代碼如下:
#demo1{width:800px;height:300px;overflow:hidden;}
JS代碼如下:
/** * 已知圖片的寬度和高度的等比例縮放 */ function knowImgSize(id) { var idWidth = $(id).width(), // 容器的寬度和高度 idHeight = $(id).height(); $(id + ' img').each(function(index,img){ var img_w = $(this).width(), img_h = $(this).height(); // 如果圖片自身寬度大於容器的寬度的話 那么高度等比例縮放 if(img_w > idWidth) { var height = img_h * idWidth / img_w; $(this).css({"width":idWidth, "height":height}); } }); } // 初始化 $(function(){ knowImgSize("#demo1"); });
由於比較簡單 這里我就不提供demo下載了,具體的效果可以看上面jsfiddle鏈接頁面!
2.JS實現未知圖片大小的等比例縮放
當頁面加載的圖片尺寸未知的情況下,上述代碼則不能進行有效的縮放.那么我們現在有沒有辦法也可以實現類似的?當然我們是否還記得上一篇文章介紹的 "javascript預加載的實現"
上一篇我們介紹 不需要等待圖片加載完去做某件事,我們可以使用預加載,並且不需要預設width與height屬性,因為瀏覽器能夠獲取圖片的頭部數據。所以根據上篇文章的代碼我們可以改成如下代碼:先不看代碼 先看看JSFiddle效果!
JSFiddle demo鏈接如下:
下面是HTML代碼如下:
<h2>縮放后的</h2> <div class="parentCls"> <p><img src="http://img01.taobaocdn.com/imgextra/i1/397746073/T2BDE8Xb0bXXXXXXXX-397746073.jpg" class="autoImg"/></p> <p><img src="http://gtms01.alicdn.com/tps/i1/T11LpGFs8jXXb5rXb6-1060-300.jpg" class="autoImg"></p> <p><img src="http://img04.taobaocdn.com/imgextra/i4/397746073/T2fjl5XA8aXXXXXXXX-397746073.jpg" class="autoImg"/></p> <p><img src="http://img03.taobaocdn.com/tps/i3/T1CXpTFkpcXXb5rXb6-1060-300.jpg" class="autoImg"/></p> <p><img src="http://gtms01.alicdn.com/tps/i1/T1hC0HFwxaXXb5rXb6-1060-300.jpg" class="autoImg"/></p> <p><img src="http://img01.taobaocdn.com/imgextra/i1/397746073/T2BDE8Xb0bXXXXXXXX-397746073.jpg" class="autoImg"/></p> <p><img src="http://gtms01.alicdn.com/tps/i1/T1hC0HFwxaXXb5rXb6-1060-300.jpg" class="autoImg"/></p> </div>
簡單的Css代碼如下:
<style> /*demo style*/ body { font:12px 'Microsoft Yahei', Tahoma, Arial; _font-family:Tahoma, Arial; } a { color:#0259C4; } a:hover { color:#900; } .demoInfo { padding:10px; background:#F7F7F7; border:1px solid #EEE; -webkit-border-radius:5px; -moz-border-radius:5px; border-radius:5px; } .tips { color:#CCC; } .parentCls { width:680px; padding:10px; margin-top:50px; overflow:hidden; border:1px solid #CCC; } .parentCls p { padding: 0 8px; } .parentCls img { border:0 none; } </style>
所有的JS代碼如下:
/** * JS實現未知圖片大小的等比例縮放 */ function AutoImg(options) { this.config = { autoImg : '.autoImg', // 未知圖片dom節點 parentCls : '.parentCls' // 父節點 }; this.cache = { }; this.init(options); } AutoImg.prototype = { init: function(options){ this.config = $.extend(this.config, options || {}); var self = this, _config = self.config; $(_config.autoImg).each(function(index,img){ var src = img.src, parentNode = $(img).closest(_config.parentCls), parentWidth = $(parentNode).width(); // 先隱藏原圖 img.style.display = 'none'; img.removeAttribute('src'); // 獲取圖片頭尺寸數據后立即調整圖片 imgReady(src, function (width,height) { // 等比例縮小 if (width > parentWidth) { height = parentWidth / width * height, width = parentWidth; img.style.width = width + 'px'; img.style.height = height + 'px'; }; // 顯示原圖 img.style.display = ''; img.setAttribute('src', src); }); }); } }; var imgReady = (function(){ var list = [], intervalId = null; // 用來執行隊列 var queue = function(){ for(var i = 0; i < list.length; i++){ list[i].end ? list.splice(i--,1) : list[i](); } !list.length && stop(); }; // 停止所有定時器隊列 var stop = function(){ clearInterval(intervalId); intervalId = null; } return function(url, ready, error) { var onready = {}, width, height, newWidth, newHeight, img = new Image(); img.src = url; // 如果圖片被緩存,則直接返回緩存數據 if(img.complete) { ready(img.width, img.height); return; } width = img.width; height = img.height; // 加載錯誤后的事件 img.onerror = function () { error && error.call(img); onready.end = true; img = img.onload = img.onerror = null; }; // 圖片尺寸就緒 var onready = function() { newWidth = img.width; newHeight = img.height; if (newWidth !== width || newHeight !== height || // 如果圖片已經在其他地方加載可使用面積檢測 newWidth * newHeight > 1024 ) { ready(img.width, img.height); onready.end = true; }; }; onready(); // 完全加載完畢的事件 img.onload = function () { // onload在定時器時間差范圍內可能比onready快 // 這里進行檢查並保證onready優先執行 !onready.end && onready(); // IE gif動畫會循環執行onload,置空onload即可 img = img.onload = img.onerror = null; }; // 加入隊列中定期執行 if (!onready.end) { list.push(onready); // 無論何時只允許出現一個定時器,減少瀏覽器性能損耗 if (intervalId === null) { intervalId = setInterval(queue, 40); }; }; } })();
JS代碼是上一篇的JS代碼(imgReady函數網上高手寫的 所以直接拿過來改造下!),初始化時候需要配置2個屬性 一個是autoImg : '.autoImg' 默認class叫autoImg , 另一個是父節點 parentCls : '.parentCls' // 父節點 (也就是外層容器)。
