CSS สอง divs ติดกัน


230

ฉันต้องการที่จะให้ทั้งสอง<div>อยู่ติดกัน ด้านขวา<div>ประมาณ 200px; และด้านซ้าย<div>จะต้องเติมส่วนที่เหลือของความกว้างของหน้าจอ? ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


421

คุณสามารถใช้flexboxเพื่อจัดวางรายการของคุณ:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

นี่เป็นเพียงการขูดพื้นผิวของเฟล็กบ็อกซ์ Flexbox สามารถทำสิ่งมหัศจรรย์ได้


สำหรับการสนับสนุนเบราว์เซอร์รุ่นเก่าคุณสามารถใช้ CSS floatและคุณสมบัติความกว้างเพื่อแก้ไข

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>


14
นี่เป็นคำตอบที่ถูกต้องโดยสังเขปและไม่เหมือนสองข้อที่อยู่เหนือคำตอบนั้นเป็นแบบสมบูรณ์ในตัวเอง คำตอบที่ดีที่สุดสำหรับ SO ควรเป็นเช่นนี้ IMO +1
Bobby Jack

สนใจที่จะอธิบายอย่างละเอียดว่าทำไมต้องเป็นซ้ายfloat:left? ความคิดเห็นของคุณต่อคำตอบของฉันบอกว่า 'จำเป็นต้องใช้ div ซ้ายเพื่อขยายพื้นที่ด้านซ้ายทั้งหมด' แต่float:leftจะทำให้เนื้อหาแน่นหนา
falstro

14
คำตอบนี้ไม่ถูกต้องทั้งหมดและค่อนข้างจะโกรธที่เห็นว่ามีผู้โหวตมาก สิ่งนี้สร้างเลย์เอาต์ที่ไม่เสถียรมาก ฉันขอแนะนำให้วาง div สองตัวในคอนเทนเนอร์และใช้คุณสมบัติ display: inline-block เพื่อให้ divs จัดเรียงตามคำตอบอื่น ๆ ที่แนะนำ ฉันไม่ได้วิพากษ์วิจารณ์ใครเลยเพราะเราทุกคนอยู่ที่นี่เพื่อช่วยเหลือซึ่งกันและกันนอกเหนือจากการหยิบของฉันขอบคุณ MN สำหรับการมีส่วนร่วมในชุมชน
Mussser

1
แต่สิ่งหนึ่งที่ควรทราบก็คืออินไลน์บล็อกที่จะไม่ทำงานในรุ่นเก่าของ IE ...
Mussser

3
@ Mussser ฉันเห็นด้วยกับความคิดเห็นของคุณ แต่โปรดจำไว้ว่าคำตอบนี้มาจาก 2009 ... เวลาที่สิ่งที่คุณเรียกว่า "Ie รุ่นเก่า" (เช่น: IE8 และใต้) เป็นรุ่น "ปัจจุบัน" ของ IE ...
Laurent เอส.

139

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

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

โปรดทราบว่าการใช้แอททริบิวต์สไตล์แบบอินไลน์ใช้เพื่อรวบรัดตัวอย่างเท่านั้นซึ่งแน่นอนว่าสิ่งเหล่านี้ถูกย้ายไปใช้ไฟล์ CSS ภายนอก


1
นี่คือทางออกสำหรับฉัน ฉันต้องการสอง divs ที่อยู่ติดกันเช่น [] [] (คนมันผ่านมาระยะหนึ่งแล้วตั้งแต่ฉันทำแบบนี้ .. ) =) ความรุ่งโรจน์
Partack

อันนี้ใช้ได้สำหรับฉันเช่นกัน ฉันมีปัญหาบางอย่างกับ float อื่น: right'd div กดคอลัมน์ขวาของฉัน div ลงด้านล่างหนึ่งซ้ายดังนั้นฉันจึงทำให้การแสดงการใช้คอนเทนเนอร์: inline-block และนั่น 'แก้ไขมัน
Martin Carney

5
สิ่งนี้ไม่ทำงานเมื่อเนื้อหามีขนาดใหญ่ใน Content1 DIV ผลลัพธ์คือ DIV อยู่บนสองบรรทัดแยกกันแทนแบบเคียงข้างกัน
Richard Hollis

@RichardHollis ฉันสามารถตั้งค่าwidthทรัพย์สินของ div ทั้งหมดของฉันที่อยู่ถัดจากกันเพื่อป้องกันการพันที่สองไปยังบรรทัดใหม่
Trindaz

1
เพิ่ม css vertical-align: top; ทั้งสองอย่างมิฉะนั้นพวกเขาจะดันซึ่งกันและกันถ้าความยาวของเนื้อหาต่างกัน
prospector

27

น่าเสียดายที่นี่ไม่ใช่สิ่งที่น่ารำคาญสำหรับการแก้ปัญหาทั่วไป สิ่งที่ง่ายที่สุดคือการเพิ่มคุณสมบัติ CSS "ลอย: ใช่" ถึง 200px div ของคุณสิ่งนี้จะทำให้ "main" ของคุณ - ความกว้างเต็มและข้อความใด ๆ ในนั้นจะลอยไปรอบ ๆ ขอบของ 200px-div ซึ่งมักจะดูแปลก ๆ ขึ้นอยู่กับเนื้อหา (ค่อนข้างมาก ในทุกกรณียกเว้นถ้าเป็นภาพลอย)

แก้ไข: ตามคำแนะนำของ Dom ปัญหาการห่อแน่นอนสามารถแก้ไขได้ด้วยระยะขอบ ฉันโง่


1
'float: left' จะเหมาะสมกว่าส่วน lft div ต้องครอบคลุมพื้นที่ด้านซ้ายทั้งหมด ไม่มีความผิดใด ๆ ให้พิจารณา
MN

19

วิธีที่แนะนำโดย @roe และ @MohitNanda ทำงาน แต่ถ้า div ที่ถูกตั้งค่าเป็นfloat:right;มันต้องมาก่อนใน HTML source สิ่งนี้จะทำลายลำดับการอ่านจากซ้ายไปขวาซึ่งอาจสร้างความสับสนหากหน้านั้นถูกแสดงโดยปิดสไตล์ หากเป็นกรณีนี้อาจเป็นการดีกว่าถ้าใช้ div wrapper และการกำหนดตำแหน่งแบบสัมบูรณ์:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

แสดงให้เห็นถึง:

ซ้ายขวา

แก้ไข:อืมน่าสนใจ หน้าต่างแสดงตัวอย่างแสดง div ที่จัดรูปแบบอย่างถูกต้อง แต่รายการโพสต์ที่แสดงผลไม่ได้ ขออภัยคุณต้องลองด้วยตัวเอง


15

ฉันพบปัญหานี้ในวันนี้ จากการแก้ปัญหาข้างต้นสิ่งนี้ได้ผลกับฉัน:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

เพียงแค่ทำให้ div div ขยายความกว้างเต็มและลอย divs ที่อยู่ภายใน


8

UPDATE

หากคุณจำเป็นต้ององค์ประกอบสถานที่ในแถวที่คุณสามารถใช้Flex เค้าโครง ที่นี่คุณมีอีกFlex กวดวิชา มันเป็นเครื่องมือ CSS ที่ยอดเยี่ยมและถึงแม้ว่ามันจะไม่เข้ากัน 100% ในแต่ละวันการสนับสนุนก็ดีขึ้น งานนี้ง่ายเหมือน:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

และสิ่งที่คุณได้มาที่นี่คือตู้เก็บของที่มีขนาดรวม 4 ยูนิตซึ่งแบ่งพื้นที่กับเด็ก ๆ ในความสัมพันธ์ 1/4 และ 3/4

ฉันได้ทำตัวอย่างใน CodePen เพื่อแก้ปัญหาของคุณแล้ว ฉันหวังว่ามันจะช่วย

http://codepen.io/timbergus/pen/aOoQLR?editors=110

เก่ามาก

บางทีนี่อาจเป็นแค่เรื่องไร้สาระ แต่คุณลองกับโต๊ะบ้างไหม? มันไม่ได้ใช้ CSS โดยตรงสำหรับการวางตำแหน่ง divs แต่ใช้งานได้ดี

คุณสามารถสร้างตาราง 1x2 และวางไว้divsข้างในแล้วจัดรูปแบบตารางด้วย CSS เพื่อวางตามที่คุณต้องการ:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

บันทึก

หากคุณต้องการที่จะหลีกเลี่ยงการใช้ตารางเช่นกล่าวว่าก่อนที่คุณสามารถใช้float: left;และfloat: right;และองค์ประกอบต่อไปนี้ไม่ลืมที่จะเพิ่มclear: left;, clear: right;หรือclear: both;เพื่อให้ได้ตำแหน่งที่ทำความสะอาด


ตารางเป็นโซลูชันที่คาดการณ์ได้มากขึ้นกว่า "โฟลต" ที่เปลี่ยนแปลงตลอดเวลาซึ่งดูเหมือนจะเลอะเทอะเมื่อคุณเพิ่มหรือลบองค์ประกอบ
Kokodoko

นี่เป็นทางออกที่ดีถ้าคุณกำลังทำงานกับอีเมล
Zac Clancy

6
div1 {
    float: right;
} 
div2 {
    float: left;
}

สิ่งนี้จะทำงานได้ตราบใดที่คุณตั้งค่าclear: bothสำหรับองค์ประกอบที่แยกบล็อกคอลัมน์ทั้งสองนี้


3
เมื่อใช้ลอยคุณต้องตั้งค่าคุณสมบัติความกว้าง ดังนั้นผมจึงไม่คิดว่านี่เป็นทางออกที่ดี ..
Martijn

4

ฉันพบปัญหาเดียวกันและรุ่น Mohits ใช้งานได้ หากคุณต้องการรักษาลำดับซ้ายขวาของคุณใน html เพียงลองนี้ ในกรณีของฉัน div ซ้ายกำลังปรับขนาด div ขวาจะอยู่ที่ความกว้าง 260px

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

เคล็ดลับคือการใช้ช่องว่างภายในที่ถูกต้องบนกล่องหลัก แต่ใช้พื้นที่นั้นอีกครั้งโดยการวางกล่องด้านขวาอีกครั้งด้วยระยะขอบขวา


ฉันไม่ทำงานโดยไม่ลอย: ใช่แล้วใช่
Jussi Palo

3

ฉันใช้ส่วนผสมของโฟลตและโอเวอร์โฟลว์ -x: ซ่อนเร้น รหัสขั้นต่ำใช้งานได้เสมอ

https://jsfiddle.net/9934sc4d/4/ - บวกคุณไม่จำเป็นต้องล้างทุ่นของคุณ!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}

1
มีประโยชน์เมื่อคุณทราบความสูงของ div และคุณรู้ว่าเนื้อหานั้นไม่ได้อยู่ในระดับความสูงนี้อีกต่อไป อย่างไรก็ตามเมื่อมีเนื้อหามากกว่าความสูงของ div มันจะถูกซ่อนเนื่องจากการล้น ...
Martijn

1
ที่ดีกว่าแน่นอน :)
Martijn

1
ดี! ดีที่ได้เห็นผู้คนกำลังให้การสนับสนุนด้วยการตอบรับที่เป็นประโยชน์และเป็นบวกมากกว่าการตอบรับเชิงลบที่ไม่สร้างสรรค์ Good man @Martijn
Tony Ray Tansley

ขอบคุณสำหรับสิ่งนี้. ฉันทำงาน UI ส่วนใหญ่ของฉันใน React Native และ flex box นั้นทำงานได้ดีกว่า HTML + CSS (ในความคิดของฉัน) นี่ทำให้ชีวิตฉันง่ายขึ้นมาก
Eric Wiener

2

ตามที่ทุกคนได้ชี้ให้เห็นคุณจะทำสิ่งนี้โดยตั้งค่าfloat:right;เนื้อหา RHS และระยะขอบติดลบบน LHS

อย่างไรก็ตาม .. ถ้าคุณไม่ใช้ a float: left;บน LHS (อย่างที่ Mohit ทำ) คุณจะได้รับเอฟเฟกต์ที่ก้าวกระโดดเพราะ LHS div ยังคงใช้พื้นที่ส่วนขอบในการจัดวาง

อย่างไรก็ตาม .. LHS float จะหดห่อเนื้อหาดังนั้นคุณจะต้องแทรก childnode ความกว้างที่กำหนดไว้หากไม่ยอมรับซึ่งในจุดนี้คุณอาจกำหนดความกว้างของพาเรนต์

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

อย่างไรก็ตาม .. ปัญหานี้สามารถแก้ไขได้ด้วยการลอยตัวเนื่องจากมีมาร์กอัพเพิ่มเติม

(ข้อแม้: ฉันไม่เห็นด้วยกับการ. div div ในตัวอย่างนั้นดูรายละเอียดที่นี่ )

ทุกสิ่งพิจารณาแล้วฉันคิดว่าพวกเราส่วนใหญ่ต้องการมีความกว้างแบบไม่โลภเหลืออยู่ใน CSS3 ...


2

นี่ไม่ใช่คำตอบสำหรับทุกคนเนื่องจากไม่รองรับใน IE7- แต่คุณสามารถใช้แล้วใช้คำตอบอื่นสำหรับ IE7- มันคือ display: table, display: table-row และ display: table-cell โปรดทราบว่านี่ไม่ได้ใช้ตารางสำหรับการจัดวาง แต่จัดแต่ง divs เพื่อให้ทุกอย่างเข้ากันได้ดีโดยไม่ต้องยุ่งยากจากด้านบน Mine เป็นแอป html5 ดังนั้นจึงใช้งานได้ดี

บทความนี้แสดงตัวอย่าง: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

สไตล์ชีทของคุณจะมีลักษณะดังนี้:

 .container {
    display: table;
    width:100%;
 }

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }

-1

ในการถอดความเว็บไซต์ใดเว็บไซต์หนึ่งของฉันที่ทำสิ่งที่คล้ายกัน:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>

4
ไม่ใช่ฉัน แต่ฉันเดาว่าแฮ็ก CSS, ประเภทของการเปลี่ยนผ่านหรือการขาดคำอธิบาย?
annakata

อย่างน้อยมันก็มี doctype :) ฉันเดาว่ามันอาจจะเป็นคนที่ไม่ชอบเบราว์เซอร์ที่แฮ็คสำหรับระยะขอบบน IE อย่างน้อยผมทดสอบมัน ...
Rowland ชอว์

มันแฮ็คเกินไป มีวิธีแก้ปัญหามากมายที่กระชับกว่านี้
John Bell

@ JohnBell อาจเป็นปัญหาเกี่ยวกับเวลา - มันเป็นคำตอบที่สมเหตุสมผลในเวลานั้น (มากกว่า 8 ปีที่แล้ว) แต่เทคโนโลยีของเบราว์เซอร์ได้เปลี่ยนไปเรื่อย ๆ คำตอบอื่น ๆ ที่แปลกประหลาดร่วมสมัยกับฉันซึ่งเสนอแนวคิดเดียวกันได้คะแนนที่ดีกว่า (เช่นของ David สองนาทีหลังจากของฉัน)
Rowland Shaw

-7

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

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