您好,登錄后才能下訂單哦!
這篇文章主要講解了“web圖片居中處理的方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“web圖片居中處理的方法是什么”吧!
我們在日常使用移動APP的時候,特別是一些資訊類的APP,都會有圖片展示的相關UI,例如今日頭條APP的單大圖和三圖模式,如下圖:單圖:
三圖:
或者是類似微博或者朋友圈這種9宮格的圖片展示效果,如下圖:
對于這些圖片,如果你單純的以為直接用幾個<img>,配置一下src地址,然后渲染在頁面上,那就大錯特錯了
對于這種類型的UI展示,我們需要明確下面幾點:
圖片在上傳后,會有不同的大小,有的是長圖(長大于寬),有的是寬圖(寬大于長),或者是一些接近正方形的圖片。
在保證圖片原本長寬比的情況下,要想將圖片顯示在一個正方形的區域內,或者是固定長寬的區域內,是必須要截取一部分圖片展示的。
采用CSS或者JavaScript都可以實現這種效果。
大家可以看下面這幾張圖,紅色的是圖片本身,虛線框就是展示出來的區域,便于理解:寬圖:
長圖:
CSS的background-size:
單獨使用CSS的話,我們可以輕松的實現上面這個效果,主要利用到的屬性就是background-size這個屬性,可以先從概念上了解一下這個屬性:
background-size: length|percentage|cover|contain
length:設置背景圖像的高度和寬度。第一個值設置寬度,第二個值設置高度。如果只設置一個值,則第二個值會被設置為 “auto”。
percentage:以父元素的百分比來設置背景圖像的寬度和高度。第一個值設置寬度,第二個值設置高度。如果只設置一個值,則第二個值會被設置為 “auto”。
cover:在保持圖像的縱橫比的前提下,以適合鋪滿整個容器并將圖像縮放成將完全覆蓋背景定位區域的最小大小。優點是背景圖片全部覆蓋所屬元素區域;缺點是超出的部分會被隱藏。
contain:與cover相反,在保持圖像的縱橫比的情況下,以適合鋪滿整個容器,并將圖像縮放成將適合背景定位區域的最大大小。優點是圖片不會出現變形,同時背景圖片被完全展示出來;缺點是當所屬元素的寬高比與背景圖片的寬高比不同時,會出現背景留白。
我們可以采用background-size:cover;比較合適,在保證縱橫比的情況下,如果圖片超過背景區域,將多余部分隱藏即可,同時設置background-position: center center;將主要內容居中顯示。
CSS的object-fit:
HTML5新增的<img />標簽的屬性object-fit也可滿足需求,但是要注意兼容性。
object-fit: fill|contain|cover|scale-down|none|initial|inherit;
主要用到以下屬性:
fill:默認,不保證保持原有的比例,內容拉伸整個內容容器。
contain:保持原有尺寸比例,內容被縮放,參考background-size:contain。
cover:保持原有尺寸比例,但部分內容可能被剪切,參考background-size:cover。
scale-down:保持原有尺寸比例。內容的尺寸與 none 或 contain 中的一個相同,取決于它們兩個之間誰得到的對象尺寸會更小一些,更加智能。
如果是一個單大圖,我們可以直接給一個div設置background-image,然后設置background-image即可,代碼如下:
<div class="one-img"></div>
.one-img {
width: 100%;
padding-top: 50%;
background-image: url('https://gpic.qpic.cn/gbar_pic/osL7w6JTehzgKuaKrPEJ8V3lia1zoLaPShY05MdBofOpBye0yNpRXYA/');
background-size: cover;
background-position: center center;
}
效果如下圖:
代碼中圖片來源于網絡
這里有一個知識點,我們如果想要實現屏幕的適配,div的長寬是絕不可以寫成固定值px的,所以寬度可以設置成100%,這樣如果在大屏幕下,圖片自身會變大,但是高度我們是無法設置一個合適的百分比的,這里我們借助了padding-top屬性,將padding-top設置成百分比,可以讓一個div的高度被撐開,具體的值依據寬度的值,即50%表示是寬度(width:100%)的50%。
三張連續圖,代碼如下:
<div class="three-img-other-wrap">
<div class="three-img-other-1 img-1"></div>
<div class="three-img-other-2 img-2"></div>
<div class="three-img-other-3 img-3"></div>
</div>
.three-img-wrap {
margin-top: 5px;
width: 100%;
overflow: hidden;
}
.three-img {
float: left;
width: 33.3333%;
padding-top: 33.3333%;
border-right: 1px solid #fff;
background-size: cover;
background-position: center center;
box-sizing: border-box;
}
效果如下:
每個div,設置float:left來實現橫向平鋪,注意一下這里不建議使用display:inline-block,會出現都得空隙,如果想要實現9宮格,將這3個復制2份即可。
或者是另外一種3+2+1顯示方式圖,代碼如下:
.three-img-other-wrap {
margin-top: 5px;
width: 100%;
overflow: hidden;
}
.three-img-other-1 {
width: 66.6666%;
padding-top: 66.6666%;
float: left;
border-right: 1px solid #fff;
background-size: cover;
background-position: center center;
box-sizing: border-box;
}
.three-img-other-2 {
width: 33.3333%;
padding-top: 33.3333%;
float: left;
border-bottom: 1px solid #fff;
background-size: cover;
background-position: center center;
box-sizing: border-box;
}
.three-img-other-3 {
width: 33.3333%;
padding-top: 33.3333%;
float: left;
background-size: cover;
background-position: center center;
box-sizing: border-box;
}
<div class="three-img-other-wrap">
<div class="three-img-other-1 img-1"></div>
<div class="three-img-other-2 img-2"></div>
<div class="three-img-other-3 img-3"></div>
</div>
效果如下:
從上面的效果圖來看,每張圖片之間都有一定的間距(一般是1px-3px之間),在這里我們如果使用margin來實現的話,我們是無法設置一個具體的數值的,因為我們的長寬都是采用百分比,margin也必須采用百分比,否則會出現錯亂,但是在此場景下margin不適合采用百分比,所以我們采用border邊框來模擬這個間距:
border-right: 1px solid #fff;
box-sizing: border-box;
需要注意box-sizing: border-box;,這樣border將的長度將會計算在整個寬度里面,即border+width等于具體的設置的百分比。
其實從代碼的優雅程度上來說,采用我們上面講解的純Css的方法是比較好的一種方法,但是也有弊端:1. 無法監聽圖片的加載成功和失敗事件,例如onerror或者onload。這會導致我們無法給加載失敗的圖片一個默認的顯示圖。2. 我們在實現圖片懶加載的邏輯時,div+background-image這種方式相交于<img>方式需要寫更多的邏輯。
在這里給大家介紹一下div+background-image和<img>之間的區別:
在網頁加載的過程中,以css背景圖存在的圖片background-image會等到結構加載完成(網頁的內容全部顯示以后)才開始加載,而html中的標簽img是網頁結構(內容)的一部分會在加載結構的過程中加載,換句話講,網頁會先加載標簽<img>的內容,再加載背景圖片background-image,如果你用引入了一個很大的圖片,那么在這個圖片下載完成之前,<img>后的內容都不會顯示。而如果用css來引入同樣的圖片,網頁結構和內容加載完成之后,才開始加載背景圖片,不會影響你瀏覽網頁內容。
如果我們想要用JavaScript加<img>,來實現這種效果,基本邏輯是:
首先需要知道圖片的寬高。
給每個<img>設置src之后,需要同時設置一個父div用來包裹這個<img>。
同時父div需要設置overflow:hidden,然后根據外框的大小,和圖片的寬高,動態設置<img>的margin或者left,top來產生位移。
這里的核心是如何根據外框的寬高來動態計算出圖片的位移,我們可以封裝一個方法來計算,具體的邏輯可以看注釋:
getImagePosition(img, cW, cH) {
// cW為外框寬度,// cW為外框高度,
img.marginTop = img.marginLeft = 0;
// img.h表示圖片本身高度,img.height表示計算設置之后的高度
// img.w表示圖片本身高度,img.width表示計算設置之后的高度
img.width = cW;
img.height = cH;
// 長圖 優先設置寬度,然后長圖居中
if (img.h * cW / img.w > cH) {
img.height = img.h * cW / img.w;
img.marginTop = (cH - img.height) * 0.5 // 0.5表示居中
} else {// 寬圖 優先設置高度度,然后寬圖居中
img.width = img.w * cH / img.h;
img.marginLeft = (cW - img.width) * 0.5 // 0.5表示居中
}
return img;
}
在計算出圖片位移后,外框的寬高也可以使用JavaScript來動態設置,例如屏幕寬度的三分之一或者是圖片寬度的三分之二,代碼如下:
document.body.clientWidth * 0.5
document.body.clientWidth * 2 / 3
感謝各位的閱讀,以上就是“web圖片居中處理的方法是什么”的內容了,經過本文的學習后,相信大家對web圖片居中處理的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。