關(guān)于圖片按比例自適應(yīng)縮放
今天在看視覺規(guī)范的時候,大高走過來說幫他們那邊看一個問題。又是一個關(guān)于自適應(yīng)的問題。不過,我喜歡。瞄了一下,需求是這樣的:用戶上傳照片,照片的尺寸未知;需要生成一個預(yù)覽,這個預(yù)覽圖要根據(jù)提供給用戶預(yù)覽的區(qū)域自應(yīng)用,并且居中;如果圖片太大,需要按比例縮放。如下圖。

瞄了一下,居中可以用 text-align:center; 來實現(xiàn)。而按比例縮放,利用預(yù)設(shè) <img /> 的 width 、height 屬性解決不了。因為用戶圖片可能是很長的,也可能是很寬的。在線上想了一下他們的關(guān)系,按條件來判斷是這樣的:
- if(實際寬度 > 預(yù)覽最大寬度)
 - {
 - 縮放寬度 = 預(yù)覽最大寬度
 - }
 - if(實際高度 > 預(yù)覽最大高度)
 - {
 - 縮放高度 = 預(yù)覽最大高度
 - }
 
但是這樣會有問題,比如當(dāng)寬度和高度都被縮放,如果縮放比較不同,圖片就不是按比例縮放,會變得非常丑。為了讓它按比例縮放,就需要做各種判斷了。那這樣就違背了我們希望程序自動化的原則了。
再想想,雖然不喜歡數(shù)學(xué),但數(shù)學(xué)還是很好用的,應(yīng)該有其他辦法。而既然是按比例縮放,何不用實際圖像和預(yù)覽區(qū)域?qū)挾茸鞯谋壤齺碛嬎闼麄冴P(guān)系?hmmmm… 果然 OK。實際上我們永遠(yuǎn)都只需要縮放寬度或高度中的其中一個。因為比例只有大和小種情況。具體的,寫一個函數(shù)來實現(xiàn)它吧:
- /**
 - * 圖片按比例自適應(yīng)縮放
 - * @param img {Element} 用戶上傳的圖片
 - * @param maxWidth {Number} 預(yù)覽區(qū)域的最大寬度
 - * @param maxHeight {Number} 預(yù)覽區(qū)域的最大高度
 - */
 - var resizeImg = function(img, maxWidth, maxHeight){
 - var w = img.width,
 - h = img.height;
 - // 當(dāng)圖片比預(yù)覽區(qū)域小時不做任何改變
 - if(w < maxWidth && h < maxHeight) return;
 - // 當(dāng)實際圖片比例大于預(yù)覽區(qū)域?qū)捀弑壤龝r
 - // 縮放圖片寬度,反之縮放圖片寬度
 - w/h > maxWidth/maxHeight ? img.width = maxWidth : img.height = maxHeight;
 - };
 
【編輯推薦】















 
 
 










 
 
 
 