CSS display: table-row ไม่ขยายเมื่อตั้งค่าความกว้างเป็น 100%


98

ฉันมีปัญหาเล็กน้อย ฉันใช้ FireFox 3.6 และมีโครงสร้าง DOM ดังต่อไปนี้:

<div class="view-row">
    <div class="view-type">Type</div>
    <div class="view-name">Name</div>                
</div>

และ CSS ต่อไปนี้:

.view-row {
width:100%;
display:table-row;
}

.view-name {
display: table-cell;
float:right;
}

.view-type {
display: table-cell;
}

ถ้าฉันถอดdisplay:table-rowมันจะปรากฏขึ้นอย่างถูกต้องโดยview-rowแสดงความกว้าง 100% ถ้าใส่กลับมันจะหดลง ฉันใส่สิ่งนี้ไว้ใน JS Bin:

http://jsbin.com/ifiyo

เกิดอะไรขึ้น?

คำตอบ:


90

หากคุณใช้display:table-rowฯลฯ คุณต้องมีมาร์กอัปที่เหมาะสมซึ่งรวมถึงตารางที่มี โดยพื้นฐานแล้วคำถามเดิมของคุณจะให้มาร์กอัปที่ไม่ดีเทียบเท่ากับ:

<tr style="width:100%">
    <td>Type</td>
    <td style="float:right">Name</td>
</tr>

ตารางด้านบนอยู่ที่ไหน คุณไม่สามารถเพียงแค่มีแถวออกมาจากที่ไหน (TR จะต้องมีอยู่ในทั้งtable, thead, tbodyฯลฯ )

ให้เพิ่มองค์ประกอบภายนอกโดยdisplay:tableใส่ความกว้าง 100% ให้กับองค์ประกอบที่มี เซลล์ภายในสองเซลล์จะไปที่ 50/50 โดยอัตโนมัติและจัดแนวข้อความให้ถูกต้องในเซลล์ที่สอง ลืมfloatsด้วยองค์ประกอบตาราง มันจะทำให้ปวดหัวมากมาย

มาร์กอัป:

<div class="view-table">
    <div class="view-row">
        <div class="view-type">Type</div>
        <div class="view-name">Name</div>                
    </div>
</div>

CSS:

.view-table
{
    display:table;
    width:100%;
}
.view-row,
{
    display:table-row;
}
.view-row > div
{
    display: table-cell;
}
.view-name 
{
    text-align:right;
}

11
+5 ในการกำจัดเจ้ากรรมลอย!
ชุมแห่งโอกาส

37
-1 เพราะคำอธิบายไม่ถูกต้อง ตามข้อกำหนด CSS2.1มาร์กอัป / CSS ที่เป็นปัญหาควรจะใช้งานได้
user123444555621

8
ไม่มีเบราว์เซอร์มีปัญหาใด ๆ กับตารางที่หายไป (Firefox 3.0 มี ... ) ปัญหาที่เกิดขึ้นจริงคือการตั้งค่าความกว้างในแถวของตารางจะถูกละเลยอย่างสิ้นเชิง (ซึ่งหมายความว่ามาร์กอัป / CSS ที่เป็นปัญหาในความเป็นจริงไม่ทำงานตามที่คาดไว้ดังนั้นความคิดเห็นของฉันด้านบนจึงผิด;))
user123444555621

3
คำตอบนี้ไม่ถูกต้อง มาร์กอัปของผู้ถามถูกต้อง ดังที่ Pumbaa80 กล่าวว่าปัญหาคือการสมมติว่าความกว้างต้องอยู่ที่ระดับแถวแทนที่จะเป็นระดับตาราง ความกว้างถูกตีความที่ระดับโต๊ะเท่านั้น สามารถละแถวได้ทั้งหมด ดูคำตอบทั้งหมดของฉันด้านล่าง
Amin Ariana

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

56

คำตอบที่ผ่านการทดสอบ:

ใน css .view-row ให้เปลี่ยน:

display:table-row;

ถึง:

display:table

และได้รับการกำจัดของ "ลอย" ทุกอย่างจะดำเนินไปตามที่คาดหวัง

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

ตัวอย่างการทำงาน:

<div class="view">
    <div>Type</div>
    <div>Name</div>                
</div>

ด้วย css:

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

.view > div {
  width:50%;
  display: table-cell;
}

คำตอบของคุณแสดงให้เห็นว่า CSS เทียบเท่า<table><td></td></table>ซึ่งในตัวมันเองจะเป็นมาร์กอัป HTML ที่ไม่ถูกต้องตาม W3C แม้ว่าจะตรวจสอบความถูกต้องทำไมคุณถึงแนะนำให้บอกเบราว์เซอร์ให้เลียนแบบมาร์กอัปนี้
KP.

16
นี้ถูกต้องตามกฎ CSS: w3.org/TR/CSS2/tables.html#anonymous-boxes ง่ายต่อการดูแลรักษาโดยการลบบรรทัดของโค้ดที่ไม่จำเป็นออก (ตัวอย่างเช่น <view-row> div ที่ไม่จำเป็นที่ KP แนะนำ) สิ่งนี้ช่วยฉันได้ ... ฉันกำลังใช้มัน +1
Bill Rosmus

1
แค่กำจัดงบลอยไม่พอเหรอ? .view div สามารถคงไว้ซึ่ง display: table-row property
Ideogram

1
มันดี ~~ แต่ใช้ไม่ได้กับ IE9 เท่าที่ฉันบอกได้ ~~ ฉันผิด มันยอดมาก! :)
f1lt3r

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

16

โปรดทราบว่าตามข้อกำหนด CSS3 คุณไม่จำเป็นต้องรวมเค้าโครงของคุณในองค์ประกอบสไตล์ตาราง เบราว์เซอร์จะสรุปการมีอยู่ขององค์ประกอบที่มีหากไม่มีอยู่


4
สิ่งเดียวกันนี้ได้ระบุไว้ใน CSS 2.1 , ส่วนที่ 17.2.1, 3.2 อันดับแรก ตัวอย่าง HBOX / VBOX ด้านล่างเป็นกรณีที่เป็นปัญหา ดูเหมือนว่าเบราว์เซอร์จะไม่สนใจ
user123444555621

1

ให้ใน.view-typeชั้นเรียนfloat:left;หรือลบfloat:right;ของ.view-name

แก้ไข: รวม div ของคุณ<div class="view-row">ด้วย div อื่นเช่น<div class="table">

และตั้งค่า css ต่อไปนี้:

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

คุณต้องใช้โครงสร้างตารางเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง


ฉันทดสอบด้วย ff3.6 เช่น 8, chrome, opera คุณสามารถดูได้ที่นี่jsbin.com/ifiyo/4พวกเขาแสดงเคียงข้างกัน
Sotiris

ฉันต้องการมีชื่อทางด้านขวาสุดพิมพ์ทางซ้ายสุด ... ถ้าคุณแสดงผล: อินไลน์ทั้งสองและนำจอแสดงผลออก: table-row มันใช้งานได้ฉันคิดว่าอาจมีวิธีที่ดีกว่าในการ โดยใช้คุณสมบัติของแถวตาราง / เซลล์
chum of luck

0

คุณสามารถซ้อนเซลล์ตารางได้โดยตรงภายในตาราง คุณควรมีโต๊ะ การเริ่มต้น eith table-row ไม่ทำงาน ลองใช้ HTML นี้:

<html>
  <head>
    <style type="text/css">
.table {
  display: table;
  width: 100%;
}
.tr {
  display: table-row;
  width: 100%;
}
.td {
  display: table-cell;
}
    </style>
  </head>
  <body>

    <div class="table">
      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>
    </div>

      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>

    <div class="table">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
    </div>

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