溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

web圖片居中處理的方法是什么

發(fā)布時間:2021-12-21 10:37:59 來源:億速云 閱讀:1072 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“web圖片居中處理的方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“web圖片居中處理的方法是什么”吧!

我們在日常使用移動APP的時候,特別是一些資訊類的APP,都會有圖片展示的相關(guān)UI,例如今日頭條APP的單大圖和三圖模式,如下圖:單圖:

web圖片居中處理的方法是什么

三圖:

web圖片居中處理的方法是什么

或者是類似微博或者朋友圈這種9宮格的圖片展示效果,如下圖:

web圖片居中處理的方法是什么

對于這些圖片,如果你單純的以為直接用幾個<img>,配置一下src地址,然后渲染在頁面上,那就大錯特錯了

對于這種類型的UI展示,我們需要明確下面幾點:

  1. 圖片在上傳后,會有不同的大小,有的是長圖(長大于寬),有的是寬圖(寬大于長),或者是一些接近正方形的圖片。

  2. 在保證圖片原本長寬比的情況下,要想將圖片顯示在一個正方形的區(qū)域內(nèi),或者是固定長寬的區(qū)域內(nèi),是必須要截取一部分圖片展示的。

  3. 采用CSS或者JavaScript都可以實現(xiàn)這種效果。

大家可以看下面這幾張圖,紅色的是圖片本身,虛線框就是展示出來的區(qū)域,便于理解:寬圖:

web圖片居中處理的方法是什么

長圖:

web圖片居中處理的方法是什么

CSS的background-size:

單獨使用CSS的話,我們可以輕松的實現(xiàn)上面這個效果,主要利用到的屬性就是background-size這個屬性,可以先從概念上了解一下這個屬性:

background-size: length|percentage|cover|contain
  • length:設(shè)置背景圖像的高度和寬度。第一個值設(shè)置寬度,第二個值設(shè)置高度。如果只設(shè)置一個值,則第二個值會被設(shè)置為 “auto”。

  • percentage:以父元素的百分比來設(shè)置背景圖像的寬度和高度。第一個值設(shè)置寬度,第二個值設(shè)置高度。如果只設(shè)置一個值,則第二個值會被設(shè)置為 “auto”。

  • cover:在保持圖像的縱橫比的前提下,以適合鋪滿整個容器并將圖像縮放成將完全覆蓋背景定位區(qū)域的最小大小。優(yōu)點是背景圖片全部覆蓋所屬元素區(qū)域;缺點是超出的部分會被隱藏。

  • contain:與cover相反,在保持圖像的縱橫比的情況下,以適合鋪滿整個容器,并將圖像縮放成將適合背景定位區(qū)域的最大大小。優(yōu)點是圖片不會出現(xiàn)變形,同時背景圖片被完全展示出來;缺點是當(dāng)所屬元素的寬高比與背景圖片的寬高比不同時,會出現(xiàn)背景留白。

我們可以采用background-size:cover;比較合適,在保證縱橫比的情況下,如果圖片超過背景區(qū)域,將多余部分隱藏即可,同時設(shè)置background-position: center center;將主要內(nèi)容居中顯示。

CSS的object-fit:

HTML5新增的<img />標(biāo)簽的屬性object-fit也可滿足需求,但是要注意兼容性。

object-fit: fill|contain|cover|scale-down|none|initial|inherit;

主要用到以下屬性:

  • fill:默認,不保證保持原有的比例,內(nèi)容拉伸整個內(nèi)容容器。

  • contain:保持原有尺寸比例,內(nèi)容被縮放,參考background-size:contain。

  • cover:保持原有尺寸比例,但部分內(nèi)容可能被剪切,參考background-size:cover。

  • scale-down:保持原有尺寸比例。內(nèi)容的尺寸與 none 或 contain 中的一個相同,取決于它們兩個之間誰得到的對象尺寸會更小一些,更加智能。

代碼效果demo:

如果是一個單大圖,我們可以直接給一個div設(shè)置background-image,然后設(shè)置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;
   }

效果如下圖:

web圖片居中處理的方法是什么

代碼中圖片來源于網(wǎng)絡(luò)

這里有一個知識點,我們?nèi)绻胍獙崿F(xiàn)屏幕的適配,div的長寬是絕不可以寫成固定值px的,所以寬度可以設(shè)置成100%,這樣如果在大屏幕下,圖片自身會變大,但是高度我們是無法設(shè)置一個合適的百分比的,這里我們借助了padding-top屬性,將padding-top設(shè)置成百分比,可以讓一個div的高度被撐開,具體的值依據(jù)寬度的值,即50%表示是寬度(width:100%)的50%。

三張連續(xù)圖,代碼如下:

    <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;
  }

效果如下:

web圖片居中處理的方法是什么

每個div,設(shè)置float:left來實現(xiàn)橫向平鋪,注意一下這里不建議使用display:inline-block,會出現(xiàn)都得空隙,如果想要實現(xiàn)9宮格,將這3個復(fù)制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>

效果如下:

web圖片居中處理的方法是什么

圖片之間的縫問題:

從上面的效果圖來看,每張圖片之間都有一定的間距(一般是1px-3px之間),在這里我們?nèi)绻褂胢argin來實現(xiàn)的話,我們是無法設(shè)置一個具體的數(shù)值的,因為我們的長寬都是采用百分比,margin也必須采用百分比,否則會出現(xiàn)錯亂,但是在此場景下margin不適合采用百分比,所以我們采用border邊框來模擬這個間距:

border-right: 1px solid #fff;
box-sizing: border-box;

需要注意box-sizing: border-box;,這樣border將的長度將會計算在整個寬度里面,即border+width等于具體的設(shè)置的百分比。

采用JavaScript來實現(xiàn):

其實從代碼的優(yōu)雅程度上來說,采用我們上面講解的純Css的方法是比較好的一種方法,但是也有弊端:1. 無法監(jiān)聽圖片的加載成功和失敗事件,例如onerror或者onload。這會導(dǎo)致我們無法給加載失敗的圖片一個默認的顯示圖。2. 我們在實現(xiàn)圖片懶加載的邏輯時,div+background-image這種方式相交于<img>方式需要寫更多的邏輯。

在這里給大家介紹一下div+background-image和<img>之間的區(qū)別:

在網(wǎng)頁加載的過程中,以css背景圖存在的圖片background-image會等到結(jié)構(gòu)加載完成(網(wǎng)頁的內(nèi)容全部顯示以后)才開始加載,而html中的標(biāo)簽img是網(wǎng)頁結(jié)構(gòu)(內(nèi)容)的一部分會在加載結(jié)構(gòu)的過程中加載,換句話講,網(wǎng)頁會先加載標(biāo)簽<img>的內(nèi)容,再加載背景圖片background-image,如果你用引入了一個很大的圖片,那么在這個圖片下載完成之前,<img>后的內(nèi)容都不會顯示。而如果用css來引入同樣的圖片,網(wǎng)頁結(jié)構(gòu)和內(nèi)容加載完成之后,才開始加載背景圖片,不會影響你瀏覽網(wǎng)頁內(nèi)容。

如果我們想要用JavaScript加<img>,來實現(xiàn)這種效果,基本邏輯是:

  1. 首先需要知道圖片的寬高。

  2. 給每個<img>設(shè)置src之后,需要同時設(shè)置一個父div用來包裹這個<img>。

  3. 同時父div需要設(shè)置overflow:hidden,然后根據(jù)外框的大小,和圖片的寬高,動態(tài)設(shè)置<img>的margin或者left,top來產(chǎn)生位移。

這里的核心是如何根據(jù)外框的寬高來動態(tài)計算出圖片的位移,我們可以封裝一個方法來計算,具體的邏輯可以看注釋:

getImagePosition(img, cW, cH) {
   // cW為外框?qū)挾龋?/ cW為外框高度,
   img.marginTop = img.marginLeft = 0;

   // img.h表示圖片本身高度,img.height表示計算設(shè)置之后的高度
   // img.w表示圖片本身高度,img.width表示計算設(shè)置之后的高度

   img.width = cW;
   img.height = cH;

   // 長圖 優(yōu)先設(shè)置寬度,然后長圖居中
   if (img.h * cW / img.w > cH) {
       img.height = img.h * cW / img.w;
       img.marginTop = (cH - img.height) * 0.5 // 0.5表示居中
   } else {// 寬圖 優(yōu)先設(shè)置高度度,然后寬圖居中
       img.width = img.w * cH / img.h;
       img.marginLeft = (cW - img.width) * 0.5 // 0.5表示居中
   }

   return img;
}

在計算出圖片位移后,外框的寬高也可以使用JavaScript來動態(tài)設(shè)置,例如屏幕寬度的三分之一或者是圖片寬度的三分之二,代碼如下:

document.body.clientWidth * 0.5
document.body.clientWidth * 2 / 3

感謝各位的閱讀,以上就是“web圖片居中處理的方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對web圖片居中處理的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

web
AI