公司的一個面試題:如何用CSS讓一個容器水平垂直居中?

2021-02-21 前端開發

來自:張泰峰 - 博客園

連結:http://www.cnblogs.com/ztfjs/p/5250405.html

<!DOCTYPE html>
  <html>      <head>          <meta charset="UTF-8">          <title>demo</title>      </head>      <body>          <style type="text/css">              .div1{  width: 100px; height: 100px; border: 1px solid #000000;}                .div2{ width:40px ; height: 40px; background-color: green;}          </style>          <div class="div1">              <div class="div2">              </div>          </div>      </body>
  </html>

問題:如何讓class為div2的內部容器上下左右居中?  

前來面試的朋友大多數回答都不那么正確,筆者在這裡給大家做一個詳細的介紹

1、我們可以使用margin來達到這個效果

.div2{ width:40px ; height: 40px; background-color: green; margin-top: 30px; margin-left: 30px;}

--我們需要將div2的margin-left、margin-top值設置為父容器寬度的二分之一 減去 自身寬度的二分之一     這裡的父容器是div1

它的寬度是100px ; div2的寬度是40px  由此得出  margin-top: 30px; margin-left: 30px; div2也就居中了; 效果如下圖


2、利用絕對定位 position:absolute 配合margin的auto屬性 來達到居中的效果  我們可以將css修改為 

.div1{  width: 100px; height: 100px; border: 1px solid #000000; position: relative;}    
.div2{ width:40px ; height: 40px; background-color: green; position: absolute; margin: auto; left: 0; top: 0; right: 0; bottom: 0;}

---將div2設置為相對div1的絕對定位,margin設為四邊auto left、top、bottom、right設為0 瀏覽器會對絕對定位的容器margin:auto自動識別,

最後得到類似於margin:0 auto的效果;

而我們也可以將left、top、bottom、right設為你想要的值 讓div2可以在div1中的任意位置,只是定位的原點被margin:auto移動在div2的左上角;例如:

.div2{ width:40px ; height: 40px; background-color: green; position: absolute; margin: auto; left: 0; top: -30px; right: 0; bottom: 0;}

此時div2的位置在垂直居中的-30px的地方;


總結:在我們的網頁中,經常會遇到這樣的需求 彈窗的居中,圖片的居中,很多童鞋採用js算法動態設置left、top ; 而這一步是沒有必要的;

 非常感謝下面的博友的評論----

改了一下,這樣可以實現任意div2高度的,不用絕對定位。 

<style type="text/css">
   .div1{ width: 100px; height: 100px; border: 1px solid #000000; vertical-align:middle;display:table-cell;}
   .div2{ width:40px ; margin:0 auto; }
</style>
<div id="div1" class="div1">
   <div id="div2" class="div2">
   這是一段文字      </div>
</div>

 

另外貼一個方法二更詳細的介紹  

說明

在研究了規範和文檔後,我總結出了「完全居中」的工作原理:

在普通文檔流裡,margin: auto; 的意思是設置元素的margin-top和margin-bottom為0。

W3.org:?If 『margin-top』, or 『margin-bottom』 are 『auto』, their used value is 0.

2. 設置了position: absolute; 的元素會變成塊元素,並脫離普通文檔流。而文檔的其餘部分照常渲染,元素像是不在原來的位置一樣。 Developer.mozilla.org:?…an element that is positioned absolutely is taken out of the flow and thus takes up no space

3. 設置了top: 0; left: 0; bottom: 0; right: 0; 樣式的塊元素會讓瀏覽器為它包裹一層新的盒子,因此這個元素會填滿它相對父元素的內部空間,這個相對父元素可以是是body標籤,或者是一個設置了 position: relative; 樣式的容器。 Developer.mozilla.org:?For absolutely positioned elements, the top, right, bottom, and left properties specify offsets from the edge of the element’s containing block (what the element is positioned relative to).

4. 給元素設置了寬高以後,瀏覽器會阻止元素填滿所有的空間,根據margin: auto; 的要求,重新計算,並包裹一層新的盒子。 Developer.mozilla.org:?The margin of the [absolutely positioned] element is then positioned inside these offsets.

5. 既然塊元素是絕對定位的,又脫離了普通文檔流,因此瀏覽器在包裹盒子之前會給margin-top和margin-bottom設置一個相等的值。 W3.org:?If none of the three [top, bottom, height] are 『auto』: If both 『margin-top』 and 『margin-bottom』 are 『auto』, solve the equation under the extra constraint that the two margins get equal values.?AKA: center the block vertically

使用「完全居中」,有意遵照了標準margin: auto; 樣式渲染的規定,所以應當在與標準兼容的各種瀏覽器中起作用。

原文章地址:http://codepen.io/shshaw/full/gEiDt

●本文編號229,以後想閱讀這篇文章直接輸入229即可。

●輸入m可以獲取到文章目錄

15個技術類公眾微信

涵蓋:程序人生、算法與數據結構、黑客技術與網絡安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

最近發現一個好玩的測試,網際網路從業者都應該來試下,我得了 95 分,看看你能不能超過我!長按圖片識別二維碼或者點擊閱讀原文就可以參與。

相關焦點

  • CSS Grid 網格布局:「16」使用 place-content 屬性指定網格元素水平、垂直方向元素分布方式
    歡迎關注路條編程網站,通過學習 CSS Grid 網格布局這一系列文章,你將會逐步掌握網格布局的容器和項目、行和列、單元格、網絡線等相關的知識
  • CSS樣式大全
    想寫出一個精美的網頁,最離不開的就是CSS樣式表,熟練使用所有屬性,才會事半功倍。
  • 前端學習:這些CSS小技巧你都會嗎?
    為了幫助你提高效率,今天,就為大家分享一些CSS小技巧,如果你感覺有用,也可以收藏與分享給你的小夥伴們~將一段文字置於容器的水平中點,只要設置text-align屬性即可:先該容器設置一個明確寬度,然後將margin的水平值設為auto即可。
  • 網易遊戲面試題:如何設計一個公平的洗牌算法
    我記得在面試網易遊戲的時候,面試官當時是這樣問我的:「給你一副撲克牌,你能設計一個公平的洗牌算法嗎?」。我當時一懵,只想到了 rand() 函數,用來生成一個隨機數,就給面試官說:「我首先會 0 到 n-1 遍歷給定的數組元素,然後每次生成一個隨機數 rand() % (n - i) ,然後將第 i 個元素與下標為隨機數的元素交換,這樣是不是可以呢?」
  • css樣式大全
    ) top(垂直);簡寫方法 {background:#000 url(..) repeat fixed left top;} /*簡寫·這個在閱讀代碼中經常出現,要認真的研究*/區塊屬性: (Block) /*這個屬性第一次認識,要多多研究*/字間距 {letter-spacing: normal;} 數值 /*這個屬性似乎有用
  • 面試官:你可以用純 CSS 判斷滑鼠進入的方向嗎?
    •作者:陳大魚頭•github: KRISACHAN[1]前言在之前某一個前端技術群裡,有一個群友說他面試的時候遇到了一個問題,就是面試官讓他用純 CSS 來實現一個根據滑鼠移動位置覺得物體移動方向的 DEMO。
  • CSS魔法堂:Box-Shadow沒那麼簡單啦:)
    horizontal offset,陰影距離原位置的水平位移,正數表示向右移動,負數表示向左移動。vertical offset,陰影距離原位置的垂直位移,正數表示向下移動,負數表示向上移動。blur radius,默認值為0,陰影模糊度半徑。spread distance,默認值為0,擴展或縮小陰影的作用面積。
  • 想一個月搞定面試算法?來《九章算法班》!第一節免費試聽!
    想接受系統的面試算法培訓的同學,或想換工作的但是算法比較薄弱的工程師。0算法基礎即可參與學習。主講令狐衝老師,曾就職於超過2家矽谷頂尖IT企業,  北美和國內頂尖IT企業offer數10+,面試人數超過200人。課程大綱由易到難。只要你會任何一門計算機語言即可參加。尤其適合算法基礎相對薄弱的 or 轉專業的 or 想跳槽卻太久沒刷題的同學。分九個章節,系統的講授面試中涉及的算法知識。
  • 面試題:分身乏術如何協調矛盾?
    面試題:中心領導和一位處長在同一時間安排你做工作,你的時間只夠完成一其中一件事情,請問你該怎麼處理。
  • 【海龜湯大闖關】水平思考能力大考驗!IQ120卡在第六題?
  • 拼多多面試題:如何找出連續出現N次的內容?
    【拼多多面試題】兩隻籃球隊進行了激烈的比賽,比分交替上升。
  • 牛津奇葩面試題:你願意當吸血鬼還是殭屍?(中英文)
    比如,你得想好自己是願意當吸血鬼還是殭屍……今年,牛津大學因為一道面試題讓各大媒體都「驚恐」了一下:「你更願意當殭屍還是吸血鬼?」當個吸血鬼還會讓你擁有很多有用的超能力:誰不想能變成一隻蝙蝠,或者是催眠路人,讓那人臣服於你,然後發號施令呢?
  • CSS高級技巧:陰影效果
    點擊上方「web前端網頁設計」一鍵關注,更多網頁設計 UI設計 Html div css HTML5+CSS3、JavaScript
  • 面試官:請問,鉛筆姓什麼?回「鉛」的都錯了,女大學生機智回答
    許多面試官的問題也是一樣,一道道智力題迎頭痛擊,讓許多求職者做好的準備付諸流水。這些題真的有那麼難嗎?也許我們把自己放輕鬆,試試跳脫常規思維,也許問題並沒有我們想像那麼複雜。下面跟隨我們一起去看看他們的面試現場!朋友小玲最近剛大學畢業,在學校的時候,小玲是一個各方面都非優異的學生,而且經常抽出空閒時間做一些兼職工作,所以工作經歷還算豐富。
  • 女面試官:「一口吃掉牛尾巴」是什麼字?高材生機智回答,直接被錄取
    現在的職場,已經不再像以前的那麼簡單了,以前找工作只要是個健全的人,那麼就可以進到公司,可是現在很多的公司對於職員這一塊看得非常的中,不但要經過重重的考驗
  • 面試題:你有哪些性能優化方法
    我們知道從URL輸入到頁面渲染是一個比較複雜且耗時的過程,這個過程就從HTTP請求開始,比如請求html、css、js和圖片。一個完整的HTTP請求會經歷DNS查找->TCP3次握手->瀏覽器發送HTTP請求->伺服器接收請求->伺服器處理請求並返迴響應->瀏覽器接收響應。
  • 進階:玩轉 CSS 變量
    基礎用法在前端的領域中,標準的實現總是比社區的約定要慢的多,前端框架最喜歡的 $ 被 Sass 變量用掉了。而最常用的 @ 也被 Less 用掉了。官方為了讓 CSS 變量也能夠在 Sass 及 Less 中使用,無奈只能妥協的使用 --。
  • 變臉鳥:讓我想到了一個高考題
    最近有一個小視頻在朋友圈和微信群裡莫名地火了起來,就是下面這個:網友紛紛表示川劇變臉算是找到了生物學源頭了再看看麥可傑克遜的滑步
  • 林建東神簡歷之編導自述:一個只能讓你跪拜的人
    一個預設問題,可以幾秒內得到林建東4種答案甚至延伸的解答!用他的話說,就是一個問題,他會想到「一萬種回答和一萬種這麼問的原因」。  林建東似乎在我們面前,表現得過於沉悶,不怎麼開口說話。有時和他對臺本,80%時間他似乎在「神遊」,然而問題卻能精準地立刻回答。「我腦中的邏輯線很繁雜,可能是1對10000的關係,平時我都能把1秒當作4秒用。