วิธีจัดองค์ประกอบให้อยู่กึ่งกลางในแนวนอนและแนวตั้ง


408

ฉันพยายามจัดกึ่งกลางแท็บเนื้อหาในแนวตั้ง แต่เมื่อฉันเพิ่มสไตล์ CSS display:inline-flexการจัดแนวข้อความในแนวนอนจะหายไป

ฉันจะจัดแนวข้อความทั้งสองให้เป็น x และ y สำหรับแต่ละแท็บได้อย่างไร

* { box-sizing: border-box; }
#leftFrame {
  background-color: green;
  position: absolute;
  left: 0;
  right: 60%;
  top: 0;
  bottom: 0;
}
#leftFrame #tabs {
  background-color: red;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 25%;
}
#leftFrame #tabs div {
  border: 2px solid black;
  position: static;
  float: left;
  width: 50%;
  height: 100%;
  text-align: center;
  display: inline-flex;
  align-items: center;
}
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>
  </div>
</div>


วิธี CSS ล่าสุดที่ใช้ flex display type และการแปลง CSS 2 มิติโดยไม่มีศูนย์ความกว้างและความสูง div แนวนอนและแนวตั้งโดยใช้วิธี CSS เท่านั้นfreakyjolly.com/…
Code Spy

คำตอบ:


666

.container {
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
<div class="container">
    <span>I'm vertically/horizontally centered!</span>
</div>


html, body, .container {
    height: 100%;
}

.container {
    display: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-flex-align: center;
    -ms-flex-align: center;
    -webkit-align-items: center;
    align-items: center;
    justify-content: center;
}
<div class="container"> 
  <span>I'm vertically/horizontally centered!</span>
</div>


  • วิธีที่ 3 - table-cell/ vertical-align: middle:

    ตัวอย่างที่นี่ /ตัวอย่างเต็มหน้าจอ

    ในบางกรณีคุณจะต้องให้แน่ใจว่าhtml/ ความสูงขององค์ประกอบมีการตั้งค่าbody100%

    สำหรับการจัดตำแหน่งแนวตั้งองค์ประกอบหลักของwidth/ heightการและเพิ่ม100% display: tableแล้วสำหรับองค์ประกอบเด็กที่เปลี่ยนdisplayไปและเพิ่มtable-cellvertical-align: middle

    สำหรับการจัดกึ่งกลางแนวนอนคุณสามารถเพิ่มtext-align: centerการจัดกึ่งกลางข้อความและinlineองค์ประกอบลูก ๆ หรือคุณสามารถใช้margin: 0 autoโดยสมมติว่าองค์ประกอบนั้นเป็นblockระดับ

html, body {
    height: 100%;
}
.parent {
    width: 100%;
    height: 100%;
    display: table;
    text-align: center;
}
.parent > .child {
    display: table-cell;
    vertical-align: middle;
}
<section class="parent">
    <div class="child">I'm vertically/horizontally centered!</div>
</section>


  • วิธีที่ 4 - วางตำแหน่ง50%จากบนสุดด้วยการกระจัด:

    ตัวอย่างที่นี่ /ตัวอย่างเต็มหน้าจอ

    วิธีการนี้อนุมานว่าข้อความที่มีความสูงที่รู้จักกัน - 18pxในกรณีนี้ เพียงวางตำแหน่งองค์ประกอบ50%จากด้านบนสัมพันธ์กับองค์ประกอบหลัก ใช้ลบmargin-topค่าที่เป็นครึ่งหนึ่งขององค์ประกอบของความสูงที่รู้จักกันในกรณีนี้ -9px-

html, body, .container {
    height: 100%;
}

.container {
    position: relative;
    text-align: center;
}

.container > p {
    position: absolute;
    top: 50%;
    left: 0;
    right: 0;
    margin-top: -9px;
}
<div class="container">
    <p>I'm vertically/horizontally centered!</p>
</div>


  • วิธีที่ 5 - line-heightวิธีการ (ยืดหยุ่นน้อยที่สุด - ไม่แนะนำ):

    ตัวอย่างที่นี่

    ในบางกรณีองค์ประกอบหลักจะมีความสูงคงที่ สำหรับการจัดกึ่งกลางแนวตั้งสิ่งที่คุณต้องทำคือตั้งline-heightค่าในองค์ประกอบลูกเท่ากับความสูงคงที่ขององค์ประกอบหลัก

    แม้ว่าวิธีนี้จะทำงานในบางกรณีก็เป็นที่น่าสังเกตว่ามันจะไม่ทำงานเมื่อมีข้อความหลายบรรทัด - เช่นนี้

.parent {
    height: 200px;
    width: 400px;
    background: lightgray;
    text-align: center;
}

.parent > .child {
    line-height: 200px;
}
<div class="parent">
    <span class="child">I'm vertically/horizontally centered!</span>
</div>


3
ใช่ว่าใช้งานได้ ฉันเคยชินกับการ inline-flex บน css3 ดังนั้นฉันจึงลืมวิธีการใช้ aproach อย่างถูกต้อง ฉันซาบซึ้งจริงๆขอบคุณมาก
shuji

ฉันเปิดตัวอย่าง "เต็มหน้าจอ" ด้านบนทั้งหมดฉันสังเกตเห็นว่าการจัดเรียงแนวตั้งอยู่ใกล้กับด้านล่างของหน้าจอเล็กน้อย (ด้วยความละเอียด 1920x1080 ความละเอียดป้ายอยู่ที่ 20 พิกเซลต่ำเกินไปในหน้าจอ) ฉันใช้วิธีการ # 2 ในหน้าเว็บของฉันและได้รับปัญหาเดียวกันแม้ว่า div ไม่เต็มหน้าจอ ปัญหาคือยิ่งแย่ลงในหน้าเว็บของฉัน (ต่ำเกินไป 100px) ...
AXMIM

คุณอาจต้องการเพิ่มวิธีที่ 6 โดยใช้ flexbox (ทำงานใน IE9 +, [90% + การครอบคลุมตลาดเบราว์เซอร์]] (caniuse.com/#feat=flexbox): display: flexในแม่และalign-self: centerในลูก
Dan Dascalescu

ผมเปลี่ยนวิธีการเล็ก ๆ น้อย ๆ 2: jsfiddle.net/yeaqrh48/278 ด้วยเหตุนี้การลดความสูงของหน้าต่างข้อความจึงเกินขอบเขตและไม่สามารถมองเห็นได้ วิธีแก้ปัญหานี้
ollazarev

1
@ josh-crozier เพิ่งพบเว็บไซต์ที่มีลิงก์ไปยังโพสต์ของคุณใน css xd
zoran404

31

หาก CSS3 เป็นตัวเลือก (หรือคุณมีทางเลือกสำรอง) คุณสามารถใช้การแปลง:

.center {
    right: 50%;
    bottom: 50%;
    transform: translate(50%,50%);
    position: absolute;
}

ไม่เหมือนกับวิธีแรกข้างต้นคุณไม่ต้องการใช้ซ้าย: 50% พร้อมการแปลเชิงลบเนื่องจากมีข้อบกพร่องล้นใน IE9 + ใช้ประโยชน์จากค่าที่เป็นบวกและคุณจะไม่เห็นแถบเลื่อนแนวนอน


ฉันเชื่อว่าการแปลงควรจะเป็นtransform: translateX(50%) translateY(50%);แทน แปลงดังกล่าวข้างต้นไม่ถูกต้อง syntactically ตามMozilla แปลงเอกสาร
Eirik H

1
@EirikH ไม่แน่ใจว่าสิ่งที่คุณกำลังมองหา แต่ไวยากรณ์ที่ได้ดี (และพูดอย่างนั้นในเอกสาร) ค่าส่วนใหญ่transformที่สามารถรับค่า X และ Y มีฟังก์ชั่นพื้นฐานเพื่อใช้ทั้งฟังก์ชั่นพิเศษและฟังก์ชั่นพิเศษที่จะใช้เพียงหนึ่ง
Scott Marcus

9

วิธีที่ดีที่สุดในการจัดกึ่งกลางของกล่องทั้งแนวตั้งและแนวนอนคือใช้ภาชนะสองอัน:

ภาชนะนอก:

  • ควรมี display: table;

ภาชนะภายใน:

  • ควรมี display: table-cell;
  • ควรมี vertical-align: middle;
  • ควรมี text-align: center;

กล่องเนื้อหา:

  • ควรมี display: inline-block;
  • ควรปรับการจัดแนวข้อความในแนวนอนเว้นแต่คุณต้องการให้ข้อความอยู่กึ่งกลาง

การสาธิต :

body {
    margin : 0;
}

.outer-container {
    display: table;
    width: 80%;
    height: 120px;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

ดูซอนี้ !

อยู่ตรงกลางหน้า:

ในการจัดศูนย์กลางเนื้อหาของคุณไว้ตรงกลางของหน้าให้เพิ่มสิ่งต่อไปนี้ลงในคอนเทนเนอร์ของคุณ

  • position : absolute;
  • width: 100%;
  • height: 100%;

นี่คือตัวอย่างสำหรับ:

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

ดูซอนี้ !


7

นี่คือวิธีการใช้ 2 คุณสมบัติยืดหยุ่นอย่างง่ายเพื่อจัดกึ่งกลาง n divs ใน 2 แกน:

  • ตั้งค่าความสูงของคอนเทนเนอร์ของคุณ: ที่นี่ร่างกายถูกตั้งค่าอย่างน้อย 100vh
  • align-items: center จะจัดกึ่งกลางบล็อกตามแนวตั้ง
  • justify-content: space-around จะกระจายพื้นที่แนวนอนว่างรอบ ๆ div

body {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: space-around;
}
<div>foo</div>
<div>bar</div>


5

เรียกใช้ข้อมูลโค้ดนี้และดู div ในแนวตั้งและแนวนอน

html,
body,
.container {
  height: 100%;
  width: 100%;
}
.container {
  display: flex;
  align-items: center;
  justify-content: center;
}
.mydiv {
  width: 80px;
}
<div class="container">
  <div class="mydiv">h & v aligned</div>
</div>


3

ทางออกที่ง่ายและสะอาดที่สุดสำหรับฉันคือการใช้คุณสมบัติ "transform" ของ CSS3:

.container {
  position: relative;
}

.container a {
  position: absolute;
  top: 50%;
  transform: translate(0,-50%);
}
<div class="container">
  <a href="#">Hello world!</a>
</div>


3

    .align {
        display: flex;
        width: 400px;
        height: 400px;
        border: solid 1px black;
        align-items: center;
        justify-content: space-around;
    }
    .align div:first-child {
        width: 20px;
        height: 20px;
        background-color: red;
        position: absolute; 
    }
    .align div {
        width: 20px;
        height: 20px;
        background-color: blue;
    }
    <div class='align'>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>

เด็กคนแรกจะถูกจัดชิดในแนวตั้งและแนวนอนที่กึ่งกลาง


2

เพื่อจัดกึ่งกลาง Div ในหน้า check the fiddle link

#vh {
    border-radius: 15px;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
    padding: 25px;
    width: 200px;
    height: 200px;
    background: white;
    text-align: center;
    margin: auto;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
}
<div id="vh">Div to be aligned vertically</div>

อัปเดต อีกตัวเลือกหนึ่งคือใช้กล่องแบบยืดหยุ่น check the fiddle link

.vh {
    background-color: #ddd;
    height: 200px;
    align-items: center;
    display: flex;
}
.vh > div {
    width: 100%;
    text-align: center;
    vertical-align: middle;
}
<div class="vh">
    <div>Div to be aligned vertically</div>
</div>


2

ด้านล่างนี้เป็นวิธีการแบบยืดหยุ่นเพื่อให้ได้ผลลัพธ์ที่ต้องการ

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Flex-box approach</title>
<style>
  .tabs{
    display: -webkit-flex;
    display: flex;
    width: 500px;
    height: 250px;
    background-color: grey;
    margin: 0 auto;
    
  }
  .f{
    width: 200px;
    height: 200px;
    margin: 20px;
    background-color: yellow;
    margin: 0 auto;
    display: inline; /*for vertically aligning */
    top: 9%;         /*for vertically aligning */
    position: relative; /*for vertically aligning */
  }
</style>
</head>
<body>

    <div class="tabs">
        <div class="f">first</div>
        <div class="f">second</div>        
    </div>

</body>
</html>


2

อีกวิธีคือใช้ตาราง:

<div style="border:2px solid #8AC007; height:200px; width:200px;">
  <table style="width:100%; height:100%">
    <tr style="height:100%">
      <td style="height:100%; text-align:center">hello, multiple lines here, this is super long, and that is awesome, dude</td>
    </tr>
  </table>
</div>


2

เพื่อให้องค์ประกอบอยู่ในแนวตั้งและแนวนอนเราสามารถใช้คุณสมบัติที่กล่าวถึงด้านล่างได้

คุณสมบัติ CSS นี้จัดเรียงรายการตามแนวตั้งและยอมรับค่าต่อไปนี้:

การโค้งงอเริ่มต้น : รายการจัดเรียงไว้ที่ด้านบนของคอนเทนเนอร์

flex-end : รายการที่จัดไว้ที่ด้านล่างของภาชนะ

center : รายการจัดเรียงที่กึ่งกลางแนวตั้งของคอนเทนเนอร์

baseline : รายการแสดงที่ baseline ของคอนเทนเนอร์

ยืด : รายการถูกยืดให้พอดีกับภาชนะ

justify-contentคุณสมบัติ CSS นี้ซึ่งจัดเรียงรายการในแนวนอนและยอมรับค่าต่อไปนี้:

การโค้งงอเริ่มต้น : รายการจัดเรียงทางด้านซ้ายของคอนเทนเนอร์

flex-end : รายการจัดชิดด้านขวาของคอนเทนเนอร์

center : รายการจัดเรียงที่กึ่งกลางของคอนเทนเนอร์

ช่องว่างระหว่าง : รายการที่แสดงที่มีระยะห่างเท่ากันระหว่างพวกเขา

space-around : รายการแสดงด้วยระยะห่างเท่ากันรอบ ๆ


2

วิธีการ css กริด

#wrapper {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(3, 1fr);
}
.main {
    background-color: #444;
}
<div id="wrapper">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box main"></div>
</div>


2

จำเป็นต้องทำตามวิธีแก้ปัญหาใหม่และง่าย:

  .centered-class {
      align-items: center;
      display: flex;
      justify-content: center;
      width: 100vw;
      height: 100vh;
    }
<div class="centered-class">
  I'm in center vertically and horizontally.
</div>


1
  • วิธีที่ 6

/*Change units to "%", "px" or whatever*/

#wrapper{
  width: 50%;
  height: 70vh;
  background: rgba(0,0,0,.5);
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}
#left{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  background: red;
}
#right{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  margin: auto;
  background: green;
}
.txt{
  text-align: center;
  line-height: 50vh;
}
<div id="wrapper">
   <div id="left" class="txt">Left</div>
   <div id="right" class="txt">Right</div>
</div>

    .container{ 
               width: 50%;  //Your container width here
               height: 50%; //Your container height here
               position: absolute; 
               top: 0; 
               right: 0;  
               bottom: 0; 
               left: 0; 
               margin: auto;
    }

1

เพียงแค่ทำให้ด้านบนด้านล่างซ้ายและขวาเป็น 0

<html>
<head>
<style>
<div> 
{
position: absolute;
margin: auto;
background-color: lightblue;
width: 100px;
height :100px;
padding: 25px;
top :0;
right :0;
bottom:0;
left:0;
}


</style>
</head>
<body>

<div> I am in the middle</div>

</body>
</html>

1

คุณสามารถทำได้โดยใช้ CSS (องค์ประกอบของคุณdisplay:inline-grid+ grid-auto-flow: row;) กริดและ Flex Box (องค์ประกอบหลักdisplay:flex;)

ดูตัวอย่างด้านล่าง

#leftFrame {
  display: flex;
  height: 100vh;
  width: 100%;
}

#tabs {
  display: inline-grid;
  grid-auto-flow: row;
  grid-gap: 24px;
  justify-items: center;
  margin: auto;
}

html,body {
  margin:0;
  padding:0;
}
<div>
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>        
  </div>
</div>
</div>


1

ลิงค์ที่มา

วิธีที่ 1) การแสดงผลชนิดยืดหยุ่น

.child-element{
     display: flex;
     justify-content: center;
     align-items: center;
}

วิธีที่ 2) การแปลง 2D

.child-element {
   top: 50%;
   left: 50%;
   transform: translate(-50% , -50%);
   position: absolute;
}

ดูวิธีการอื่น ๆที่นี่


1

วิธีที่ง่ายที่สุดในการจัดศูนย์กลางของ div ทั้งแนวตั้งและแนวนอนมีดังนี้:

<div style="display: table; width: 200px; height: 200px; border: 1px solid black;">
    <div style="display: table-cell; vertical-align: middle; text-align: center;">
        Text Here
    </div>
</div>

อีกหนึ่งตัวอย่าง :

.parent {
    display: table; 
    width: 100%; 
    height: 100%;
}

.child {
    display: table-cell; 
    vertical-align: middle;
    text-align: center;
}


<div class="parent">
    <div class="child">
        <h4><u>SERVICE IN BANGLADESH FLEET RESERVE <br> AND <br> RE-ENGAGEMENT ORDER FOR DEFENCE SERVICE</u></h4>
    </div>
</div>

1

นี่เป็นปัญหาที่เกี่ยวข้องที่ผู้คนอาจมาที่หน้านี้เมื่อทำการค้นหา: เมื่อฉันต้องการจัดวาง div ไว้ที่กึ่งกลาง (สี่เหลี่ยมจัตุรัส 100px) "กำลังรอ .. " "gif แบบเคลื่อนไหวที่ฉันใช้:

  .centreDiv {
        position: absolute;
        top: calc(50vh - 50px);
        top: -moz-calc(50vh - 50px);
        top: -webkit-calc(50vh - 50px);
        left: calc(50vw - 50px);
        left: -moz-calc(50vw - 50px);
        left: -webkit-calc(50vw - 50px);
        z-index: 1000; /*whatever is required*/
    }

1

หากคุณต้องการโดยไม่มี :
flexbox / grid / table
หรือไม่มี :
align-align: middle

คุณทำได้:

HTML

<div class="box">
  <h2 class="box_label">square</h2>
</div>

CSS

.box {
  box-sizing: border-box;
  width: 100px;
  height: 100px;
  text-align: center;
  border: 1px solid black;
}

.box_label {
  box-sizing: border-box;
  display: inline-block;
  transform: translateY(50%);
  text-align: center;
  border: 1px solid black;
}


0

ง่าย! ใช้เฟล็กซ์จอแสดงผลบนคอนเทนเนอร์และระยะขอบอัตโนมัติกับข้อความ !!!!

#hood{

 width : 300px;
 height: 100px;
 border: solid 1px #333333;
 display: flex; 
}

#hood span{

  margin: auto
}



<html>
<head></head>
    <body>
        <div id="hood">
            <span> I Am Centered</span>
        </div>
    </body>
</html>

การสาธิต: https://jsfiddle.net/ay95f08g/

ทดสอบแล้ว: Safari, Chrome, Firefox และ Opera บน MacOs Mojave (อัพเดทล่าสุดทั้งหมดในวันที่ 25 กุมภาพันธ์ 2019)


0

มีอยู่มากมายให้ทำเช่นเดียวกัน คุณสามารถใช้วิธีการต่อไปนี้เพื่อให้ div อยู่ตรงกลางของหน้า

.center-box {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
}
<div class="center-box">
  <h1>Text in center of page</h1>
</div>

ไชโย!


0

flexboxวิธีที่ง่ายที่สุด:

วิธีที่ง่ายที่สุดวิธีจัดองค์ประกอบเดี่ยวให้อยู่ในแนวตั้งและแนวนอนคือทำให้มันเป็นรายการที่ยืดหยุ่นและตั้งค่าระยะขอบให้เป็นauto:

หากคุณใช้ระยะขอบอัตโนมัติกับรายการ flex รายการนั้นจะขยายระยะขอบที่ระบุโดยอัตโนมัติเพื่อใช้พื้นที่พิเศษในคอนเทนเนอร์ flex ...

.flex-container {
  height: 150px;
  display: flex;
}

.flex-item {
  margin: auto;
}
<div class="flex-container">
  <div class="flex-item">
    This should be centered!
  </div>
</div>

การขยายระยะขอบในแต่ละทิศทางจะผลักองค์ประกอบตรงกลางภาชนะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.