วิธีทำให้ div ว่างใช้พื้นที่


105

นี่คือกรณีระบบกริด 960 ของฉัน:

<div class="kundregister_grid_full">
    <div class="kundregister_grid_1">ID</div>
    <div class="kundregister_grid_1">Namn</div>
    <div class="kundregister_grid_1">Anv.Namn</div>
    <div class="kundregister_grid_1">Email</div>
    <div class="kundregister_grid_1">Roll</div>
    <div class="kundregister_grid_1">Aktiv</div>
</div>

นี่คือชุด div ของฉันที่ใช้เป็นโครงสร้างตาราง

CSS กล่าวว่า:

.kundregister_grid_1 {
    display: inline-block;
    float: left;
    margin: 0; 
    text-align: center;
}
.kundregister_grid_1 {
    width: 140px;
}

อย่ารังเกียจการตั้งชื่อภาษาสวีเดน ฉันต้องการให้ div แสดงแม้ว่าจะไม่มีค่าก็ตาม

<div class="kundregister_grid_full">
 <div class="kundregister_grid_1">ID</div>
 <div class="kundregister_grid_1"></div>
 <div class="kundregister_grid_1"></div>
 <div class="kundregister_grid_1">Email</div>
 <div class="kundregister_grid_1">Roll</div>
 <div class="kundregister_grid_1">Aktiv</div>
</div>

ในกรณีนี้ไม่มี 'Namn' และ 'Avn.Namn' ในสองคอลัมน์ อย่างไรก็ตามเมื่อเรียกใช้สิ่งนี้ใน chrome จะถูกลบออกและจะไม่ดัน div อื่น ๆ ตามลำดับfloat:leftอีกต่อไป ดังนั้นหากฉันมีหมวดหมู่ใน div เดียวกันด้านบนค่าจะถูกวางไว้ในหมวดหมู่ที่ไม่ถูกต้อง

คำตอบ:


65

ใช้งานได้ถ้าคุณลบลอย http://jsbin.com/izoca/2/edit

ด้วยการลอยจะใช้งานได้เฉพาะเมื่อมีเนื้อหาบางอย่างเช่น &nbsp;


5
อีกคำตอบหนึ่งกล่าวว่าการใส่ความสูงต่ำสุดจะทำให้ทำงานได้เมื่อลอยตัวและแน่นอนในกรณีของฉันเองที่ได้ผล หากนั่นเป็นความจริงเสมอ (ตอนนี้ในปี 2559) คำตอบนี้ผิด คุณสามารถเพิ่ม min-height: 1px; ถึงความกว้าง: 140px; โดยไม่จำเป็นต้องลบลอยหรือเพิ่มเนื้อหา
Nick Rice

ลองใช้element.text("&nbsp;");jQuery แล้ว&nbsp;ปรากฎในเพจ
Lori

56

ลองเพิ่ม&nbsp;ในรายการที่ว่างเปล่า

ฉันไม่เข้าใจว่าทำไมคุณไม่ใช้<table>ที่นี่ล่ะ? พวกเขาจะทำสิ่งนี้โดยอัตโนมัติ


9
เห็นด้วย หากเป็นข้อมูลแบบตารางให้ใช้ตารางนั่นคือสิ่งที่มีไว้สำหรับ
Dan Diplo

5
หลังจากเวลานี้ผู้คนยังคงคิดว่า<table>== ไม่ดี
saluce

4
การใช้&nbsp;วิธีแก้ปัญหาที่ได้รับความนิยมเช่นเดียวกับที่เป็นอยู่อาจทำให้เกิดปัญหาในบางสถานการณ์ เช่นเดียวกับเมื่อคุณขีดฆ่า ( text-decoration: line-through;) ข้อความเส้นโครงร่างจะปรากฏขึ้น&nbsp;ในขณะที่สิ่งที่คุณต้องการจริงๆเป็นเพียง div เปล่า
Izhaki

1
@Pekka 웃ไม่สามารถ "ใช้ตาราง" ได้เสมอไป ฉันมีปัญหาเดียวกันนี้ ("วิธีทำให้ div ว่างใช้พื้นที่") สำหรับการออกแบบที่ตอบสนองโดยที่ฉันสร้างตารางแนวนอนให้เป็นตารางแนวตั้งเมื่อความกว้างสั้น ฉันใช้ตารางอยู่แล้ว ...
ANeves คิดว่า SE ชั่วร้าย

@ แม้ว่าตารางจะเว้นระยะความกว้างให้ถูกต้องเสมอในกรณีนี้ไม่? ไม่แน่ใจว่าฉันติดตาม ....
Pekka

25

อัปเดตเล็กน้อยสำหรับคำตอบ @ no1cobla สิ่งนี้จะซ่อนช่วงเวลา โซลูชันนี้ใช้ได้กับ IE8 +

.class:after
{
    content: '.';
    visibility: hidden;
}

5
หากคุณต้องการใช้สิ่งนี้เป็นทางเลือกในการทำงานเมื่อองค์ประกอบว่างเปล่าให้เพิ่มสิ่งที่ต้องการ:.class:after:empty
Miguel Garrido

1
@Miguel Garrido - ฉันต้องใช้. class: empty: หลังจากนั้นถึงจะใช้งานได้
secondperson

24

วิธีการแก้ปัญหาที่ง่ายสำหรับว่างลอย divs คือการเพิ่ม:

  • ความกว้าง (หรือความกว้างต่ำสุด)
  • ความสูงต่ำสุด

ด้วยวิธีนี้คุณสามารถใช้ฟังก์ชันลอยและบังคับให้เติมช่องว่างเมื่อว่างเปล่า

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

ตัวอย่าง:

.left-column
{
   width: 200px;
   min-height: 1px;
   float: left;
}

.right-column
{
    width: 500px;
    min-height: 1px;
    float: left;
}

4
min-heightเป็นทางออกที่ดีที่สุด
Vall3y

นาทีความสูงเพียงwidthแก้ไขปัญหาด้วย อย่างไรก็ตามไม่ได้ป้องกันไม่ให้ div มีความสูงเป็นศูนย์ (ลองตั้งค่าพื้นหลัง div เพื่อดูปัญหา) เพราะฉะนั้น & nbsp; เป็นวิธีแก้ปัญหาทั่วไป นอกจากนี้เนื้อหา: "." แก้ไขปัญหาความสูงเป็นศูนย์
John Henckel

1
min-height = 1px ไม่เท่ากับ 0! มันจะเป็น 1 px หากคุณต้องการความสูงเริ่มต้นคุณสามารถพูดได้ง่ายๆว่า min-height = 100px และ min width = 100px div จะเป็น 100x100 เสมอไม่มีทางที่จะเป็น 0
Engineeroholic

และการใช้ "& nbsp" เป็นการปฏิบัติที่แย่มากจะเป็นอย่างไรหากคุณมีเว็บไซต์ขนาดใหญ่ที่มีไฟล์จำนวนมากและแต่ละไฟล์มีบรรทัด html 10K? ถ้าฉันจะทำตามแนวทางของคุณฉันจะวาง "& nbsp" ไว้ในแต่ละไฟล์ !! เสียเวลาเปล่า!? จะเกิดอะไรขึ้นถ้าคุณมีเว็บไซต์เนื้อหาที่ผู้ใช้สร้างขึ้น เช่นผู้ใช้ส่งความคิดเห็นว่างเปล่า .. จากโซลูชันของคุณฉันต้องสร้างรหัสเพื่อตรวจสอบว่าความคิดเห็นนั้นว่างเปล่าหรือไม่จากนั้นเพิ่ม "& nbsp" (ซับซ้อนเกินเหตุโดยไม่มีเหตุผล) ความสูงต่ำสุดและความกว้างต่ำสุดเป็นทางออกที่ดีที่สุด เพราะฉันจะเขียนมันครั้งเดียวและจะไม่ต้องกังวลกับมันอีกแม้ว่าฉันจะเพิ่มเนื้อหาเพิ่มเติมในอนาคตก็ตาม
Engineeroholic

22

เพียงเพิ่มอักขระช่องว่างความกว้างเป็นศูนย์ภายในองค์ประกอบหลอก

.class:after {
    content: '\200b';
}

ฉันชอบความคิดนี้เพราะมันหมายความว่าผู้ใช้จะไม่คัดลอกวางโดยไม่ได้ตั้งใจองค์ประกอบหลอกจะไม่สามารถเลือกได้ตามค่าเริ่มต้น
Domino

3

นี่เป็นวิธีหนึ่ง:

.your-selector:empty::after {
    content: ".";
    visibility: hidden;
}

1
ผมขอแนะนำให้content: "\200b";หาพื้นที่ความกว้างศูนย์ ข้อดีเพิ่มเติมคือเบราว์เซอร์จะไม่เลือกอักขระนี้ (เช่นCTRL+A CTRL+Cจะยังคงทำงานเหมือนเดิม)

3

คุณสามารถ:

oตั้งค่า.kundregister_grid_1เป็น:

  • width(หรือwidth-min) กับheight(หรือmin-height)
  • หรือ padding-top
  • หรือ padding-bottom
  • หรือ border-top
  • หรือ border-bottom

oหรือใช้องค์ประกอบหลอก : ::beforeหรือ::afterด้วย:

  • {content: "\200B";}
  • หรือ{content: "."; visibility: hidden;}.

oหรือใส่ไว้&nbsp;ในองค์ประกอบที่ว่างเปล่า แต่บางครั้งอาจทำให้เกิดผลกระทบที่ไม่คาดคิดเช่น ร่วมกับtext-decoration: underline;




1

ด้วยการใช้อินไลน์บล็อกมันจะทำงานเป็นวัตถุแบบอินไลน์ จึงไม่จำเป็นต้องมีลอยเพื่อให้ติดกันในบรรทัดเดียว และตามที่ริโตะกล่าวไว้การลอยตัวนั้นต้องการ "ร่างกาย" เช่นเดียวกับที่พวกมันต้องการมิติ

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

แต่ถ้าคุณต้องการสิ่งที่คุณต้องการจริงๆ มีวิธีแฮ็ค css เช่นเดียวกับการแฮ็กแบบลอย

.kundregister_grid_1:after {  content: ".";  }

เพิ่มอันนั้นและคุณก็ตั้งค่า: D (หมายเหตุ: ใช้ไม่ได้ใน IE แต่สามารถแก้ไขได้)


1

หากจำเป็นต้องลอยคุณสามารถตั้งค่า min-height เป็น 1px เพื่อไม่ให้ยุบได้


0

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

HTML

<layout-table>
   <layout-header> 
       <layout-column> 1 a</layout-column>
       <layout-column>  </layout-column>
       <layout-column> 3 </layout-column>
       <layout-column> 4 </layout-column>
   </layout-header>

   <layout-row> 
       <layout-column> a </layout-column>
       <layout-column> a 1</layout-column>
       <layout-column> a </layout-column>
       <layout-column> a </layout-column>
   </layout-row>

   <layout-footer> 
       <layout-column> 1 </layout-column>
       <layout-column>  </layout-column>
       <layout-column> 3 b</layout-column>
       <layout-column> 4 </layout-column>
   </layout-footer>
</layout-table>

CSS

layout-table
{
    display : table;
    clear : both;
    table-layout : fixed;
    width : 100%;
}

layout-table:unresolved
{
    color : red;
    border: 1px blue solid;
    empty-cells : show;
}

layout-header, layout-footer, layout-row 
{
    display : table-row;
    clear : both;   
    empty-cells : show;
    width : 100%;
}

layout-column 
{ 
    display : table-column;
    float : left;
    width : 25%;
    min-width : 25%;
    empty-cells : show;
    box-sizing: border-box;
    /* border: 1px solid white; */
    padding : 1px 1px 1px 1px;
}

layout-row:nth-child(even)
{ 
    background-color : lightblue;
}

layout-row:hover 
{ background-color: #f5f5f5 }

กุญแจสำคัญที่นี่คือขนาดกล่องและช่องว่างภายใน

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