整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Html5-CSS之元素的五大居中方式

          自己是一名從事了多年開發的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展示,我們需要明確下面幾點:

          1. 圖片在上傳后,會有不同的大小,有的是長圖(長大于寬),有的是寬圖(寬大于長),或者是一些接近正方形的圖片。
          2. 在保證圖片原本長寬比的情況下,要想將圖片顯示在一個正方形的區域內,或者是固定長寬的區域內,是必須要截取一部分圖片展示的。
          3. 采用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 中的一個相同,取決于它們兩個之間誰得到的對象尺寸會更小一些,更加智能。

          代碼效果demo:

          如果是一個單大圖,我們可以直接給一個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等于具體的設置的百分比。

          采用JavaScript來實現:

          其實從代碼的優雅程度上來說,采用我們上面講解的純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>,來實現這種效果,基本邏輯是:

          1. 首先需要知道圖片的寬高。
          2. 給每個<img>設置src之后,需要同時設置一個父div用來包裹這個<img>。
          3. 同時父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技能中,圖片居中處理是一個非常重要的技能,也是用的比較多的一種技能,當然還有一些極端情況例如遇到面條圖,或者是長寬小于10px的這種非常小的圖片,可能需要單獨特殊邏輯處理了。


          主站蜘蛛池模板: 亚洲国产精品一区二区第四页| 一夲道无码人妻精品一区二区| 亚洲日韩中文字幕无码一区| 久久精品无码一区二区三区不卡 | 麻豆一区二区在我观看| 人妻少妇精品视频三区二区一区| 亚洲一区在线免费观看| 日本一区精品久久久久影院| 波多野结衣在线观看一区二区三区| 多人伦精品一区二区三区视频| 无码中文字幕一区二区三区| 亚洲色一区二区三区四区| 水蜜桃av无码一区二区| 日韩内射美女人妻一区二区三区 | 一区二区三区内射美女毛片| 亚洲熟女www一区二区三区| 日韩一区二区三区电影在线观看| 无人码一区二区三区视频| 精品人妻AV一区二区三区| 国产成人精品无人区一区| 中文字幕VA一区二区三区 | 69久久精品无码一区二区| 亚洲欧美日韩中文字幕一区二区三区 | 久久精品无码一区二区app| 亚洲第一区香蕉_国产a| 日韩精品无码免费一区二区三区| 亚洲成av人片一区二区三区| 国产精品小黄鸭一区二区三区| 天码av无码一区二区三区四区 | 在线一区二区观看| 精品一区二区三区四区在线 | 一区二区三区视频| 日本成人一区二区三区| 国产av福利一区二区三巨| 亚洲sm另类一区二区三区| 丰满岳乱妇一区二区三区| 国产伦理一区二区三区| 亚洲一区日韩高清中文字幕亚洲| 亚洲乱码一区二区三区在线观看| 2022年亚洲午夜一区二区福利| 伊人色综合网一区二区三区 |