ตรงกลางจัดตำแหน่ง div ตำแหน่งคงที่


127

ฉันกำลังพยายามหา div ที่position:fixedจัดกึ่งกลางหน้าเพจ

ฉันสามารถทำได้โดยใช้ div ตำแหน่งที่แน่นอนโดยใช้ "แฮ็ก" นี้

left: 50%; width: 400px; margin-left:-200px

... โดยที่ค่าขอบซ้ายคือครึ่งหนึ่งของความกว้างของ div

สิ่งนี้ดูเหมือนจะใช้ไม่ได้กับ div ตำแหน่งคงที่ แต่เพียงแค่วางโดยให้มุมซ้ายสุด 50% และละเว้นการประกาศระยะขอบซ้าย

มีแนวคิดในการแก้ไขอย่างไรเพื่อให้ฉันสามารถจัดตำแหน่งองค์ประกอบคงที่ได้

และฉันจะให้โบนัส M&M หากคุณสามารถบอกวิธีที่ดีกว่าในการจัดตำแหน่งองค์ประกอบที่อยู่ตรงกลางได้ดีกว่าวิธีที่ฉันอธิบายไว้ข้างต้น


ใช้ได้ผลสำหรับฉัน ทั้งหมดยกเว้น IE6 (ชัดเจน)
bobince

@Kyle หากคุณสามารถเลือกคำตอบได้ก็จะช่วยให้ผู้ใช้รายอื่นระบุวิธีแก้ปัญหาของคุณได้
andreihondrari

คำตอบ:


202

คำตอบของ Koen ไม่ได้เน้นที่องค์ประกอบอย่างแน่นอน

วิธีที่เหมาะสมคือการใช้CCS3 transformทรัพย์สิน แม้ว่าเบราว์เซอร์รุ่นเก่าบางรุ่นจะไม่รองรับก็ตาม widthและเราไม่จำเป็นต้องแม้กระทั่งการตั้งญาติคงที่หรือ

.centered {
    position: fixed;
    left: 50%;
    transform: translate(-50%, 0);
}

ทำงานเปรียบเทียบ jsfiddle ที่นี่


1
ที่สมบูรณ์แบบ ฉันใช้สิ่งนี้สำหรับแอปพลิเคชัน Cordova และคาดว่าจะทำงานในเบราว์เซอร์ที่อัปเดตหลัก ๆ :)
saurabh

2
ง่ายมาก แต่มีประโยชน์โดยสิ้นเชิง ขอบคุณ.
Gilberto Sánchez

ว้าวขอบคุณ! ฉันพยายามจัดข้อความให้อยู่กึ่งกลางระหว่างสอง div ที่ไม่เท่ากันและนี่เป็นข้อความเดียวที่ใช้งานได้โดยไม่ทำลายมาร์กอัป!
Andrey Kaipov

4
คำตอบที่แท้จริง +1
sn3ll

3
@Alex left: 50%ย้าย div ไปที่ 50% ของหน้า แต่คุณต้องจำไว้ว่ามันเคลื่อนโดยเริ่มจากด้านซ้ายของ div ดังนั้น div จึงยังไม่อยู่ตรงกลาง translate(-50%, 0)ซึ่งโดยพื้นฐานแล้วจะtranslateX(-50%)พิจารณาความกว้างปัจจุบันของ div และเลื่อนไป -50% ของความกว้างไปทางด้านซ้ายจากตำแหน่งจริง
emil.c

168

สำหรับคนที่มีปัญหาเดียวกันนี้ แต่ด้วยการออกแบบที่ตอบสนองคุณยังสามารถใช้:

width: 75%;
position: fixed;
left: 50%;
margin-left: -37.5%;

การทำเช่นนี้จะทำให้คุณdivอยู่กึ่งกลางหน้าจอเสมอแม้จะมีการออกแบบที่ตอบสนอง


2
สิ่งนี้ช่วยฉันในโครงการ RWD :)
tctc91

6
37.5% เหล่านี้ได้มาจากไหน?
ออโรร่า

7
@aurora - มันคือ -1/2 ของการตั้งค่าตำแหน่ง ( -(75/2)ในกรณีนี้)
Inaimathi

1
ทำไมคำตอบที่ได้รับการยอมรับจึงไม่เป็นปริศนามันใช้งานได้จริง (tm)
CGK

2
Cropis มีทางออกที่ดีกว่า
Arnaldo Capo

44

คุณสามารถใช้ flexbox สำหรับสิ่งนี้ได้เช่นกัน

.wrapper {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  
  /* this is what centers your element in the fixed wrapper*/
  display: flex;
  flex-flow: column nowrap;
  justify-content: center; /* aligns on vertical for column */
  align-items: center; /* aligns on horizontal for column */
  
  /* just for styling to see the limits */
  border: 2px dashed red;
  box-sizing: border-box;
}

.element {
  width: 200px;
  height: 80px;

  /* Just for styling */
  background-color: lightyellow;
  border: 2px dashed purple;
}
<div class="wrapper"> <!-- Fixed element that spans the viewport -->
  <div class="element">Your element</div> <!-- your actual centered element -->
</div>


12
ทำไมต้องพูดถึง center และ align = "center"? text-align: center is the way
wlf

1
คุณควรรวมลักษณะการจัดแนวข้อความลงในตัวอย่างของคุณ
Manatax

ขอบคุณมาก! สิ่งนี้ช่วยฉันได้จริงๆ!
Joan.bdm

ฉันได้แก้ไขคำตอบของฉันโดยลบการกล่าวถึง<center>ซึ่งเลิกใช้แล้วและโดยใช้เทคนิคสมัยใหม่เช่นdisplay: flexคุณสมบัติที่เกี่ยวข้องบางอย่าง
andreihondrari

33

จากโพสต์ด้านบนผมคิดว่าวิธีที่ดีที่สุดคือ

  1. มี div คงที่ด้วย width: 100%
  2. ภายใน div ที่ทำให้ div คงใหม่ที่มีmargin-left: autoและหรือสำหรับตารางทำให้มันmargin-right: autoalign="center"
  3. Tadaaaah คุณได้จัดกึ่งกลาง div คงที่แล้ว

หวังว่านี่จะช่วยได้


2
+1 มีประโยชน์มากหากคุณต้องการจัดกึ่งกลาง div ด้วยความกว้างคงที่ด้วย เช่น 990px.
dcernahoschi

นี่เป็นวิธีเดียวที่ฉันรู้เพื่อให้max-widths สำหรับองค์ประกอบตำแหน่งคงที่ คุณต้องการแถบด้านข้างแบบคงที่ที่ตอบสนองต่อ 30% ของmax-width: 1200pxหน้าเว็บของคุณหรือไม่? สิ่งนี้จะพาคุณไปที่นั่น
Michael

7

Divs ปกติควรใช้margin-left: autoและmargin-right: autoแต่ใช้ไม่ได้กับ div คงที่ วิธีการแก้ปัญหานี้คล้ายกับคำตอบของ Andrewแต่ไม่ใช้<center>สิ่งที่เลิกใช้แล้ว โดยทั่วไปเพียงแค่ให้กระดาษห่อหุ้ม div คงที่

#wrapper {
    width: 100%;
    position: fixed;
    background: gray;
}
#fixed_div {
    margin-left: auto;
    margin-right: auto;
    position: relative;
    width: 100px;
    height: 30px;
    text-align: center;
    background: lightgreen;
}
<div id="wrapper">
    <div id="fixed_div"></div>
</div

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


4

หากคุณต้องการจัดกึ่งกลางของตำแหน่งคงที่ div ทั้งแนวตั้งและแนวนอนให้ใช้สิ่งนี้

position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);

4
<div class="container-div">
  <div class="center-div">

  </div>
</div>

.container-div {position:fixed; left: 0; bottom: 0; width: 100%; margin: 0;}
.center-div {width: 200px; margin: 0 auto;}

สิ่งนี้ควรทำเช่นเดียวกัน


3

ถ้าคุณรู้ว่าความกว้างคือ 400px นี่เป็นวิธีที่ง่ายที่สุดที่จะทำได้

 left: calc(50% - 200px);

2

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

ความกว้าง: คำนวณ (ความกว้าง: 100% - ความกว้างสิ่งอื่นใดที่อยู่ตรงกลาง)

ตัวอย่างเช่นถ้าแถบนำทางด้านข้างของคุณคือ 200px:

ความกว้าง: คำนวณ (100% - 200px);


1

ใช้ความกว้างค่อนข้างง่าย: 70%; ซ้าย: 15%;

ตั้งค่าความกว้างขององค์ประกอบเป็น 70% ของหน้าต่างและเหลือ 15% ทั้งสองด้าน


1

ฉันใช้สิ่งต่อไปนี้กับ Twitter Bootstrap (v3)

<footer id="colophon" style="position: fixed; bottom: 0px; width: 100%;">
    <div class="container">
        <p>Stuff - rows - cols etc</p>
    </div>
</footer>

กล่าวคือสร้างองค์ประกอบความกว้างเต็มซึ่งเป็นตำแหน่งคงที่และเพียงแค่ดันคอนเทนเนอร์เข้าไปในนั้นคอนเทนเนอร์จะอยู่ตรงกลางเมื่อเทียบกับความกว้างเต็ม ควรปฏิบัติอย่างมีความรับผิดชอบด้วย


0

วิธีแก้ปัญหาโดยใช้กล่องดิ้น ตอบสนองอย่างเต็มที่:

parent_div {
    position: fixed;
    width: 100%;
    display: flex;
    justify-content: center;
}

child_div {
    /* whatever you want */
}

-1

หากคุณไม่ต้องการใช้วิธีการห่อ จากนั้นคุณสามารถทำได้:

.fixed_center_div {
  position: fixed;
  width: 200px;
  height: 200px;
  left: 50%;
  top: 50%;
  margin-left: -100px; /* 50% of width */
  margin-top: -100px; /* 50% of height */
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.