การตั้งค่าความกว้างคอลัมน์ตาราง


203

ฉันมีตารางง่ายๆที่ใช้สำหรับกล่องจดหมายดังนี้:

<table border="1">
        <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
        </tr>

ฉันจะตั้งค่าความกว้างได้อย่างไรจากและวันที่คือ 15% ของความกว้างของหน้าและหัวเรื่องคือ 70% ฉันต้องการให้ตารางใช้ความกว้างของหน้าทั้งหมด

คำตอบ:


319

<table style="width: 100%">
    <colgroup>
       <col span="1" style="width: 15%;">
       <col span="1" style="width: 70%;">
       <col span="1" style="width: 15%;">
    </colgroup>
    
    
    
    <!-- Put <thead>, <tbody>, and <tr>'s here! -->
    <tbody>
        <tr>
            <td style="background-color: #777">15%</td>
            <td style="background-color: #aaa">70%</td>
            <td style="background-color: #777">15%</td>
        </tr>
    </tbody>
</table>


5
ชอบความสะอาดของสารละลายนี้ อย่างไรก็ตามโปรดปิด col เช่น <col span = "1" style = "width: 15%;" /> หรือ <col span = "1" style = "width: 15%;"> </col>
lsu_guy

23
@Isu_guy คุณปิด <col> เมื่อใช้ XHTML - ใน HTML แท็ก <col> ไม่มีการปิด ... ดูลิงค์สำหรับข้อมูลเพิ่มเติม ใน HTML5 <col> เป็นองค์ประกอบที่เป็นโมฆะซึ่งหมายความว่าจะต้องไม่ถูกปิด
Matija Nalis

4
@Zulu ตามw3schools.com/tags/att_col_width.asp "แอตทริบิวต์ความกว้าง <col> ไม่รองรับใน HTML5"
Caltor

30
@Caltor: รหัสไม่ได้ใช้ <col> width attribute; มันใช้ a CSS *style* widthซึ่งเป็นสิ่งที่แทนที่คุณลักษณะความกว้างของ <col> (แม้จะมีผู้โหวตหลายคนแสดงความคิดเห็น !!)
ToolmakerSteve

4
span="1"ไม่จำเป็นเนื่องจาก 1 เป็นค่าเริ่มต้น
Madbreaks

128

HTML:

<table>
  <thead>
    <tr>
      <th class="from">From</th>
      <th class="subject">Subject</th>
      <th class="date">Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>[from]</td>
      <td>[subject]</td>
      <td>[date]</td>
    </tr>
  </tbody>
</table>

CSS:

table {
  width: 100%;
  border: 1px solid #000;
}
th.from, th.date {
  width: 15%
}
th.subject {
  width: 70%; /* Not necessary, since only 70% width remains */
}

แนวทางปฏิบัติที่ดีที่สุดคือการแยก HTML และ CSS ของคุณออกจากกันเพื่อลดความซ้ำซ้อนของรหัสและแยกความกังวล (HTML สำหรับโครงสร้างและความหมายและ CSS สำหรับงานนำเสนอ)

โปรดทราบว่าเพื่อให้การทำงานใน Internet Explorer เวอร์ชันเก่าคุณอาจต้องให้ความกว้างเฉพาะตารางของคุณ (เช่น 900px) เบราว์เซอร์นั้นมีปัญหาในการเรนเดอร์องค์ประกอบที่มีขนาดเป็นเปอร์เซ็นต์ถ้า wrapper ไม่มีขนาดที่แน่นอน


การแก้ปัญหานี้ล้มเหลวหากคุณมี colspans ในแถวแรก
mark1234

3
ดีเพราะ <col width = ""> ล้าสมัยใน HTML5: developer.mozilla.org/en/docs/Web/HTML/Element/col
Richard

30

ใช้ CSS ด้านล่างการประกาศครั้งแรกจะทำให้มั่นใจได้ว่าตารางของคุณจะยึดตามความกว้างที่คุณให้ไว้ (คุณจะต้องเพิ่มคลาสใน HTML ของคุณ):

table{
  table-layout:fixed;
}
th.from, th.date {
  width: 15%;
}
th.subject{
  width: 70%;
}

ที่จริงคุณต้องระบุความกว้างของสองคอลัมน์เท่านั้น อันที่สามจะถูกคำนวณโดยอัตโนมัติดังนั้นtable{table-layout:fixed};.from,.date{width:15%}ก็เพียงพอแล้ว เว้นแต่จะได้เรียนที่มีการใช้ในองค์ประกอบอื่น ๆ ด้วยการเขียนเป็นซ้ำซ้อนและสามารถลงไปเพียงแค่th.from .from
tomasz86

14

ทางเลือกอื่นในการเรียนเพียงครั้งเดียวในขณะที่รักษาสไตล์ของคุณในไฟล์ CSS ซึ่งสามารถใช้งานได้ใน IE7:

<table class="mytable">
    <tr>
        <th>From</th>
        <th>Subject</th>
        <th>Date</th>
    </tr>
</table>
<style>
    .mytable td, .mytable th { width:15%; }
    .mytable td + td, .mytable th + th { width:70%; }
    .mytable td + td + td, .mytable th + th + th { width:15%; }
</style>

ไม่นานมานี้คุณยังสามารถใช้nth-child()ตัวเลือกจาก CSS3 (IE9 +) ซึ่งคุณจะใส่ nr ของคอลัมน์ที่เกี่ยวข้องลงในวงเล็บแทนการร้อยรวมเข้ากับตัวเลือกที่อยู่ติดกัน เช่นนี้ตัวอย่างเช่น:

<style>
    .mytable tr > *:nth-child(1) { width:15%; }
    .mytable tr > *:nth-child(2) { width:70%; }
    .mytable tr > *:nth-child(3) { width:15%; }
</style>

:nth-childโซลูชันที่เสนอนั้นน่ากลัวในแง่ของประสิทธิภาพ ไม่มีเหตุผลที่ถูกต้องที่จะใช้มัน (โดยเฉพาะกับตัวเลือกสากล) ในตัวอย่างนี้ซึ่งมีเพียงสามองค์ประกอบ ( thหรือcol) ในการจัดสไตล์ นอกจากนี้คุณจะต้องตั้งค่าความกว้างเป็นthในแถวแรก .mytable tdในตัวอย่างแรกจะซ้ำซ้อน
tomasz86

"ข้อเสนอ: โซลูชั่นที่ n-child น่ากลัวในแง่ของประสิทธิภาพ" - ต้องการการอ้างอิง
DanMan

นี้ควรจะเป็นพอ: ประสิทธิภาพการแสดงผล CSS ด้วยการใช้งานของตัวเลือกสากลเบราว์เซอร์แรกจะตรวจสอบองค์ประกอบทั้งหมดไม่ว่าจะเป็นเด็กที่ n ขององค์ประกอบอื่นแล้วถ้าพ่อแม่ของพวกเขาโดยตรงเป็นแล้วไม่ว่าจะเป็นtr .mytableถ้าคุณอยากจะใช้ "ชับ" .mytable th:nth-of-type(1) {width: 15%}; .mytable th:nth-of-type(2) {width: 70%};แล้วบางอย่างเช่นนี้อาจจะมีมากดีกว่า: นอกจากนี้ยังไม่จำเป็นต้องระบุความกว้างคอลัมน์ที่สามในกรณีนี้
tomasz86

.mytable th+th{width: 70%}.mytable th+th+th{width:15%}ส่วนตัวผมจะใช้เรียนหรือเพียงแค่ ตัวเลือก "nth" อาจมีประโยชน์มาก แต่ในกรณีนี้ (ตารางเล็ก ๆ ที่มีเพียง 3 คอลัมน์) ไม่จำเป็นจริงๆ เมื่อใช้คุณยังสามารถทำเพียงแค่นี้table-layout: fixed table{table-layout:fixed}th:first-child+th{width:70%}
tomasz86

ฉันรู้เรื่องนั้น แต่บทความเหล่านั้นมาจากหลายปีก่อนและมีปัญหาใหญ่ขึ้นในวันนี้ที่ตัวเลือก CSS เช่นรูปภาพจำนวนมากและรหัส JS
DanMan

8

นี่คือคำแนะนำสองข้อของฉัน

  1. ใช้คลาส ไม่จำเป็นต้องระบุความกว้างของอีกสองคอลัมน์เนื่องจากเบราว์เซอร์จะตั้งค่าไว้ที่ 15% โดยอัตโนมัติ

        table { table-layout: fixed; }
        .subject { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th class="subject">Subject</th>
            <th>Date</th>
          </tr>
        </table>

  2. โดยไม่ต้องใช้คลาส สามวิธีที่ต่างกัน แต่ผลลัพธ์นั้นเหมือนกัน

    ก)

        table { table-layout: fixed; }
        th+th { width: 70%; }
        th+th+th { width: 15%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>

    ข)

        table { table-layout: fixed; }
        th:nth-of-type(2) { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>

    c) อันนี้เป็นที่ชื่นชอบ เหมือนกับ b) แต่ด้วยการรองรับเบราว์เซอร์ที่ดีขึ้น

        table { table-layout: fixed; }
        th:first-child+th { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>


5

ขึ้นอยู่กับร่างกายของคุณ (หรือกองที่วางตารางของคุณ) การตั้งค่าคุณควรจะทำสิ่งนี้:

body {
  width: 98%;
}

table {
  width: 100%;
}


th {
  border: 1px solid black;
}


th.From, th.Date {
  width: 15%;
}

th.Date {
  width: 70%;
}


<table>
  <thead>
    <tr>
      <th class="From">From</th>
      <th class="Subject">Subject</th>
      <th class="Date">Date</th>
    </tr>
   </thead>
   <tbody>
     <tr>
       <td>Me</td>
       <td>Your question</td>
       <td>5/30/2009 2:41:40 AM UTC</td>
     </tr>
   </tbody>
</table>

การสาธิต




4

ลองใช้วิธีนี้แทน

<table style="width: 100%">
    <tr>
        <th style="width: 20%">
           column 1
        </th>
        <th style="width: 40%">
           column 2
        </th>
        <th style="width: 40%">
           column 3
        </th>
    </tr>
    <tr>
        <td style="width: 20%">
           value 1
        </td>
        <td style="width: 40%">
           value 2
        </td>
        <td style="width: 40%">
           value 3
        </td>
    </tr>
</table>

3

อย่าใช้คุณสมบัติเส้นขอบใช้ CSS สำหรับความต้องการในการใส่สไตล์ของคุณ

<table style="border:1px; width:100%;">
    <tr>
            <th style="width:15%;">From</th>
            <th style="width:70%;">Subject</th>
            <th style="width:15%;">Date</th>
    </tr>
... rest of the table code...
</table>

แต่การฝัง CSS เช่นนั้นเป็นแนวปฏิบัติที่ไม่ดีใครควรใช้คลาส CSS แทนและวางกฎ CSS ไว้ในไฟล์ CSS ภายนอก


1
ฉันสงสัยว่าโค้ดตัวอย่างที่ OP และสแต็คโอเวอร์โฟลว์ที่มีประโยชน์นั้นโพสต์นั้นมีไว้เพื่อความชัดเจนและความเรียบง่ายโดยไม่ได้รับการสนับสนุนสำหรับรูปแบบอินไลน์
Tass

2

นี่เป็นอีกวิธีหนึ่งที่น้อยที่สุดที่จะทำใน CSS ที่ทำงานแม้ในเบราว์เซอร์รุ่นเก่าที่ไม่สนับสนุน:nth-childและไม่ชอบเตอร์: http://jsfiddle.net/3wZWt/

HTML:

<table>
    <tr>
        <th>From</th>
        <th>Subject</th>
        <th>Date</th>
    </tr>
    <tr>
        <td>Dmitriy</td>
        <td>Learning CSS</td>
        <td>7/5/2014</td>
    </tr>
</table>

CSS:

table {
    border-collapse: collapse;
    width: 100%;
}

tr > * {
    border: 1px solid #000;
}

tr > th + th {
    width: 70%;
}

tr > th + th + th {
    width: 15%;
}

2

เพิ่ม colgroup หลังแท็กตารางของคุณ กำหนดความกว้างและจำนวนคอลัมน์ที่นี่ และเพิ่มแท็ก tbody ใส่ TR ของคุณเข้าไปในร่างกาย

<table>
    <colgroup>
       <col span="1" style="width: 30%;">
       <col span="1" style="width: 70%;">
    </colgroup>


    <tbody>
        <tr>
            <td>First column</td>
            <td>Second column</td>
        </tr>
    </tbody>
</table>

0
style="column-width:300px;white-space: normal;"

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