วิธีที่จะทำให้ div เติมพื้นที่แนวนอนที่เหลืออยู่?


419

ฉันมี 2 divs:อยู่ทางซ้ายและอีกอันอยู่ทางขวาของหน้า ด้านซ้ายมีความกว้างคงที่และฉันต้องการด้านขวาเพื่อเติมพื้นที่ที่เหลือ

#search {
  width: 160px;
  height: 25px;
  float: left;
  background-color: #ffffff;
}

#navigation {
  width: 780px;
  float: left;
  background-color: #A53030;
}
<div id="search">Text</div>
<div id="navigation">Navigation</div>


11
ลบคุณสมบัติ width และ float บน #navigation และจะใช้งานได้
Johan Leino


1
@alexchenco: คุณอาจต้องการอัปเดตคำตอบที่คุณเลือกจากคำตอบที่ได้รับจาก Hank
Adrien เป็น

@AdrienBe จริง ๆ แล้วถ้าคุณดูคำตอบของ mystrdat ฉันคิดว่าอันนั้นดีกว่า มันเป็น css เพียงบรรทัดเดียวและมันเป็นอันเดียวที่เหมาะกับฉัน (ฉันกำลังสร้างคอลัมน์สามคอลัมน์ด้วย float: left, ในสองรายการแรกที่มีความกว้างคงที่และล้น: รถยนต์ในรุ่นสุดท้ายและทำงานได้ดี)
edwardtyl

@ edwardtyl ยุติธรรมพอ ที่จริงมันดูเหมือนว่าจะใช้เทคนิคที่คล้ายกันเป็นฉันคำตอบให้สำหรับstackoverflow.com/questions/4873832/...
Adrien เป็น

คำตอบ:


71

ดูเหมือนว่าจะบรรลุสิ่งที่คุณต้องการ

#left {
  float:left;
  width:180px;
  background-color:#ff0000;
}
#right {
  width: 100%;
  background-color:#00FF00;
}
<div>
  <div id="left">
    left
  </div>
  <div id="right">
    right
  </div>
</div>


8
คุณต้องลบความกว้าง: 100% ใน div ที่ถูกต้องแม้ว่ามันจะทำงานได้
Johan Leino

250
การแก้ปัญหานี้มีปัญหาจริง ลองลบสีออกจากองค์ประกอบ LEFT คุณจะสังเกตเห็นสีจากองค์ประกอบ RIGHT ซ่อนอยู่ภายใต้องค์ประกอบนั้น ดูเหมือนว่าเนื้อหาจะถูกที่แล้ว แต่ตัว RIGHT นั้นไม่ใช่
Vyrotek

5
+1 แก้ไขปัญหาของฉันด้วย สิ่งที่ฉันเรียนรู้คือฉันต้องลบ "float: left" ใน div ที่เติม ฉันคิดว่ามันจะทำให้หน้า
implode

12
อาจสังเกตได้ดีว่าคำพูดของ Vyroteks เป็นจริง แต่สามารถแก้ไขได้ด้วยการล้น: ซ่อนอยู่ในคอลัมน์ด้านขวา Denzel พูดถึงเรื่องนี้ แต่เขาไม่ใช่คำตอบที่ยอมรับดังนั้นคุณอาจพลาดได้ ...
Ruudt

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

268

ปัญหาที่ฉันพบกับคำตอบของ Boushley ก็คือถ้าคอลัมน์ด้านขวายาวกว่าด้านซ้ายมันก็จะพันรอบด้านซ้ายและกลับมาเติมเต็มพื้นที่ทั้งหมด นี่ไม่ใช่พฤติกรรมที่ฉันกำลังมองหา หลังจากค้นหา 'โซลูชัน' มากมายฉันพบบทช่วยสอน (ตอนนี้ลิงก์เสียชีวิต) ในการสร้างหน้าคอลัมน์สามหน้า

ข้อเสนอของผู้เขียนมีสามวิธีที่แตกต่างกันคือหนึ่งความกว้างคงที่หนึ่งคอลัมน์สามคอลัมน์และอีกหนึ่งคอลัมน์มีคอลัมน์ด้านนอกคงที่และความกว้างตัวแปรกลาง สง่างามและมีประสิทธิภาพมากกว่าตัวอย่างอื่น ๆ ที่ฉันพบ ปรับปรุงความเข้าใจเค้าโครง CSS อย่างมีนัยสำคัญ

โดยพื้นฐานแล้วในกรณีง่าย ๆ ด้านบนให้ลอยคอลัมน์แรกไปทางซ้ายและให้ความกว้างคงที่ จากนั้นให้ระยะขอบซ้ายทางขวาที่กว้างกว่าคอลัมน์แรกเล็กน้อย แค่นั้นแหละ. เสร็จสิ้น รหัสของ Ala Boushley:

นี่คือตัวอย่างในStack Snippets & jsFiddle

#left {
  float: left;
  width: 180px;
}

#right {
  margin-left: 180px;
}

/* just to highlight divs for example*/
#left { background-color: pink; }
#right { background-color: lightgreen;}
<div id="left">  left  </div>
<div id="right"> right </div>

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


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

ควรเป็น: margin-left: 190px; คุณลืม ';'. นอกจากนี้ระยะขอบซ้ายควรเป็น 180px
fuddin

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

2
@RoniTovi องค์ประกอบแบบลอยควรมาก่อนส่วนที่ไม่ใช่แบบลอยใน html ของคุณ jsfiddle.net/CSbbM/127
แฮงค์

6
ดังนั้นคุณจะทำอย่างไรถ้าคุณต้องการหลีกเลี่ยงความกว้างคงที่? กล่าวอีกนัยหนึ่งอนุญาตให้คอลัมน์ด้านซ้ายกว้างเท่าที่จำเป็นและคอลัมน์ด้านขวาใช้เวลาที่เหลือหรือไม่
Patrick Szalapski

126

การแก้ปัญหามาจากคุณสมบัติการแสดงผล

โดยทั่วไปคุณต้องทำให้ div ทั้งสองทำหน้าที่เหมือนเซลล์ตาราง ดังนั้นแทนที่จะใช้float:leftคุณจะต้องใช้display:table-cellทั้ง div และสำหรับ div ความกว้างแบบไดนามิกที่คุณต้องตั้งค่าwidth:auto;ด้วย ควรวาง div ทั้งสองลงในคอนเทนเนอร์ความกว้าง 100% พร้อมdisplay:tableคุณสมบัติ

นี่คือ CSS:

.container {display:table;width:100%}
#search {
  width: 160px;
  height: 25px;
  display:table-cell;
  background-color: #FFF;
}
#navigation {
  width: auto;
  display:table-cell;
  /*background-color: url('../images/transparent.png') ;*/
  background-color: #A53030;
}

*html #navigation {float:left;}

และ HTML:

<div class="container">
   <div id="search"></div>
   <div id="navigation"></div>
</div>

สำคัญ: สำหรับ Internet Explorer คุณจะต้องระบุคุณสมบัติลอยบน div ความกว้างแบบไดนามิกมิฉะนั้นพื้นที่จะไม่เต็ม

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


3
ไม่ทำงานเมื่อเนื้อหาภายใน div มีความกว้าง: auto มีขนาดใหญ่กว่าพื้นที่ว่างที่เหลือในวิวพอร์ต
Nathan Loyer

4
@einord โซลูชันนี้ไม่ได้ใช้ตารางและฉันทราบว่าควรใช้ตารางสำหรับข้อมูลแบบตารางเท่านั้น ดังนั้นอยู่นอกบริบทที่นี่ ตารางและการแสดงผลที่เกิดขึ้นจริง: คุณสมบัติตาราง (+ รูปแบบอื่น) เป็นสิ่งที่แตกต่างอย่างสิ้นเชิง
Mihai Frentiu

1
@Mihai Frentiu แสดงผลในลักษณะใด: ตารางแตกต่างจากองค์ประกอบตารางจริง ฉันอยากจะเรียนรู้สิ่งนี้จริงๆถ้าพวกเขาต่างกันอย่างสิ้นเชิงขอบคุณ =)
einord

2
@einord โดยใช้ตาราง HTML แสดงถึงความหมายของโครงสร้างตารางทั้งหมดในโค้ด HTML โมเดลตาราง CSS อนุญาตให้คุณสร้างเกือบทุกอิลิเมนต์ที่ทำงานเหมือนองค์ประกอบตารางโดยไม่ต้องกำหนดแผนผังตารางทั้งหมด
Mihai Frentiu

1
@ Mihai Frentiu ขอบคุณสำหรับคำตอบ แต่พฤติกรรมขององค์ประกอบตารางครึ่งหนึ่งของปัญหากับการใช้ตารางเป็นองค์ประกอบการออกแบบไม่ใช่หรือ
einord

123

วันนี้คุณควรใช้flexboxวิธีนี้ (อาจปรับใช้กับเบราว์เซอร์ทั้งหมดที่มีคำนำหน้าเบราว์เซอร์)

.container {
    display: flex;
}

.left {
    width: 180px;
}

.right {
    flex-grow: 1;
}

ข้อมูลเพิ่มเติม: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


ดู www.w3schools.com/cssref/css3_pr_flex-grow.asp สำหรับคำอธิบายที่ดีของแอตทริบิวต์ CSS ทางออกที่ทันสมัยเรียบง่าย แต่อาจไม่ทำงานในเบราว์เซอร์รุ่นเก่า
Edward

4
Flexbox FTW ... ฉันได้ลองใช้วิธีแก้ไขปัญหาอื่น ๆ ในชุดข้อความนี้แล้วไม่มีอะไรทำงานเลยฉันลองใช้วิธีแก้ปัญหา flexbox นี้ใช้ได้ทันที ... CSS คลาสสิก (นั่นคือก่อนการมาถึงของ flexbox และ css grid) ... งอและกริดกฏ :-)
leo

ควรได้รับการยอมรับว่าเป็นโซลูชันที่เลือกสำหรับเวลาปัจจุบัน นอกจากนี้ยังเป็นโซลูชัน "ที่ไม่แฮ็ก" เพียงอย่างเดียว
เกร็ก

งานนี้เหมือนมีเสน่ห์ช่วยประหยัดวันของฉัน!
lisnb

tsbaa (นี่ควรเป็นคำตอบที่ยอมรับได้)
Ryo

104

เนื่องจากนี่เป็นคำถามที่ได้รับความนิยมฉันจึงอยากแบ่งปันโซลูชันที่ดีโดยใช้ BFC
ตัวอย่าง Codepen ต่อไปนี้ที่นี่

.left {
  float: left;
  width: 100px;
}
.right {
  overflow: auto;
}

ในกรณีนี้overflow: autoทริกเกอร์พฤติกรรมบริบทและทำให้องค์ประกอบด้านขวาขยายเฉพาะความกว้างที่เหลืออยู่ที่มีอยู่และมันจะขยายเป็นความกว้างเต็มตามธรรมชาติหาก.leftหายไป เคล็ดลับที่มีประโยชน์และสะอาดสำหรับเลย์เอาต์ UI จำนวนมาก แต่อาจเข้าใจได้ยากว่า "ทำไมจึงใช้งานได้" ในตอนแรก


1
รองรับเบราว์เซอร์สำหรับการโอเวอร์โฟลว์ IE4 !!! w3schools.com/cssref/pr_pos_overflow.asp
Yevgeniy Afanasyev

1
บางครั้งฉันก็ลงเอยด้วยแถบเลื่อนแนวนอนที่ไม่มีประโยชน์ในองค์ประกอบ. right มีปัญหาอะไร?
แพทริค Szalapski

1
@PatrickSzalapski คุณสร้าง codepen หรือสิ่งที่คล้ายกันได้หรือไม่? ล้นautoอาจเรียกสิ่งนั้นขึ้นอยู่กับเนื้อหา นอกจากนี้คุณยังสามารถใช้ค่าโอเวอร์โฟลว์อื่น ๆ เพื่อให้ได้เอฟเฟกต์เดียวกันhiddenอาจใช้งานได้ดีขึ้น
mystrdat

1
BFC หมายถึงอะไรและมีบทแนะนำทั่วไปที่อธิบาย BFC ทางเว็บหรือไม่
lulalala

1
@lulalala มันย่อมาจากบล็อกบริบทการจัดรูปแบบ นี่คือคำอธิบายที่
bobo

23

หากคุณไม่ต้องการความเข้ากันได้กับเบราว์เซอร์บางรุ่น (เช่น IE 10 8 หรือน้อยกว่า) คุณสามารถใช้calc()ฟังก์ชั่น CSS:

#left {
   float:left;
   width:180px;
   background-color:#ff0000;
}

#right {
   float: left;
   width: calc(100% - 180px);
   background-color:#00FF00;
}

1
IE 9 ขึ้นไปสนับสนุนคุณสมบัติการคำนวณ ปัญหาเดียวของวิธีนี้คือเราไม่รู้ว่าความกว้างของคอลัมน์ด้านซ้ายจะเปลี่ยนแปลงหรือไม่
Arashsoft

ทีนี้วิธีแก้ปัญหานี้อาจเน้นไปที่เคสที่ยืดหยุ่นและสมมติว่าคุณไม่รู้หรือไม่สนใจความกว้างของคอนเทนเนอร์พาเรนต์ ในคำถาม @alexchenco กล่าวว่าเขาต้องการเติม "พื้นที่ที่เหลือ" ดังนั้น ... ฉันคิดว่าถูกต้อง :) และใช่ IE 9 ได้รับการสนับสนุนขอบคุณสำหรับการบันทึก;)
Marcos B.

15

@ คำตอบของ Boushley นั้นใกล้เคียงที่สุด แต่มีปัญหาหนึ่งที่ไม่ได้รับการแก้ไขที่ได้รับการชี้ให้เห็น ขวา div เตะกว้างทั้งหมดของเบราว์เซอร์; เนื้อหาใช้ความกว้างที่คาดหวัง หากต้องการดูปัญหานี้ให้ดีขึ้น:

<html>
<head>
    <style type="text/css">
    * { margin: 0; padding: 0; }
    body {
        height: 100%;
    }
    #left {
        opacity: 0;
        height: inherit;
        float: left;
        width: 180px;
        background: green;
    }
    #right {
        height: inherit;
        background: orange;
    }
    table {
            width: 100%;
            background: red;
    }
    </style>
</head>
<body>
    <div id="left">
        <p>Left</p>
    </div>
    <div id="right">
        <table><tr><td>Hello, World!</td></tr></table>
    </div>
</body>
</html>

http://jsfiddle.net/79hpS/

เนื้อหาอยู่ในตำแหน่งที่ถูกต้อง (ใน Firefox) อย่างไรก็ตามความกว้างไม่ถูกต้อง เมื่อองค์ประกอบลูกเริ่มสืบทอดความกว้าง (เช่นตารางด้วยwidth: 100%) พวกเขาจะได้รับความกว้างเท่ากับของเบราว์เซอร์ทำให้พวกเขาล้นออกทางขวาของหน้าและสร้างแถบเลื่อนแนวนอน (ใน Firefox) หรือไม่ลอยและถูกผลักลง ( ในโครเมี่ยม)

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

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

หากมีปัญหาหรือข้อสงสัยอย่าลังเลที่จะยกระดับพวกเขา


1
overflow: hiddenขอแก้ไขสิ่งนี้ขอบคุณ (คำตอบที่ทำเครื่องหมายไว้เป็นความผิด BTW เป็นrightจริงจะใช้เวลาทั้งหมดพื้นที่ที่มีอยู่บนแม่คุณสามารถดูนี้ในเบราว์เซอร์ทั้งหมดเมื่อตรวจสอบองค์ประกอบ)
huysentruitw

1
มีใครอธิบายได้บ้างไหมว่าทำไมสิ่งนี้ถึงได้ผล ฉันรู้ว่าฉันเห็นคำอธิบายที่ดีที่ไหนสักแห่งที่นี่ แต่ฉันหามันไม่เจอ
tomswift

2
@tomswift Setting overflow: hiddenทำให้คอลัมน์ด้านขวาในบริบทการจัดรูปแบบบล็อกของตนเอง องค์ประกอบบล็อกใช้พื้นที่แนวนอนทั้งหมดที่มีให้ ดู: developer.mozilla.org/en-US/docs/Web/Guide/CSS//
John Kurlak

overflow:xxxแอตทริบิวต์เป็นกุญแจสำคัญ ในขณะที่คุณพูดมันหยุดจากการขยายใต้#right #leftมันแก้ปัญหาที่ฉันใช้ jQuery UI ปรับขนาดได้อย่างเรียบร้อยมาก - ด้วย#rightชุดที่มีคุณสมบัติโอเวอร์โฟลว์และ#leftตั้งค่าให้ปรับขนาดได้คุณมีขอบเขตที่สามารถเคลื่อนย้ายได้ง่าย ดูjsfiddle.net/kmbro/khr77h0t
kbro

13

นี่คือการแก้ไขเล็กน้อยสำหรับโซลูชันที่ยอมรับซึ่งป้องกันไม่ให้คอลัมน์ด้านขวาตกลงมาในคอลัมน์ด้านซ้าย แทนที่width: 100%;ด้วยoverflow: hidden;โซลูชันที่ยุ่งยากหากมีคนไม่รู้จัก

<html>

<head>
    <title>This is My Page's Title</title>
    <style type="text/css">
        #left {
            float: left;
            width: 180px;
            background-color: #ff0000;
        }
        #right {
            overflow: hidden;
            background-color: #00FF00;
        }
    </style>
</head>

<body>
    <div>
        <div id="left">
            left
        </div>
        <div id="right">


right
    </div>
</div>

http://jsfiddle.net/MHeqG/2600/

[แก้ไข] ตรวจสอบตัวอย่างสำหรับเค้าโครงคอลัมน์สามคอลัมน์: http://jsfiddle.net/MHeqG/3148/


1
โซลูชั่นที่สมบูรณ์แบบสำหรับแถบนำทางยืดหยุ่นพร้อมโลโก้คงที่
Trunk

5

หากคุณพยายามเติมพื้นที่ที่เหลือใน flexbox ระหว่าง 2 รายการให้เพิ่มคลาสต่อไปนี้ใน div ว่างระหว่าง 2 ที่คุณต้องการแยก:

.fill {
  // This fills the remaining space, by using flexbox. 
  flex: 1 1 auto;
}

4

ใช้ display:flex

<div style="width:500px; display:flex">
   <div style="width:150px; height:30px; background:red">fixed width</div>

   <div style="width:100%; height:30px; background:green">remaining</div>
</div>

1
คำตอบนี้ซ้ำคำตอบของ Jordan จากปี 2014
TylerH

3

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

วิธีการแสดงโดยทั่วไป "ปลอมแปลง" เมื่อมันมาถึงองค์ประกอบการขยาย - มันไม่ได้ลอยจริง ๆ มันแค่เล่นพร้อมกับองค์ประกอบลอยที่มีความกว้างคงที่โดยใช้ระยะขอบ

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

จากนั้นในการใช้โซลูชันของ Boushley ฉันต้องการเพิ่มว่าคุณควรวาง div เช่นต่อไปนี้: .fakeFloat {height: 100%; ความกว้าง: 100%; ลอย: ซ้าย; } และวางสิ่งนี้โดยตรงใน div ที่ขยาย; เนื้อหาทั้งหมดของ div ที่ขยายออกไปควรอยู่ในองค์ประกอบ fakeFloat นี้

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


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

@kbro: อย่าใช้ตารางสำหรับการจัดวางเพราะเนื้อหาและการแสดงผลควรแยกไว้ overflow: hiddenแต่ถ้าเนื้อหามีโครงสร้างเป็นตารางก็แน่นอนสามารถตัดกับ jsfiddle.net/dave2/a5jbpc85
เดฟ

3

ฉันลองใช้วิธีแก้ปัญหาข้างต้นสำหรับของเหลวที่เหลือและสิทธิ์คงที่ แต่ไม่ใช่ของที่ทำงาน (ฉันรู้ว่าคำถามนี้มีไว้เพื่อการย้อนกลับ แต่ฉันคิดว่านี่เป็นประเด็นที่เกี่ยวข้อง) นี่คือสิ่งที่ทำงาน:

.wrapper {margin-right:150px;}
.wrapper .left {float:left; width:100%; margin-right:-150px;}

.right {float:right; width:150px;}

<div class="wrapper"><div class="left"></div></div>
<div class="right"></div>

3

ฉันมีปัญหาที่คล้ายกันและฉันพบวิธีแก้ปัญหาที่นี่: https://stackoverflow.com/a/16909141/3934886

การแก้ปัญหาสำหรับ div กลางคงที่และคอลัมน์ด้านของเหลว

.center{
    background:#ddd;
    width: 500px;
    float:left;
}

.left{
    background:#999;
    width: calc(50% - 250px);
    float:left;
}

.right{
    background:#999;
    width: calc(50% - 250px);
    float:right;
}

หากคุณต้องการคอลัมน์ด้านซ้ายคงที่เพียงแค่เปลี่ยนสูตรตามนั้น


ไม่สามารถใช้ได้กับเบราว์เซอร์รุ่นเก่าบางรุ่นเช่น IE8 และบางส่วนเท่านั้นบน IE9 ( caniuse.com/#feat=calc )
landi

2

คุณสามารถใช้คุณสมบัติ Grid CSS เป็นโครงสร้างกล่องของคุณที่ชัดเจนสะอาดและใช้งานง่ายที่สุด

#container{
    display: grid;
    grid-template-columns: 100px auto;
    color:white;
}
#fixed{
  background: red;
  grid-column: 1;
}
#remaining{
  background: green;
  grid-column: 2;
}
<div id="container">
  <div id="fixed">Fixed</div>
  <div id="remaining">Remaining</div>
</div>


1

ฉันสงสัยว่าไม่มีใครใช้position: absoluteกับposition: relative

ดังนั้นทางออกอื่นจะเป็น:

HTML

<header>
  <div id="left"><input type="text"></div>
  <div id="right">Menu1 Menu2 Menu3</div>
</header>

CSS

header { position: relative;  }
#left {
    width: 160px;
    height: 25px;
}
#right {
    position: absolute;
    top: 0px;
    left: 160px;
    right: 0px;
    height: 25px;
}

ตัวอย่าง Jsfiddle


0

/ * * css * /

#search {
 position: absolute;
 width: 100px;
}
.right-wrapper {
  display: table;
  width: 100%;
  padding-left:100px;
}
.right-wrapper #navigation {
 display: table-cell;
 background-color: #A53030;
}

/ * * html * /

<div id="search"></div>
<div class="right-wrapper">
   <div id="navigation"></div>
</div>

0

ฉันมีทางออกที่ง่ายมากสำหรับเรื่องนี้! // HTML

<div>
<div id="left">
    left
</div>
<div id="right">
    right
</div>

// CSS

#left {
float:left;
width:50%;
position:relative;
background-color:red;
}
#right {
position:relative;
background-color:#00FF00;}

ลิงก์: http://jsfiddle.net/MHeqG/


0

ฉันมีปัญหาที่คล้ายกันและเกิดขึ้นกับสิ่งต่อไปนี้ซึ่งทำงานได้ดี

CSS:

.top {
width: auto;
height: 100px;
background-color: black;
border: solid 2px purple;
overflow: hidden;
}
.left {
float:left;
width:100px;
background-color:#ff0000;
padding: 10px;
border: solid 2px black;
}
.right {
width: auto;
background-color:#00FF00;
padding: 10px;
border: solid 2px orange;
overflow: hidden;
}
.content {
margin: auto;
width: 300px;
min-height: 300px;
padding: 10px;
border: dotted 2px gray;
}

HTML:

<div class=top>top </div>
<div>
    <div class="left">left </div>
    <div class="right">
        <div class="content">right </div>
    </div>
</div>

วิธีนี้จะไม่ห่อเมื่อหน้าต่างหด แต่จะขยายพื้นที่ 'เนื้อหา' โดยอัตโนมัติ มันจะทำให้ความกว้างคงที่สำหรับเมนูเว็บไซต์ (ซ้าย)

และสำหรับกล่องขยายเนื้อหาอัตโนมัติและกล่องแนวตั้งด้านซ้าย (เมนูไซต์)

https://jsfiddle.net/tidan/332a6qte/


0

ลองเพิ่มตำแหน่งrelativeลบwidthและfloatคุณสมบัติของด้านขวาจากนั้นเพิ่มleftและrightคุณสมบัติด้วย0ค่า

นอกจากนี้คุณสามารถเพิ่มmargin leftกฎโดยค่าจะขึ้นอยู่กับความกว้างขององค์ประกอบด้านซ้าย(+ บางพิกเซลหากคุณต้องการพื้นที่ในระหว่าง)เพื่อรักษาตำแหน่ง

ตัวอย่างนี้ใช้ได้สำหรับฉัน:

   #search {
        width: 160px;
        height: 25px;
        float: left;
        background-color: #FFF;
    }

    #navigation {  
        display: block;  
        position: relative;
        left: 0;
        right: 0;
        margin: 0 0 0 166px;             
        background-color: #A53030;
    }

0

.container {
  width:100%;
  display:table;
  vertical-align:middle;
}

.left {
  width:100%;
  display:table-cell;
  text-align:center;
}

.right {
  width:40px;
  height:40px;
  display:table-cell;
  float:right;
}
<div class="container">
  <div class="left">Left</div>
  <div class="right">Right</div>
</div

ลองสิ่งนี้ มันใช้งานได้สำหรับฉัน


0

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

นี่คือรหัส

// Fix the width of the right side to cover the screen when resized
$thePageRefreshed = true;
// The delay time below is needed to insure that the resize happens after the window resize event fires
// In addition the show() helps.  Without this delay the right div may go off screen when browser is refreshed 
setTimeout(function(){
    fixRightSideWidth();
    $('.right_content_container').show(600);
}, 50);

// Capture the window resize event (only fires when you resize the browser).
$( window ).resize(function() {
    fixRightSideWidth();
});

function fixRightSideWidth(){
    $blockWrap = 300; // Point at which you allow the right div to drop below the top div
    $normalRightResize = $( window ).width() - $('.left_navigator_items').width() - 20; // The -20 forces the right block to fall below the left
    if( ($normalRightResize >= $blockWrap) || $thePageRefreshed == true ){
        $('.right_content_container').width( $normalRightResize );
        $('.right_content_container').css("padding-left","0px");
        
        /* Begin test lines these can be deleted */
        $rightrightPosition = $('.right_content_container').css("right");
        $rightleftPosition = $('.right_content_container').css("left");
        $rightwidthPosition = $('.right_content_container').css("width");
        $(".top_title").html('window width: '+$( window ).width()+"&nbsp;"+'width: '+$rightwidthPosition+"&nbsp;"+'right: '+$rightrightPosition);
        /* End test lines these can be deleted */
    
    
    }
    else{
        if( $('.right_content_container').width() > 300 ){
            $('.right_content_container').width(300);
        }
        
        /* Begin test lines these can be deleted */
        $rightrightPosition = $('.right_content_container').css("right");
        $rightleftPosition = $('.right_content_container').css("left");
        $rightwidthPosition = $('.right_content_container').css("width");
        $(".top_title").html('window width: '+$( window ).width()+"&nbsp;"+'width: '+$rightwidthPosition+"&nbsp;"+'right: '+$rightrightPosition);
        /* End test lines these can be deleted */
    
    }
    if( $thePageRefreshed == true ){
        $thePageRefreshed = false;
    }
}
/* NOTE: The html and body settings are needed for full functionality
and they are ignored by jsfiddle so create this exapmle on your web site
*/
html {
    min-width: 310px;
    background: #333;
    min-height:100vh;
}

body{
	background: #333;
	background-color: #333;
	color: white;
    min-height:100vh;
}

.top_title{
  background-color: blue;
  text-align: center;
}

.bottom_content{
	border: 0px;
	height: 100%;
}

.left_right_container * {
    position: relative;
    margin: 0px;
    padding: 0px;
    background: #333 !important;
    background-color: #333 !important;
    display:inline-block;
    text-shadow: none;
    text-transform: none;
    letter-spacing: normal;
    font-size: 14px;
    font-weight: 400;
    font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
    border-radius: 0;
    box-sizing: content-box;
    transition: none;
}

.left_navigator_item{
	display:inline-block;
	margin-right: 5px;
	margin-bottom: 0px !important;
	width: 100%;
	min-height: 20px !important;
	text-align:center !important;
	margin: 0px;
	padding-top: 3px;
	padding-bottom: 3px;
	vertical-align: top;
}

.left_navigator_items {
    float: left;
    width: 150px;
}

.right_content_container{
    float: right;
    overflow: visible!important;
    width:95%; /* width don't matter jqoery overwrites on refresh */
    display:none;
    right:0px;
}

.span_text{
	background: #eee !important;
	background-color: #eee !important;
	color: black !important;
	padding: 5px;
	margin: 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div class="top_title">Test Title</div>
<div class="bottom_content">
    <div class="left_right_container">
        <div class="left_navigator_items">
            <div class="left_navigator_item">Dashboard</div>
            <div class="left_navigator_item">Calendar</div>
            <div class="left_navigator_item">Calendar Validator</div>
            <div class="left_navigator_item">Bulletin Board Slide Editor</div>
            <div class="left_navigator_item">Bulletin Board Slide Show (Live)</div>
            <div class="left_navigator_item">TV Guide</div>
        </div>
        <div class="right_content_container">
            <div class="span_text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper maximus tellus a commodo. Fusce posuere at nisi in venenatis. Sed posuere dui sapien, sit amet facilisis purus maximus sit amet. Proin luctus lectus nec rutrum accumsan. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut fermentum lectus consectetur sapien tempus molestie. Donec bibendum pulvinar purus, ac aliquet est commodo sit amet. Duis vel euismod mauris, eu congue ex. In vel arcu vel sem lobortis posuere. Cras in nisi nec urna blandit porta at et nunc. Morbi laoreet consectetur odio ultricies ullamcorper. Suspendisse potenti. Nulla facilisi.

Quisque cursus lobortis molestie. Aliquam ut scelerisque leo. Integer sed sodales lectus, eget varius odio. Nullam nec dapibus lorem. Aenean a mattis velit, ut porta nunc. Phasellus aliquam volutpat molestie. Aliquam tristique purus neque, vitae interdum ante aliquam ut.

Pellentesque quis finibus velit. Fusce ac pulvinar est, in placerat sem. Suspendisse nec nunc id nunc vestibulum hendrerit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris id lectus dapibus, tempor nunc non, bibendum nisl. Proin euismod, erat nec aliquet mollis, erat metus convallis nulla, eu tincidunt eros erat a lectus. Vivamus sed mattis neque. In vitae pellentesque mauris. Ut aliquet auctor vulputate. Duis eleifend tincidunt gravida. Sed tincidunt blandit tempor.

Duis pharetra, elit id aliquam placerat, nunc arcu interdum neque, ac luctus odio felis vitae magna. Curabitur commodo finibus suscipit. Maecenas ut risus eget nisl vehicula feugiat. Sed sed bibendum justo. Curabitur in laoreet dolor. Suspendisse eget ligula ac neque ullamcorper blandit. Phasellus sit amet ultricies tellus.

In fringilla, augue sed fringilla accumsan, orci eros laoreet urna, vel aliquam ex nulla in eros. Quisque aliquet nisl et scelerisque vehicula. Curabitur facilisis, nisi non maximus facilisis, augue erat gravida nunc, in tempus massa diam id dolor. Suspendisse dapibus leo vel pretium ultrices. Sed finibus dolor est, sit amet pharetra quam dapibus fermentum. Ut nec risus pharetra, convallis nisl nec, tempor nisl. Vivamus sit amet quam quis dolor dapibus maximus. Suspendisse accumsan sagittis ligula, ut ultricies nisi feugiat pretium. Cras aliquam velit eu venenatis accumsan. Integer imperdiet, eros sit amet dignissim volutpat, tortor enim varius turpis, vel viverra ante mauris at felis. Mauris sed accumsan sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut vel magna commodo, facilisis turpis eu, semper mi. Nulla massa risus, bibendum a magna molestie, gravida maximus nunc.</div>
        </div>
    </div>
</div>

นี่คือซอของฉันที่อาจใช้ได้ผลกับคุณเหมือนที่ฉันทำ https://jsfiddle.net/Larry_Robertson/62LLjapm/


0

กฎสำหรับรายการและตู้คอนเทนเนอร์

Container: {*** display: table; ***}
Items: {*** display: table-cell; width: 100%; ***}

ใช้white-space: nowrap; สำหรับข้อความในรายการสุดท้ายสำหรับการทำลายโครงสร้าง

รายการ X% | รายการ Y% | รายการ Z%

ความยาวรวม = 100% เสมอ!

ถ้า

Item X=50%
Item Y=10%
Item z=20%

แล้วก็

รายการ X = 70%

Item X เป็นสิ่งสำคัญ (รายการแรกเด่นในรูปแบบ CSS ของตาราง)!

ลองเนื้อหาสูงสุด คุณสมบัติสำหรับ div ภายในเพื่อกระจาย div ในคอนเทนเนอร์:

div[class="item"] {
...
  width: -webkit-max-content;
  width: -moz-max-content;
  width: max-content;
...

}


0

ทางออกที่ง่ายที่สุดคือการใช้มาร์จิ้น สิ่งนี้จะตอบสนองได้!

<div style="margin-right: auto">left</div>
<div style="margin-left: auto; margin-right:auto">center</div>
<div style="margin-left: auto">right</div>

0

ทางออกที่ง่ายที่สุดคือการทำให้ความกว้าง div ด้านซ้ายเท่ากับ 100% - ความกว้างของ div ที่ถูกต้องบวกกับระยะห่างระหว่างกัน

<div class="cont">
  <div class="search">
    Big Logo Text
  </div>
  <nav>
    <ul class="navbar">
      <li><a href="#1">NavLink1</a></li>
      <li><a href="#2">NavLink2</a></li>
      <li><a href="#3">NavLink3</a></li>
      <li><a href="#4">NavLink4</a></li>
      <li><a href="#5">NavLink5</a></li>
    </ul>
  </nav>
</div>

.cont{
  display: inline-grid;
  grid-template-columns: 160px 10px calc(100% - 170px);
  grid-template-rows: auto;
  grid-template-areas: "search .  navigation";
  width: 100%;
  height: auto;
  text-align: center;
}

.search {
  grid-area: search;
  height: 90px;
  background-color: #00FF00;
  line-height: 80px;
  font-size: 1.4rem;
  font-weight: 600;
}
nav {
  grid-area: navigation;
  height: 90px;
  background-color: #A53030;
}

.navbar{
  display: flex;
  height: 30px;
  width: 100%;
  padding: 0%;
  list-style-type: none;
  flex-flow: row wrap;
  flex: 0 1 auto;
  justify-content: space-between;
  align-content: flex-start;
  align-items: flex-start;
}

.navbar a{
    outline: 0;
    text-decoration: none;
}

https://codepen.io/tamjk/pen/dybqKBN


-2

ฉันพบปัญหาเดียวกันนี้เมื่อพยายามจัดโครงร่างตัวควบคุมjqueryUI แม้ว่าปรัชญาทั่วไปในขณะนี้คือ "ใช้DIVแทนTABLE " ฉันพบในกรณีของฉันโดยใช้ตารางทำงานได้ดีขึ้นมาก โดยเฉพาะอย่างยิ่งถ้าคุณต้องการจัดแนวตรงไปตรงมาภายในสององค์ประกอบ (เช่นการจัดกึ่งกลางแนวตั้งการจัดกึ่งกลางแนวนอน ฯลฯ ) ตัวเลือกที่มีอยู่ใน Table ให้การควบคุมที่ง่ายและใช้งานง่ายสำหรับสิ่งนี้

นี่คือทางออกของฉัน:

<html>
<head>
  <title>Sample solution for fixed left, variable right layout</title>
  <style type="text/css">
    #controls {
      width: 100%;
    }
    #RightSide {
      background-color:green;
    }
  </style>
</head>

<body>
<div id="controls">
  <table border="0" cellspacing="2" cellpadding="0">
    <TR>
      <TD>
        <button>
FixedWidth
        </button>
      </TD>
      <TD width="99%" ALIGN="CENTER">
        <div id="RightSide">Right</div>
      </TD>
    </TR>
  </table>
</div>
</body>
</html>

9
คุณไม่ควรใช้ตารางในการจัดรูปแบบอะไรนอกจากข้อมูลแบบตาราง EVER
mmmeff

1
ปัญหาเกี่ยวกับตารางคือมาร์กอัพจะทำให้เข้าใจผิดหากสิ่งที่คุณพยายามแสดงไม่ได้หมายถึงข้อมูลตาราง หากคุณเลือกที่จะละเลยหลักการของมาร์กอัปหมายแบกคุณเช่นกันอาจจะได้รับกลับไป<font>, <b>ฯลฯ HTML พัฒนาที่ผ่านมาว่าจะให้ความสำคัญน้อยลงในงานนำเสนอ
Vilinkameni

4
ไม่ทราบว่าทำไมทุกคนประหลาดเกี่ยวกับตาราง บางครั้งพวกเขาก็มีประโยชน์
Jandieg

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

@Jandieg: ดูคำตอบของ Mihai Frentiu สำหรับคำอธิบาย จุดประสงค์ทั้งหมดของ CSS คือเพื่อแยกเนื้อหาออกจากรูปลักษณ์ การใช้คุณสมบัติเช่นdisplay:tableเพื่อให้บรรลุลักษณะที่ต้องการของข้อมูลที่ไม่ใช่ตารางจะสะอาด การบังคับให้ข้อมูลที่ไม่ใช่แบบตารางเช่นคอลัมน์หน้าหรือตัวควบคุมฟอร์มลงในตาราง HTML เพื่อควบคุมเค้าโครงไม่สะอาด
เดฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.