ฉันจะเก็บ CSS ลอยในหนึ่งบรรทัดได้อย่างไร


216

ฉันต้องการมีสองรายการในบรรทัดเดียวกันใช้float: leftสำหรับรายการทางด้านซ้าย

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

เป้าหมายคือการป้องกันไม่ให้สินค้าถูกห่อไว้ไม่ว่าอะไรจะเกิดขึ้น

วิธีการที่ผมบอกเบราว์เซอร์ใช้ CSS ที่ผมค่อนข้างจะยืดที่มีdivกว่าห่อมันเพื่อที่float: right;div เป็นดังต่อไปนี้float: left; div?

สิ่งที่ฉันต้องการ:

                                   \
 +---------------+  +------------------------/
 | float: left;  |  | float: right;          \
 |               |  |                        /
 |               |  |content stretching      \   Screen Edge
 |               |  |the div off the screen  /  <---
 +---------------+  +------------------------\
                                             /

54
มันจะเจ๋งแค่ไหนถ้า StackOverlow เพิ่มวิดเจ็ตการวาดภาพเล็กน้อยเพื่อให้เราสามารถสร้างไดอะแกรมเหล่านี้ด้วยเมาส์ได้? อาจเหมาะสมกว่าสำหรับไซต์ SE ที่เน้นการออกแบบ ... แต่มันก็น่ากลัวอยู่ดี
JoeCool

5
@JoeCool เว็บไซต์ UX SE มีเครื่องมือในการสร้างจำลองอยู่แล้ว meta.ux.stackexchange.com/questions/1291/…
frank hadder

คำตอบ:


77

ห่อของที่ลอย<div>อยู่ในคอนเทนเนอร์<div>ที่ใช้แฮ็คความกว้างขั้นต่ำของเบราว์เซอร์:

.minwidth { min-width:100px; width: auto !important; width: 100px; }

คุณอาจต้องตั้งค่า "ล้น" แต่อาจไม่ได้

งานนี้เพราะ:

  • !importantประกาศรวมกับmin-widthสาเหตุที่ทุกอย่างจะอยู่บนบรรทัดเดียวกันใน IE7 +
  • IE6 ไม่ได้ใช้งานmin-widthแต่มีข้อผิดพลาดเช่นนั้นwidth: 100pxแทนที่การ!importantประกาศทำให้ความกว้างคอนเทนเนอร์เท่ากับ 100px

มันใช้งานได้ดีสำหรับสองลอย แต่ไม่ใช่สามอัน สามารถใช้งานได้สามหรือไม่?
tylerthemiler

15
ปัญหาเดียวก็คือมันบังคับให้ความกว้างขั้นต่ำคงที่
Matt Montag

6
นี่ไม่ใช่วิธีแก้ปัญหามันเป็นเพียงความกว้างขั้นต่ำเมื่อเนื้อหาของคุณมีขนาดเล็กมาก (ดูคำถาม) ดังนั้นต่ำกว่า 100px ที่คุณมีปัญหาเดียวกัน พิเศษกับเซลล์ของตารางสิ่งนี้ยังคงเป็นปัญหาอยู่
Sanne

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

สิ่งนี้อาจใช้งานได้กับ divs แต่ฉันเพิ่งทดสอบด้วย ul / li และใช้ไม่ได้ :(
AsGoodAsItGets

132

ตัวเลือกอื่นคือแทนที่จะลอยเพื่อตั้งค่าคุณสมบัติช่องว่างสีขาวให้เป็นแม่ div:

.parent {
     white-space: nowrap;
}

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

.child {
    display:inline-block;
    width:300px;
    white-space: normal;
}

นี่คือ JSFiddle: https://jsfiddle.net/9g8ud31o/


4
ทางออกที่ดีที่สุดที่ฉันเคยเห็น มันใช้งานได้กับกรณีการใช้งานของฉัน แต่ฉันสงสัยว่ามันรองรับได้ดีแค่ไหน โชคดีที่การใช้โฟลตสำหรับทุกสิ่งกำลังจะกลายเป็นอดีตไปแล้ว
Ryan Ore

1
คุณอธิบายได้ไหมว่ามันทำงานอย่างไร หรือลิงค์ใด ๆ อย่างน้อย?
Anirudhan J

4
@AnirudhanJ มันไม่ยากเกินไป Inline บล็อกทำให้องค์ประกอบไหลตามปกติที่มีข้อความแบบอินไลน์ ( แต่ยังคงมีบางส่วนของความสามารถในการขยายขอบ / ของบล็อก) และคุณอย่างแท้จริงเพียงแค่บอก CSS ไม่ให้ตัดข้อความที่มีพื้นที่สีขาว: ตัวเลือก nowrap (ใช้ "ปกติ "อีกครั้งเพื่อเด็กที่จะหลีกเลี่ยงมันแพร่กระจายลงไปทุกอย่าง)
ไบรอัน

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

คุณยังสามารถใช้ระยะห่างระหว่างตัวอักษร: -3px (หรือค่าใดก็ได้ที่เหมาะกับคุณ) เพื่อลบช่องว่างระหว่างองค์ประกอบในบล็อก PS: ดีกว่าคำตอบที่ยอมรับได้ ;
Claudiu


10

โซลูชันที่ 1:

จอแสดงผล: ตารางเซลล์ (ไม่รองรับอย่างกว้างขวาง)

โซลูชันที่ 2:

ตาราง

(ฉันเกลียดการแฮ็ก)


8

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


4

คุณแน่ใจหรือว่าองค์ประกอบระดับบล็อกลอยเป็นทางออกที่ดีที่สุดสำหรับปัญหานี้?

บ่อยครั้งที่ความยากของ CSS ในประสบการณ์ของฉันมันกลับกลายเป็นว่าเหตุผลที่ฉันไม่เห็นวิธีการทำสิ่งที่ฉันต้องการคือฉันได้ติดอยู่ในวิสัยทัศน์อุโมงค์เกี่ยวกับมาร์กอัปของฉัน (คิดว่า "ฉันจะทำสิ่งเหล่านี้อย่างไรองค์ประกอบทำสิ่งนี้หรือไม่ ") แทนที่จะย้อนกลับไปดูสิ่งที่ฉันต้องการเพื่อให้บรรลุและอาจจะปรับใช้ html ของฉันอีกเล็กน้อยเพื่ออำนวยความสะดวก


มันใช้งานได้กับทุกอย่างและเลย์เอาต์ที่มีอยู่นั้นขึ้นอยู่กับว่าฉันแค่พยายามแก้ไขปัญหาเกี่ยวกับการแตกเลย์เอาต์เมื่อคุณเพิ่มขนาดตัวอักษรมากเกินไปหรือปรับขนาดหน้าต่างเบราว์เซอร์ที่เล็กกว่า 700px
Jiaaro

2

ฉันขอแนะนำให้ใช้ตารางสำหรับปัญหานี้ ฉันมีปัญหาที่คล้ายกันและตราบใดที่ตารางใช้เพื่อแสดงข้อมูลบางอย่างเท่านั้นไม่ใช่เค้าโครงของหน้าหลัก


2

เพิ่มบรรทัดนี้ไปยังตัวเลือกองค์ประกอบลอยของคุณ

.floated {
    float: left;
    ...
    box-sizing: border-box;
}

มันจะป้องกันการขยายและขอบเพื่อเพิ่มความกว้างดังนั้นองค์ประกอบอยู่ในแถวเสมอแม้ว่าคุณจะมีเช่น สามองค์ประกอบที่มีความกว้าง 33.33333%


0

เมื่อผู้ใช้ลดขนาดหน้าต่างในแนวนอนและสิ่งนี้ทำให้ลอยไปกองในแนวตั้งลบลอยและใน div ที่สอง (นั่นคือลอย) ใช้ขอบบน: -123px (ค่าของคุณ) และขอบซ้าย: 444px (ค่าของคุณ) วางตำแหน่ง divs ตามที่ปรากฏพร้อมกับลอย เมื่อทำเช่นนี้เมื่อหน้าต่างแคบลง div ด้านขวาจะอยู่ในตำแหน่งและหายไปเมื่อหน้าแคบเกินไปที่จะรวมไว้ ... ที่ (ถึงฉัน) จะดีกว่าการใช้ div "กระโดด" ด้านขวาลงด้านล่าง div ด้านซ้ายเมื่อหน้าต่างเบราว์เซอร์แคบลงโดยผู้ใช้


-3

วิธีที่ฉันได้รับสิ่งนี้คือใช้ jQuery เหตุผลที่ฉันทำแบบนี้ก็เพราะ A และ B มีความกว้างเป็นเปอร์เซ็นต์

HTML:

<div class="floatNoWrap">
    <div id="A" style="float: left;">
        Content A
    </div>
    <div id="B" style="float: left;">
        Content B
    </div>
    <div style="clear: both;"></div>
</div>

CSS:

.floatNoWrap
{
    width: 100%;
    height: 100%;
}

jQuery:

$("[class~='floatNoWrap']").each(function () {
    $(this).css("width", $(this).outerWidth());
});

1
กรอบสำหรับ CSS? ฉันต้อง -jquery สำหรับการค้นหา JavaScript ทั้งหมดและเนื่องจากความสมบูรณ์และไม่สนใจคุณภาพเราจึงต้องเริ่มต้นค้นหา CSS ด้วย -jquery อย่างชัดเจนด้วยหรือไม่ ทำถูกต้องหรือไม่ทำเลย
จอห์น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.