วิธีการวาง div ข้างกัน


241

ฉันมี div wrapper หลักที่ตั้งค่าความกว้าง 100% ข้างในนั้นฉันต้องการมีสองตัวหนึ่งตัวที่มีความกว้างคงที่และอีกอันที่เติมเต็มพื้นที่ที่เหลือ ฉันจะลอย div ที่สองเพื่อเติมพื้นที่ที่เหลือได้อย่างไร ขอบคุณสำหรับความช่วยเหลือ


2
ครั้งต่อไปควรวางโค้ดตัวอย่างของคุณด้วยดังนั้นคำถามจะชัดเจนสำหรับนักพัฒนาที่นี่ ..
Rob

1
คือตำแหน่ง: ตัวเลือกที่แน่นอน? คุณสามารถกำหนดตำแหน่งไปที่ด้านข้างของคอนเทนเนอร์และ div จะใช้ขนาดใหม่
AlexanderMP

คำตอบ:


363

มีหลายวิธีในการทำสิ่งที่คุณต้องการ:

  1. ใช้คุณสมบัติCSSfloat :

    <div style="width: 100%; overflow: hidden;">
        <div style="width: 600px; float: left;"> Left </div>
        <div style="margin-left: 620px;"> Right </div>
    </div>
  2. การใช้คุณสมบัติCSSdisplay - ซึ่งสามารถใช้เพื่อทำให้การdivกระทำเหมือนtable:

    <div style="width: 100%; display: table;">
        <div style="display: table-row">
            <div style="width: 600px; display: table-cell;"> Left </div>
            <div style="display: table-cell;"> Right </div>
        </div>
    </div>

มีวิธีการเพิ่มเติม แต่ทั้งสองเป็นที่นิยมมากที่สุด


17
โซลูชัน HTML 5 จาก @filoxo ให้ใช้แทน
TheMcMurder

1
สิ่งที่ผู้วิจารณ์คนก่อนหน้ากล่าวว่า: พิจารณาเพิ่มโซลูชัน HTML5 ต่อ filoxo เป็น # 3
Ahmed Fasih

2
@TheMcMurder: สำหรับเราที่ต้องการรองรับเบราว์เซอร์รุ่นเก่า (เช่น IE <11) นั่นไม่ใช่ตัวเลือก
Oyvind

@Oyvind คุณพูดถูก มันขึ้นอยู่กับกรณีการใช้งานของคุณ หากคุณสนับสนุน IE 8, 9 หรือ 10 คุณจะต้องสนับสนุน polyfill ฉันแนะนำบริการเช่น polyfill.io cdn.polyfill.io/v2/docsหรือgithub.com/10up/flexibilityแต่คุณอาจเข้มงวดมาก ข้อกำหนดที่ป้องกันการใช้ polyfills
TheMcMurder

1
ล้น: สิ่งที่ซ่อนอยู่ทำอย่างไร ไม่ใช่สำหรับองค์ประกอบที่มีความสูงที่ระบุหรือไม่
ไมเคิล

177

CSS3 แนะนำกล่องแบบยืดหยุ่น (aka. flex box) ซึ่งสามารถบรรลุพฤติกรรมนี้ได้

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

.container{
    display: flex;
}
.fixed{
    width: 200px;
}
.flex-item{
    flex-grow: 1;
}
<div class="container">
  <div class="fixed"></div>
  <div class="flex-item"></div>
</div>

การสาธิต jsFiddle

โปรดทราบว่ากล่องแบบยืดหยุ่นไม่สามารถใช้กับเบราว์เซอร์รุ่นเก่าได้ แต่เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการกำหนดเป้าหมายเบราว์เซอร์รุ่นใหม่ (ดูCaniuseและMDN ) มีคู่มือที่ดีเกี่ยวกับวิธีการใช้กล่องเฟล็กซ์ที่มีอยู่ในเคล็ดลับ CSS


5
ใช้เวลาทั้งวันเพื่อหาวิธีแก้ปัญหาและคำตอบนี้แก้ไขได้! ฉันมีแผงควบคุม 4 แผงพร้อมกับแผง 3 และ 4 บางครั้งก็ไม่มีอะไรในนั้น พวกเขาทั้งหมดอาศัยอยู่ในกองที่มีพรมแดนล้อมรอบพวกเขา ทั้งโฟลต: ทิ้งไว้ในสถานการณ์ div ครั้งแรกทำให้ฉันกับ div ผ่านขอบด้านล่างเพราะฉลากที่สร้างขึ้นเป็นแบบไดนามิก เลเบลนั้นครอบคลุมเพราะนั่นคือวิธีที่ ASP แสดงผล ไม่มีการลอย: ซ้ายทำเพียง 3 ของ divs ในแถวเดียวกัน และการใช้โต๊ะก็ไม่เป็นปัญหา ขอบคุณ!
Luminous

มีวิธีที่เข้ากันได้แบบย้อนหลังในการใช้บางสิ่งเช่นนี้หรือไม่เช่นสำหรับเราแล้วผู้ที่ยังต้องรองรับ IE 8-10
Ben A. Hilleli

@ BenA.Hilleli ที่อาจขึ้นอยู่กับความต้องการของคุณ (เช่น การเพิ่มประสิทธิภาพของความก้าวหน้าหรือการย่อยสลายสง่างาม ) แต่ผลการค้นหาอย่างรวดเร็วนี้ (บิตออกลงวันที่) "วิธีการใช้ flexbox ในโลกแห่งความจริง" คำแนะนำตลอดจนFlexie.jsซึ่ง รองรับ IE6-9 หรือลองใช้คำตอบอื่น ๆ สำหรับคำถามนี้เนื่องจากพวกเขาบรรลุสิ่งเดียวกัน
filoxo

20

ฉันไม่รู้อะไรมากเกี่ยวกับกลยุทธ์การออกแบบ HTML และ CSS แต่ถ้าคุณกำลังมองหาอะไรที่ง่ายและมันจะพอดีกับหน้าจอโดยอัตโนมัติ (อย่างที่ฉันเป็น) ฉันเชื่อว่าวิธีแก้ปัญหาที่ตรงไปตรงมาที่สุดคือการทำให้ div ทำงานเป็นคำ ย่อหน้า. ลองระบุdisplay: inline-block

<div style="display: inline-block">
   Content in column A
</div>
<div style="display: inline-block">
   Content in column B
</div>

คุณอาจจะหรืออาจไม่จำเป็นต้องระบุความกว้างของ DIV


5
อาจdisplay:flexเป็นทางออกที่ดีที่สุด แต่ฉันคิดว่าinline-blockมันยอดเยี่ยมเพราะใช้งานได้กับเบราว์เซอร์มากขึ้น โดยวิธีการที่คุณอาจต้องตัดทั้ง divs ด้วย<div style="white-space:nowrap">เพื่อป้องกันไม่ให้เลิกปรับขนาด
John Henckel

นี่เป็นทางออกที่ดีสำหรับการสร้างเทมเพลต ปัญหาเดียวคือมันผลักดัน div ที่มีเนื้อหาน้อยลงไปที่ด้านล่าง วิธีการผลักไปด้านบน?
ผู้เริ่มต้นเกือบ

1
nvm ต้องการเพียงเพื่อค้นหาวิธีแก้ปัญหาคือ: จัดแนวตั้ง: บนสุด;
ผู้เริ่มต้นเกือบ

@JohnHenckel ซึ่งหมายความว่าไม่ใช่สำหรับเบราว์เซอร์ทั้งหมดมันไม่สามารถทำงานกับเบราว์เซอร์ทั้งหมดในลักษณะเดียวกันได้หรือไม่ inline-blockรหัส.
Kavindu Gayantha

@guillermo มันทำงานได้ไม่ดี กองกำลังทั้งหมดไม่ได้วางเคียงข้างกัน ทำไมเป็นอย่างนั้น มันไม่กระจ่างชัดเจน.
Kavindu Gayantha

14

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

div.container {
    display: grid;
    grid-template-columns: 220px 20px auto;
    grid-template-rows: auto;
}

div.left {
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: row1-start
    grid-row-end: 3;
    background-color: Aqua;
}

div.right {
    grid-column-start: 3;
    grid-column-end: 4;
    grid-row-start: 1;
    grid-row-end; 1;
    background-color: Silver;
}

div.below {
    grid-column-start: 1;
    grid-column-end: 4;
    grid-row-start: 2;
    grid-row-end; 2;
}
<div class="container">
    <div class="left">Left</div>
    <div class="right">Right</div>
    <div class="below">Below</div>
</div>

หรือวิธีการแบบดั้งเดิมมากขึ้นโดยใช้ลอยและระยะขอบ

ฉันได้รวมสีพื้นหลังไว้ในตัวอย่างนี้เพื่อช่วยแสดงว่าสิ่งต่าง ๆ อยู่ที่ใดและจะทำอย่างไรกับเนื้อหาด้านล่างพื้นที่ลอย

อย่าใส่สไตล์ของคุณแบบอินไลน์ในชีวิตจริงแยกออกเป็นสไตล์ชีท

div.left {
    width: 200px;
    float: left;
    background-color: Aqua;
}

div.right {
    margin-left: 220px;
    background-color: Silver;
}

div.clear {
    clear: both;
}
    <div class="left"> Left </div>
    <div class="right"> Right </div>
    <div class="clear">Below</div>

<div style="width: 200px; float: left; background-color: Aqua;"> Left </div>
<div style="margin-left: 220px; background-color: Silver;"> Right </div>
<div style="clear: both;">Below</div>

2

ให้ div แรกลอยไปทางซ้ายแล้วจับจ้องกับ div ที่สองที่กว้าง 100% ทุ่นลอยซ้าย นั่นควรทำเคล็ดลับ หากคุณต้องการวางรายการด้านล่างคุณต้องมีความชัดเจนทั้งในรายการที่คุณต้องการวางด้านล่าง


2
<div class="container" style="width: 100%;">
    <div class="sidebar" style="width: 200px; float: left;">
        Sidebar
    </div>
    <div class="content" style="margin-left: 202px;">
        content 
    </div>
</div>

นี้จะเข้ากันได้ข้ามเบราว์เซอร์ หากไม่มีการเว้นระยะขอบคุณจะพบปัญหาเกี่ยวกับเนื้อหาที่วิ่งไปทางซ้ายหากเนื้อหาของคุณยาวกว่าแถบด้านข้างของคุณ


1

หากคุณไม่ได้ติดแท็ก IE6 ให้ลอยที่สอง<div>และให้ระยะห่างเท่ากับ (หรืออาจใหญ่กว่า) เล็กน้อยก่อน<div>ความกว้างคงที่ของเล็กน้อย

HTML:

<div id="main-wrapper">
    <div id="fixed-width"> lorem ipsum </div>
    <div id="rest-of-space"> dolor sit amet </div>
</div>

CSS:

#main-wrapper {
    100%;
    background:red;
}
#fixed-width {
    width:100px;
    float:left
}
#rest-of-space {
    margin-left:101px;
        /* May have to increase depending on borders and margin of the fixd width div*/
    background:blue;
}

ระยะขอบบัญชีสำหรับความเป็นไปได้ที่ 'พื้นที่พักผ่อน' <div>อาจมีเนื้อหามากกว่า 'ความกว้างคงที่'<div>'ความกว้างคงที่'

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

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