自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取
Html5-CSS之五大居中方式
你是不是也對元素居中的知識點很是模糊?是不是苦于找不到一個總結的通俗易懂的說明?是不是自己懶得去總結?恭喜你,搜到這篇博客! 這是鄙人在前端的學習與實踐中總結出的元素的五大居中方式,黏貼了代碼并對代碼做了解釋,希望對迷茫的有所幫助!
下面的居中示例中,統一使用了同一個div作為父元素和p作為子元素
設置一個div,并且設置了div的寬高邊框,div里面設置一個塊元素p,設置了它的寬高和背景色
css居中方式1
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中1</title> <style> *{margin:0;} div{width:200px;height:300px;border:2px solid #000;margin:200px auto; text-align:center;font-size:0; } div p{width:100px;height:100px;background:#666; display:inline-block;vertical-align:middle; } div:after{content:"";display:inline-block;height:100%;vertical-align:middle;} </style> </head> <body> <div> <p></p> </div> </body> </html>
這里利用了偽元素讓子元素p在div盒子里左右水平居中只需要在它的父元素div里加text-align:center;垂直方向居中需要在父元素后面加了一個偽元素,并使得樣式為inline-block;height:100%;就是和父元素一樣高,vertical-align:middle;垂直居中,也就是p元素相對與偽元素居中,由于偽元素和div一樣高,所以相當于p元素在div里垂直居中。
css居中方式2
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中2</title> <style> *{margin:0;} div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{position:absolute;left:0;bottom:0;right:0;top:0;margin:auto;width:100px;height:100px;background:#f99;} </style> </head> <body> <div> <p></p> </div> </body> </html>
這里利用了定位居中
子元素p設置position:absolute脫離文檔流,默認以html作為父元素,所以我們給父元素div設置position:relative;使得p以div為父元素做位置的變動,left:0;tight:0;top:0;bottom:0;(只有設置了定位的元素才可以使用這種方式來移動),最后margin:auto;就會水平和垂直都居中。
css居中方式3
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中3</title> <style> *{margin:0;} div{display:flex;justify-content:center;align-items:center;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{width:100px;height:100px;background:#f99;} </style> </head> <body> <div> <p></p> </div> </body> </html>
這里利用了彈性盒居中
父元素div設置成彈性盒樣式,justify-content:center;主軸居中
align-items:center;垂直居中(而且這兩個只能設置在父元素上,彈性盒知識)
css居中方式4
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中4</title> <style> *{margin:0;} div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{width:100px;height:100px;background:#f99;position:absolute; left:50%;top:50%;margin:-50px 0 0 -50px;} </style> </head> <body> <div> <p></p> </div> </body> </html>
利用定位線左上角居中,然后左移子元素寬度的一半,再上移子元素高度的一半。
css居中方式5
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中5</title> <style> *{margin:0;} div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{position:absolute;width:100px;height:100px;background:#f99;left:50%;top:50%; transform:translate(-50%,-50%);} </style> </head> <body> <div> <p></p> </div> </body> </html>
利用動畫移動屬性transform
結語
相信看了上面的有關Html5、css的元素五大居中方式,你們就可以解決自己的小問題了,但是也要養成一個總結的好習慣。好記性不如爛筆頭!以前留下來的話語總是有他的道理。Come on!
原文鏈接:https://blog.csdn.net/qq_38110274/article/details/102756968
習css大家是不是對元素居中的知識點很是模糊?是不是苦于找不到一個總結的通俗易懂的說明?是不是自己懶得去總結?今天小編在前端的學習與實踐中總結出的元素的五大居中方式,黏貼了代碼并對代碼做了解釋,希望對迷茫的有所幫助!
下面的居中示例中,統一使用了同一個div作為父元素和p作為子元素
設置一個div,并且設置了div的寬高邊框,div里面設置一個塊元素p,設置了它的寬高和背景色
css居中方式1
這里利用了偽元素讓子元素p在div盒子里左右水平居中只需要在它的父元素div里加text-align:center;垂直方向居中需要在父元素后面加了一個偽元素,并使得樣式為inline-block;height:100%;就是和父元素一樣高,vertical-align:middle;垂直居中,也就是p元素相對與偽元素居中,由于偽元素和div一樣高,所以相當于p元素在div里垂直居中。
css居中方式2
這里利用了定位居中
子元素p設置position:absolute脫離文檔流,默認以html作為父元素,所以我們給父元素div設置position:relative;使得p以div為父元素做位置的變動,left:0;tight:0;top:0;bottom:0;(只有設置了定位的元素才可以使用這種方式來移動),最后margin:auto;就會水平和垂直都居中。
css居中方式3
這里利用了彈性盒居中
父元素div設置成彈性盒樣式,justify-content:center;主軸居中
align-items:center;垂直居中(而且這兩個只能設置在父元素上,彈性盒知識)
css居中方式4
利用定位線左上角居中,然后左移子元素寬度的一半,再上移子元素高度的一半。
css居中方式5
利用動畫移動屬性transform
小編是一個有著5年工作經驗的架構師,關于web前端,自己有做材料的整合,一個完整學習web前端的路線,學習材料和工具。需要的伙伴可以私信我,發送“前端”等3秒后就可以獲取領取地址,免費送給大家。對于學習web前端有任何問題(學習方法,學習效率,如何就業)都可以問我。希望你也能憑自己的努力,成為下一個優秀的程序員!
相信看了上面的有關Html5、css的元素五大居中方式,你們就可以解決自己的小問題了,但是也要養成一個總結的好習慣。好記性不如爛筆頭!以前留下來的話語總是有他的道理。Comeon!
們在日常使用移動APP的時候,特別是一些資訊類的APP,都會有圖片展示的相關UI,例如APP的單大圖和三圖模式,如下圖:單圖:
三圖:
或者是類似微博或者朋友圈這種9宮格的圖片展示效果,如下圖:
對于這些圖片,如果你單純的以為直接用幾個<img>,配置一下src地址,然后渲染在頁面上,那就大錯特錯了
對于這種類型的UI展示,我們需要明確下面幾點:
大家可以看下面這幾張圖,紅色的是圖片本身,虛線框就是展示出來的區域,便于理解:寬圖:
長圖:
CSS的background-size:
單獨使用CSS的話,我們可以輕松的實現上面這個效果,主要利用到的屬性就是background-size這個屬性,可以先從概念上了解一下這個屬性:
background-size: length|percentage|cover|contain
我們可以采用background-size:cover;比較合適,在保證縱橫比的情況下,如果圖片超過背景區域,將多余部分隱藏即可,同時設置background-position: center center;將主要內容居中顯示。
CSS的object-fit:
HTML5新增的<img />標簽的屬性object-fit也可滿足需求,但是要注意兼容性。
object-fit: fill|contain|cover|scale-down|none|initial|inherit;
主要用到以下屬性:
如果是一個單大圖,我們可以直接給一個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>,來實現這種效果,基本邏輯是:
這里的核心是如何根據外框的寬高來動態計算出圖片的位移,我們可以封裝一個方法來計算,具體的邏輯可以看注釋:
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技能中,圖片居中處理是一個非常重要的技能,也是用的比較多的一種技能,當然還有一些極端情況例如遇到面條圖,或者是長寬小于10px的這種非常小的圖片,可能需要單獨特殊邏輯處理了。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。