จะจัดเนื้อหา html ทั้งหมดให้อยู่ตรงกลางได้อย่างไร


คำตอบ:


116

ฉันเพิ่งสะดุดกับโพสต์เก่านี้และในขณะที่ฉันแน่ใจว่า user01 ได้พบคำตอบของเขามานานแล้ว แต่ฉันพบว่าคำตอบปัจจุบันไม่ค่อยได้ผล หลังจากเล่นไปเรื่อย ๆ โดยใช้ข้อมูลที่ผู้อื่นให้มาฉันพบวิธีแก้ปัญหาที่ใช้ได้กับ IE, Firefox และ Chrome ใน CSS:

html, body {
    height: 100%;
}

html {
    display: table;
    margin: auto;
}

body {
    display: table-cell;
    vertical-align: middle;
}

นี่เกือบจะเหมือนกันกับคำตอบของ abernier แต่ฉันพบว่าการรวมความกว้างจะทำให้จุดศูนย์กลางแตกเช่นเดียวกับการเว้นระยะขอบอัตโนมัติ ฉันหวังว่าคนอื่น ๆ ที่สะดุดในหัวข้อนี้จะพบว่าคำตอบของฉันเป็นประโยชน์

หมายเหตุ:ละเว้นhtml, body { height: 100%; }ให้จัดกึ่งกลางในแนวนอนเท่านั้น


คำตอบที่ดี. แค่สงสัย (เนื่องจากฉันไม่มีประสบการณ์กับ HTML มากนัก) การตั้งค่าความสูงเป็น 100% จำเป็นหรือไม่
พระอาทิตย์ตก 8

7
@JackHumphries ความสูงจำเป็นก็ต่อเมื่อคุณต้องการจัดแนวกึ่งกลางหน้าทั้งแกนแนวตั้งและแนวนอน หากคุณต้องการแนวนอนทั้งหมดคุณสามารถละเว้นความสูงได้
MildWolfie

37

คุณสามารถลอง:

body{ margin:0 auto; }

1
นี่เป็นคำตอบง่ายๆ แต่เป็นวิธีที่สะอาดและมีประสิทธิภาพที่สุดในการจัดให้แท็กเนื้อหาอยู่ตรงกลางหน้า
justinhartman

1
แม้ว่ามันจะสั้น แต่ก็ใช้ไม่ได้ใน IE, Edge Legacy, Edge, Chrome หรือ Firefox ปัญหาคือระยะขอบอัตโนมัติจะทำงานเฉพาะเมื่อความกว้างขององค์ประกอบน้อยกว่าระดับบนสุด เนื่องจากค่าเริ่มต้นของ 'body' เป็น 100% จึงไม่มีที่ว่างบนขอบเพื่อแทรกระยะขอบอัตโนมัติ คุณสามารถใช้body { margin:0 auto; max-width: 700px; }แล้วร่างกายของคุณจะมีขนาดไม่เกิน 700px และจะอนุญาตให้ใช้อุปกรณ์ขนาดเล็กได้
user3347790

17

แก้ไข

ณ วันนี้ด้วย flexbox คุณสามารถทำได้

body {
  display:flex; flex-direction:column; justify-content:center;
  min-height:100vh;
}

คำตอบก่อนหน้านี้

html, body {height:100%;}
html {display:table; width:100%;}
body {display:table-cell; text-align:center; vertical-align:middle;}

1
DOCTYPE ใดที่อนุญาตstyleแอตทริบิวต์ของhtmlเอนทิตี
สิ้นสุด

1
@ceving: ไม่แน่ใจว่าจะเข้าใจ ... หมายความว่า CSS ไม่ถูกต้องหรือไม่?
abernier

11

ถ้าฉันมีสิ่งหนึ่งที่ฉันชอบที่จะแบ่งปันเกี่ยวกับ CSS มันเป็นวิธีที่ฉันชอบในการเป็นศูนย์กลางของทั้งสองแกน !!!

ข้อดีของวิธีนี้ :

  1. เข้ากันได้กับเบราว์เซอร์ที่ผู้คนใช้งานจริง
  2. ไม่ต้องใช้ตาราง
  3. ใช้ซ้ำได้สูงสำหรับการจัดองค์ประกอบอื่น ๆ ไว้ตรงกลางภายในพาเรนต์
  4. มาพร้อมกับผู้ปกครองและเด็กที่มีมิติ (เปลี่ยนแปลง) แบบไดนามิก!

ฉันทำสิ่งนี้เสมอโดยใช้ 2 คลาส: หนึ่งเพื่อระบุองค์ประกอบหลักซึ่งเนื้อหาจะอยู่กึ่งกลาง ( .centered-wrapper) และอันที่ 2 เพื่อระบุว่าลูกของพาเรนต์ใดอยู่กึ่งกลาง ( .centered-content) คลาสที่ 2 นี้มีประโยชน์ในกรณีที่ผู้ปกครองมีลูกหลายคน แต่ต้องจัดให้มี 1 คนเท่านั้น) ในกรณีนี้bodyจะเป็น.centered-wrapperและด้านในจะเป็นdiv.centered-content

<html>
    <head>...</head>
    <body class="centered-wrapper">
        <div class="centered-content">...</div>
    </body>
</html>

ความคิดที่อยู่ตรงกลางในขณะนี้จะทำให้ นี้จะได้อย่างง่ายดายอำนวยความสะดวกอยู่ตรงกลางแนวนอนผ่านและยังช่วยให้แนวตั้งตรงกลางในขณะที่คุณจะได้เห็น.centered-contentinline-blocktext-align: center;

.centered-wrapper {
    position: relative;
    text-align: center;
}
.centered-wrapper:before {
    content: "";
    position: relative;
    display: inline-block;
    width: 0; height: 100%;
    vertical-align: middle;
}
.centered-content {
    display: inline-block;
    vertical-align: middle;
}

สิ่งนี้จะช่วยให้คุณสามารถนำกลับมาใช้ใหม่ได้จริง 2 ชั้นสำหรับการให้เด็กเป็นศูนย์กลางของผู้ปกครอง เพียงแค่เพิ่ม.centered-wrapperและ.centered-contentคลาส

แล้ว:beforeองค์ประกอบนั้นคืออะไร? ช่วยอำนวยความสะดวกvertical-align: middle;และจำเป็นเนื่องจากการจัดแนวตั้งไม่สัมพันธ์กับความสูงของพ่อแม่ - การจัดแนวแนวตั้งสัมพันธ์กับความสูงของพี่น้องที่สูงที่สุด !!! . ดังนั้นด้วยการตรวจสอบให้แน่ใจว่ามีพี่น้องที่มีความสูงเท่ากับความสูงของพ่อแม่ (สูง 100% ความกว้าง 0 เพื่อให้มองไม่เห็น) เราจึงรู้ว่าการจัดแนวตั้งจะเป็นไปตามความสูงของพ่อแม่

สิ่งสุดท้าย: คุณต้องตรวจสอบให้แน่ใจว่าแท็กhtmlและbodyแท็กของคุณมีขนาดเท่ากับหน้าต่างเพื่อให้ตรงกลางกับเบราว์เซอร์

html, body {
    width: 100%;
    height: 100%;
    padding: 0;
    margin: 0;
}

ซอ: https://jsfiddle.net/gershy/g121g72a/



8

ผมใช้ flexbox htmlบน เพื่อผลลัพธ์ที่ดีคุณสามารถจับคู่เบราว์เซอร์โครเมี่ยมเพื่อจัดเฟรมเนื้อหาของคุณบนหน้าจอที่มีขนาดใหญ่กว่าค่าสูงสุดของหน้าเว็บของคุณ ฉันพบว่า#eeeeeeมันเข้ากันได้ดี คุณสามารถเพิ่มเงากล่องเพื่อให้ได้เอฟเฟกต์การลอยตัวที่สวยงาม

    html{
        display: flex;
        flex-flow: row nowrap;  
        justify-content: center;
        align-content: center;
        align-items: center;
        height:100%;
        margin: 0;
        padding: 0;
        background:#eeeeee;
    }
    body {
        margin: 0;
        flex: 0 1 auto;
        align-self: auto;
        /*recommend 1920 / 1080 max based on usage stats, use 100% to that point*/
        width: 100%
        max-width: 900px;
        height: 100%;
        max-height: 600px;
        background:#fafafa;
        -webkit-box-shadow: 0px 0px 96px 0px rgba(0,0,0,0.75);
        -moz-box-shadow: 0px 0px 96px 0px rgba(0,0,0,0.75);
        box-shadow: 0px 0px 96px 0px rgba(0,0,0,0.75);
    }

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่ รูปภาพ / ข้อมูลที่เอื้อเฟื้อStatCounter


4
คำตอบที่ดีและทันสมัย เพียงไม่กี่ความคิดเห็น (a) คำนำหน้าผู้ขายสำหรับbox-shadowอาจซ้ำซ้อนเนื่องจากเบราว์เซอร์ที่flexรองรับbox-shadowด้วย (b) มี CSS จำนวนมากที่ตกแต่งคำตอบของคุณ แต่ทำให้ส่วนสำคัญแยกแยะได้ยาก ขอบคุณ
Manngo

มาก (b) ในความคิดเห็นของ @ Manngo ด้านบน
cjauvin

คำตอบที่ดี. ทันสมัย. แต่อาจเป็นเรื่องที่ง่ายกว่าที่มีเนื้อหาเดียวกัน
carloswm85

4
<style>
        body{
            max-width: 1180px;
            width: 98%;
            margin: 0px auto;
            text-align: left;
        }
</style>

เพียงใช้สไตล์นี้ก่อนที่จะใช้ CSS ใด ๆ คุณสามารถเปลี่ยนความกว้างได้ตามความต้องการของคุณ



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