使用JavaScript解決網(wǎng)頁(yè)圖片拉伸問(wèn)題(推薦)
問(wèn)題描述
這段時(shí)間在做PM的需求的時(shí)候突然發(fā)現(xiàn)一個(gè)問(wèn)題,產(chǎn)品上的圖片來(lái)自多個(gè)第三方,具體的尺寸無(wú)法確定,如果直接在樣式中寫(xiě)死圖片的尺寸大小就會(huì)出現(xiàn)圖片拉伸的現(xiàn)象,十分影響產(chǎn)品的美觀,因此希望可以找到一個(gè)比較好的解決方案。自己先做了一個(gè)簡(jiǎn)單的demo來(lái)展示問(wèn)題。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="./js/jquery-1.11.1.min.js"></script> <style> .img1{width:200px;height:200px;border: 1px solid #000;overflow: hidden;margin: 10px;} .img2{width:200px;height:90px;border: 1px solid #000;overflow: hidden;margin: 10px;} </style> </head> <body> <div class="img1" style="width:"> <img id="img1" src="./img/1.jpg" height="100%" width="100%"> </div> <div class="img2" style="width:"> <img id="img2" src="./img/1.jpg" height="100%" width="100%"> </div> </body> </html>
上述這種情況還是挺影響美觀的,是否可以考慮動(dòng)態(tài)的設(shè)置圖片的尺寸呢?
解決思路
是否可以在瀏覽器加載圖片資源后,獲取圖片的真實(shí)尺寸和圖片容器的大小,然后動(dòng)態(tài)地設(shè)置圖片的width、height屬性。
獲取圖片的真實(shí)尺寸
html5下已經(jīng)提供了相應(yīng)的方法來(lái)返回圖片的真實(shí)尺寸大?。╥mg.naturalWidth、img.naturalHeight),針對(duì)IE6/7/8也可以通過(guò)以下方法來(lái)獲取真實(shí)尺寸的大小。
var imgae = new Image(); image.src = img.src; image.onload = function() { var w = image.width; var h = image.height; }
下面就編寫(xiě)對(duì)應(yīng)的JS方法獲取圖片的真實(shí)尺寸已經(jīng)圖片容器的尺寸大小。
setImgSize : function(img, callback) { if (img.naturalWidth) { //html5 callback(img, img.naturalWidth, img.naturalHeight, img.width, img.height); } else { // IE 6 7 8 var imgae = new Image(); image.src = img.src; image.onload = function() { callback(img, image.width, image.height, img.width, img.height); } } }
重新設(shè)置圖片尺寸
在獲取圖片真實(shí)尺寸已經(jīng)容器尺寸之后,我們需要重新設(shè)置圖片的尺寸大小。這里先簡(jiǎn)單的介紹下處理目標(biāo):如果設(shè)置后的尺寸超過(guò)展示區(qū)域,則展示圖片的中間部分,如果展示區(qū)域大于圖片尺寸,則圖片居中顯示。用圖簡(jiǎn)單說(shuō)明下,黑色實(shí)線為圖片的顯示區(qū)域,綠色部分為圖片的大小。
下面我們提供三種方法來(lái)處理圖片,分別實(shí)現(xiàn)上部?jī)煞N(寬度一致)、下部?jī)煞N(高度一致)、右側(cè)兩種(鋪滿顯示區(qū)域),下面就分別介紹這三種方法:
一、保證寬度一致
//原始寬度 原始高度 容器寬度 容器高度 //保證寬度一致 resetImgSizeW : function(img, nw, nh, w, h) { nwh = nw / nh; wh = w / h; if (nwh > wh) { img.width = w; var height = parseInt(1 / nwh * w); img.height = height; var top = parseInt((h - height) / 2); img.style.marginTop = top + "px"; } else if (nwh < wh) { img.width = w; var height = parseInt(1 / nwh * w); img.height = height; var top = parseInt((height - h) / 2) * -1; img.style.marginTop = top + "px"; } else { img.height = h; img.width = w; } },
在這里我們需要判斷圖片原始尺寸的長(zhǎng)寬比例以及容器的長(zhǎng)寬比例之間的關(guān)系,如果高度富裕,那就相應(yīng)將圖片往上移動(dòng)一定的像素,如果高度不足,就將圖片往下移動(dòng)相應(yīng)的像素,至于其他的兩種情況也是同樣的邏輯,先看下處理后的效果:
二、保證高度一致
//原始寬度 原始高度 容器寬度 容器高度 //保證高度一致 resetImgSizeH : function(img, nw, nh, w, h) { nwh = nw / nh; wh = w / h; if (nwh > wh) { img.height = h; var width = parseInt(nwh * h); img.width = width; var left = parseInt((width - w) / 2) * -1; img.style.marginLeft = left + "px"; } else if (nwh < wh) { img.height = h; var width = parseInt(nwh * h); img.width = width; var left = parseInt((w - width) / 2); img.style.marginLeft = left + "px"; } else { img.height = h; img.width = w; } }
三、鋪滿顯示區(qū)域
//原始寬度 原始高度 容器寬度 容器高度 //鋪滿全屏 resetImgSizeWH : function(img, nw, nh, w, h) { nwh = nw / nh; wh = w / h; if (nwh > wh) { img.height = h; var width = parseInt(nwh * h); img.width = width; var left = parseInt((width - w) / 2) * -1; img.style.marginLeft = left + "px"; } else if (nwh < wh) { img.width = w; var height = parseInt(1 / nwh * w); img.height = height; var top = parseInt((height - h) / 2) * -1; img.style.marginTop = top + "px"; } else { img.height = h; img.width = w; } },
如何使用JS
上面對(duì)實(shí)現(xiàn)的邏輯以及最終的效果做了簡(jiǎn)單的介紹,下面就介紹下如何使用。
<!-- 引用js腳本 --> <script src="./js/imageLoad.js"></script> <script> var imageLoad = new ImageLoad(); //處理網(wǎng)站上所有的圖片,下面三種只能使用一種 //imageLoad.initImg("w");//保證寬度一致 //imageLoad.initImg("h");//保證高度一致 //imageLoad.initImg("wh");//鋪滿顯示區(qū)域 //處理單個(gè)圖片,對(duì)于多個(gè)自己可以寫(xiě)循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn) imageLoad.setImgSize(document.getElementById("img1"), imageLoad.resetImgSizeW); imageLoad.setImgSize(document.getElementById("img2"), imageLoad.resetImgSizeW); imageLoad.setImgSize(document.getElementById("img3"), imageLoad.resetImgSizeH); imageLoad.setImgSize(document.getElementById("img4"), imageLoad.resetImgSizeH); imageLoad.setImgSize(document.getElementById("img5"), imageLoad.resetImgSizeWH); imageLoad.setImgSize(document.getElementById("img6"), imageLoad.resetImgSizeWH); </script>
ImageLoad源碼
$(document).ready(function() { new ImageLoad(); }); ImageLoad = function(){ this.init(); }; ImageLoad.prototype = { init : function () { // this.initImg("w"); }, initImg : function(type) { var _this = this; var imgs = document.getElementsByTagName('img'); for (var i=0; i<imgs.length; i++) { try { var img = imgs[i]; if ("w" == type) { $(img).onload = _this.setImgSize(img, _this.resetImgSizeW); } else if ("h" == type) { $(img).onload = _this.setImgSize(img, _this.resetImgSizeH); } else if ("wh" == type) { $(img).onload = _this.setImgSize(img, _this.resetImgSizeWH); } } catch(e) { } } }, //原始寬度 原始高度 容器寬度 容器高度 //保證高度一致 resetImgSizeH : function(img, nw, nh, w, h) { nwh = nw / nh; wh = w / h; if (nwh > wh) { img.height = h; var width = parseInt(nwh * h); img.width = width; var left = parseInt((width - w) / 2) * -1; img.style.marginLeft = left + "px"; } else if (nwh < wh) { img.height = h; var width = parseInt(nwh * h); img.width = width; var left = parseInt((w - width) / 2); img.style.marginLeft = left + "px"; } else { img.height = h; img.width = w; } }, //原始寬度 原始高度 容器寬度 容器高度 //保證寬度一致 resetImgSizeW : function(img, nw, nh, w, h) { nwh = nw / nh; wh = w / h; if (nwh > wh) { img.width = w; var height = parseInt(1 / nwh * w); img.height = height; var top = parseInt((h - height) / 2); img.style.marginTop = top + "px"; } else if (nwh < wh) { img.width = w; var height = parseInt(1 / nwh * w); img.height = height; var top = parseInt((height - h) / 2) * -1; img.style.marginTop = top + "px"; } else { img.height = h; img.width = w; } }, //原始寬度 原始高度 容器寬度 容器高度 //鋪滿全屏 resetImgSizeWH : function(img, nw, nh, w, h) { nwh = nw / nh; wh = w / h; if (nwh > wh) { img.height = h; var width = parseInt(nwh * h); img.width = width; var left = parseInt((width - w) / 2) * -1; img.style.marginLeft = left + "px"; } else if (nwh < wh) { img.width = w; var height = parseInt(1 / nwh * w); img.height = height; var top = parseInt((height - h) / 2) * -1; img.style.marginTop = top + "px"; } else { img.height = h; img.width = w; } }, //獲取圖片真實(shí)尺寸以及容器尺寸 setImgSize : function(img, callback) { if (img.naturalWidth) { //html5 callback(img, img.naturalWidth, img.naturalHeight, img.width, img.height); } else { // IE 6 7 8 var imgae = new Image(); image.src = img.src; image.onload = function() { callback(img, image.width, image.height, img.width, img.height); } } }, }
以上所述是小編給大家介紹的使用JavaScript解決網(wǎng)頁(yè)圖片拉伸問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
jquery獲取img的src值的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇jquery獲取img的src值的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05學(xué)習(xí)JavaScript設(shè)計(jì)模式之代理模式
這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的狀態(tài)模式,對(duì)JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下2016-01-01關(guān)于加快微信小程序開(kāi)發(fā)的一些小建議
微信小程序是一種全新的連接用戶與服務(wù)的方式,下面這篇文章主要給大家介紹了關(guān)于加快微信小程序開(kāi)發(fā)的一些小建議,需要的朋友可以參考下2021-05-05JS回調(diào)函數(shù) callback的理解與使用案例分析
這篇文章主要介紹了JS回調(diào)函數(shù) callback的理解與使用,結(jié)合具體案例形式分析了javascript回調(diào)函數(shù)的功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09解決iframe的frameborder在chrome/ff/ie下的差異
最近的項(xiàng)目中使用了動(dòng)態(tài)創(chuàng)建iframe的js方法,發(fā)現(xiàn)iframe.frameborder="0"在IE7下不管用,而chrome/ff都正常的,很是郁悶。2010-08-08JavaScript實(shí)現(xiàn)六種網(wǎng)頁(yè)圖片輪播效果詳解
在網(wǎng)頁(yè)中,我們經(jīng)常會(huì)看到各種輪播圖的效果,它們到底是怎樣實(shí)現(xiàn)的呢?本文將為大家詳細(xì)介紹一下六種不同的輪播效果的實(shí)現(xiàn),需要的可以參考一下2021-12-12JS 巧妙獲取剪貼板數(shù)據(jù) Excel數(shù)據(jù)的粘貼
最近需要在瀏覽器端實(shí)現(xiàn)excel數(shù)據(jù)的粘貼,一開(kāi)始去找獲取剪貼板數(shù)據(jù)的方法。但是在瀏覽器端,JS去取是受安全限制的。2009-07-07