ตั้งค่าความกว้างคอลัมน์คงที่โดยไม่คำนึงถึงจำนวนข้อความในเซลล์หรือไม่


535

100pxในตารางของฉันฉันกำหนดความกว้างของเซลล์แรกในคอลัมน์ที่จะเป็น
แต่เมื่อข้อความในหนึ่งของเซลล์ในคอลัมน์นี้ยาวเกินไป, 100pxความกว้างของคอลัมน์กลายเป็นมากกว่า ฉันจะปิดการใช้งานการขยายตัวนี้ได้อย่างไร


5
stackoverflow.com/questions/1258416/word-wrap-in-a-html-tableอาจช่วยชี้แนะคุณในทิศทางที่ถูกต้อง
justinl

2
ในกรณีของฉันไม่มีการขยายเกิดขึ้น แต่สิ่งที่ตรงกันข้าม: ความกว้างที่ไม่ต้องการลดลงแม้จะมีการประกาศความกว้างอย่างชัดเจนของฉัน ไร้สาระ!
Csaba Toth

ทางออกที่ถูกต้องเพียงวิธีเดียวคือการใช้ colgroup กับ cols ในนั้นและตั้งค่าความกว้าง cols
MightyPork

table-layout:fixed;เป็นวิธีแก้ปัญหา
emfi

คำตอบ:


607

ฉันเล่นกับมันสักพักเพราะฉันมีปัญหาในการหามัน

คุณจำเป็นต้องกำหนดความกว้างเซลล์ (อย่างใดอย่างหนึ่งthหรือtdทำงานผมตั้งทั้งสอง) และการตั้งค่าไปtable-layout fixedด้วยเหตุผลบางอย่างความกว้างของเซลล์ดูเหมือนจะคงที่เฉพาะเมื่อตั้งค่าความกว้างของตารางด้วย (ฉันคิดว่ามันโง่ แต่เป็นคำพูด)

นอกจากนี้ยังเป็นประโยชน์ในการตั้งค่าoverflowคุณสมบัติเป็นhiddenเพื่อป้องกันไม่ให้ข้อความพิเศษใด ๆ ออกมาจากตาราง

คุณควรตรวจสอบให้แน่ใจว่าคุณทิ้งขอบที่กำหนดไว้ทั้งหมดไว้สำหรับ CSS ด้วย

ตกลงนี่คือสิ่งที่ฉันมี:

table {
  border: 1px solid black;
  table-layout: fixed;
  width: 200px;
}

th,
td {
  border: 1px solid black;
  width: 100px;
  overflow: hidden;
}
<table>
  <tr>
    <th>header 1</th>
    <th>header 234567895678657</th>
  </tr>
  <tr>
    <td>data asdfasdfasdfasdfasdf</td>
    <td>data 2</td>
  </tr>
</table>

ที่นี่มันอยู่ใน JSFiddle

ผู้ชายคนนี้มีปัญหาที่คล้ายกัน: ความกว้างของเซลล์ตาราง - ความกว้างคงที่, การตัด / ตัดคำยาว


77
สิ่งสำคัญคือต้องสังเกตสิ่งนี้: "เบราว์เซอร์จะตั้งค่าความกว้างคอลัมน์ตามความกว้างของเซลล์ในแถวแรกของตาราง" จากstackoverflow.com/questions/570154/…
daniloquio

12
มันจะทำงานเมื่อความกว้างของตารางไม่ได้รับการแก้ไข jsfiddle.net/lavinski/CGCFW/3คุณต้องใช้แถวแบบไดนามิกเพื่อใช้พื้นที่ที่เหลือ
Daniel Little

2
@DanielLittle หรือคุณสามารถกำหนดความกว้างของตารางเป็น 1px ด้วยoverflow: visibleสำหรับโต๊ะขนาดแบบไดนามิกตราบเท่าที่ขนาดของเซลล์ได้รับการแก้ไขและล้นจะมองเห็นมันไม่สำคัญถ้าขนาดของตารางของตัวเองเป็นใหญ่กว่าหรือเล็กกว่าเซลล์ที่เกิดขึ้นจริง
Mahn

คุณจะทำอย่างไรถ้า td ของคุณมี "width = 30%;"
71GA

โปรดเพิ่มการล้น: ซ่อน @ RokoC.Buljan
Alex Grande

177

ดู: http://www.html5-tutorials.org/tables/changing-column-width/

หลังแท็กตารางให้ใช้องค์ประกอบ col คุณไม่จำเป็นต้องมีแท็กปิด

ตัวอย่างเช่นหากคุณมีสามคอลัมน์:

<table>
  <colgroup>
    <col style="width:40%">
    <col style="width:30%">
    <col style="width:30%">
  </colgroup>  
  <tbody>
    ...
  </tbody>
</table>

25
นี้! นี่คือคำตอบของ HTML5 และมันทำงานได้โดยที่ฉันไม่ต้องกระโดดผ่านห่วงงี่เง่า นอกจากนี้คุณยังสามารถใช้ <col class = "someClassName"> แทนเพื่อรักษาความกว้างของคุณใน CSS และไม่ทำให้ HTML ของคุณสกปรกด้วยข้อมูลสไตล์
John Munsch

2
@Sam คุณอาจมีปัญหาอื่น ๆ ที่มาแทนที่เรื่องนี้เช่น CSS, inline style หรือ doctype ที่ไม่ถูกต้อง ฯลฯ มันใช้งานได้จริงมันเป็นวิธีมาตรฐานในการกำหนดรูปแบบคอลัมน์
Sameer Alibhai

ฉันไม่แน่ใจว่านี่เป็น 'HTML5 way' หรือไม่ ปรากฏว่า colgroup / col ใน html5 ใช้สำหรับการทำเครื่องหมายช่วงเท่านั้น MDN ไม่ได้กล่าวถึงการใช้งานคุณลักษณะสไตล์บนแท็ก col (นอกเหนือจากที่สืบทอดมาจากคุณสมบัติทั่วโลก) และพูดถึง bgcolor: "... ใช้คุณสมบัติ CSS ... ในองค์ประกอบ <td> ที่เกี่ยวข้อง" developer.mozilla.org/en-US/docs/Web/HTML/Element/col
Stephen Panzer

5
table-layout: fixed; width: 100%;ทำงานให้ฉันกับรูปแบบตาราง ขอบคุณ!
nrodic

มันไม่ได้จบ - ทั้งหมด / ขั้นสุดท้าย แต่ w3schools ก็ไม่ได้พูดถึงการใช้colสิ่งนี้ มันแสดงให้เห็นการใช้งานของ CSS ที่ใช้กับ<td>(หรือ<th>) - w3schools.com/tags/att_td_width.asp
Don Cheadle

128

เพียงแค่เพิ่ม<div>ในแท็ก<td>หรือกำหนดความกว้างภายใน<th> <div>สิ่งนี้จะช่วยคุณ ไม่มีอะไรทำงาน

เช่น.

<td><div style="width: 50px" >...............</div></td>

2
ฉันรวมโซลูชันนี้เข้ากับการระบุ min-width / max-width สำหรับความกว้างพิกเซลเดียวกันเพื่อความปลอดภัย ในที่สุดมันก็ใช้งานได้ ฉันไม่รู้ว่าทำไมฉันต้องวิ่งรอบพิเศษเหล่านี้เพียงแค่ได้รับการแก้ไขจริงๆมันไร้สาระ ...
Csaba Toth

1
ไม่แน่ใจว่าสิ่งนี้ดีกว่าการตั้งค่า css เดียวกันstyle="width: 50px"บน<td>
Don Cheadle

2
@mmcrae ดีกว่าเพราะใช้งานได้ตั้งค่าความกว้าง<td>ไม่ได้
Madbreaks

66

หากคุณต้องการคอลัมน์ที่มีความกว้างคงที่มากกว่าหนึ่งคอลัมน์ขณะที่คอลัมน์อื่นควรปรับขนาดให้ลองตั้งค่าทั้งสองmin-widthและmax-widthเป็นค่าเดียวกัน


สิ่งนี้ใช้ได้สำหรับฉันเมื่อตั้งความกว้างอย่างชัดเจนด้วยtable-layout: fixed;ไม่ได้
Jordan Mack

อึศักดิ์สิทธิ์! ไม่มีวิธีแก้ปัญหาอื่นที่ใช้งานได้ดีเกินไป มันทำงานได้อย่างสมบูรณ์แบบ! ไม่ต้องมีการหารด้วย!
NeilRoy

29

คุณต้องเขียนสิ่งนี้ภายใน CSS ที่เกี่ยวข้อง

table-layout:fixed;

ตาราง sorround ที่ดีขึ้นพร้อมกับแท็ก div จากนั้นภายใน div ใช้โอเวอร์
โฟลว์

ทำงานสำหรับฉันเมื่อฉันรวมเข้ากับกลุ่มคอลัมน์: <table style = "table-layout: fixed"> <colgroup> <colgroup> <col style = "width: 50%"> <col style = "width: 50%"> </ COLGROUP> <tbody> ... </ tbody> </ table>
Russ Bateman

บทความ Chris Coyer นี้อธิบายได้ดี: css-tricks.com/fixing-tables-long-strings
cssyphus

24

สิ่งที่ฉันทำคือ:

  1. ตั้งค่าความกว้าง td:

    <td width="200" height="50"><!--blaBlaBla Contents here--></td>
  2. ตั้งค่าความกว้าง td ด้วย CSS:

    <td style="width:200px; height:50px;">
  3. ตั้งค่าความกว้างอีกครั้งเป็นสูงสุดและต่ำสุดด้วย CSS:

    <td style="max-width:200px; min-width:200px; max-height:50px; min-height:50px; width:200px; height:50px;">

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

.td_size {    
  width:200px; 
  height:50px;
  max-width:200px;
  min-width:200px; 
  max-height:50px; 
  min-height:50px;
  **overflow:hidden;** /*(Optional)This might be useful for some overflow contents*/   
}

แล้ว:

<td class="td_size">

วาง class class ให้กับสิ่งที่<td>คุณต้องการ


นี่เป็นทางออกเดียวที่ดูเหมือนจะทำงานได้ในทุกกรณีโดยไม่มีข้อ จำกัด เพิ่มเติมที่อาจไม่ต้องการ
Sam

3

ฉันใช้สิ่งนี้

.app_downloads_table tr td:first-child {
    width: 75%;
}

.app_downloads_table tr td:last-child {
    text-align: center;
}

อย่าลืม ntch-child (2) (หรือ 3, 4 และอื่น ๆ )

ตาราง td nth-child (n + 1) {... } จะครอบคลุมทั้งหมดยกเว้นคอลัมน์แรก
Ed Randall

2

หากคุณไม่ต้องการโครงร่างที่คงที่ให้ระบุคลาสสำหรับคอลัมน์ให้มีขนาดที่เหมาะสม

CSS:

.special_column { width: 120px; }

HTML:

<td class="special_column">...</td>

2

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


2

ทำให้คำตอบที่ยอมรับตอบกลับสำหรับหน้าจอขนาดเล็กเมื่อเล็กกว่าความกว้างคงที่

HTML:

<table>
  <tr>
    <th>header 1</th>
    <th>header 234567895678657</th>
  </tr>
  <tr>
    <td>data asdfasdfasdfasdfasdf</td>
    <td>data 2</td>
  </tr>
</table>

CSS

table{
    border: 1px solid black;
    table-layout: fixed;
    max-width: 600px;
    width: 100%;
}

th, td {
    border: 1px solid black;
    overflow: hidden;
    max-width: 300px;
    width: 100%;
}

JS Fiddle

https://jsfiddle.net/w9s3ebzt/



1

KAsun มีความคิดที่ถูกต้อง นี่คือรหัสที่ถูกต้อง ...

<style type="text/css">
  th.first-col > div, 
  td.first-col > div {
    overflow:hidden;
    white-space:nowrap;
    width:100px
  }
</style>

<table>
  <thead><tr><th class="first-col"><div>really long header</div></th></tr></thead>
  <tbody><tr><td class="first-col"><div>really long text</div></td></tr></tbody>
</table>

1

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

HTML

<table>
  <thead>
    <tr>
      <th width="5%"></th>
      <th width="70%"></th>
      <th width="15%"></th>
      <th width="10%"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Some text...</td>
      <td>May 2018</td>
      <td>Edit</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Another text...</td>
      <td>April 2018</td>
      <td>Edit</td>
    </tr>
  </tbody>
</table>

CSS

table {
  width: 600px;
  border-collapse: collapse;
}

td {
  border: 1px solid #999999;
}

ดูผลลัพธ์

หรือใช้colgroupตามคำแนะนำในคำตอบของ Hyathin


0

ฉันใช้ :: หลังจากองค์ประกอบในเซลล์ที่ฉันต้องการตั้งค่าความกว้างน้อยที่สุดโดยไม่คำนึงถึงข้อความปัจจุบันเช่นนี้

.cell::after {
    content: "";
    width: 20px;
    display: block;
}

ฉันไม่จำเป็นต้องตั้งค่าความกว้างบนพาเรนต์ของตารางหรือใช้เลย์เอาต์ของตาราง


-4

ฉันพบว่าคำตอบของ KAsun นั้นทำงานได้ดีขึ้นเมื่อใช้vwแทนpxเช่นนั้น:

<td><div style="width: 10vw" >...............</div></td>

นี่เป็นสไตล์เดียวที่ฉันต้องการเพื่อปรับความกว้างของคอลัมน์


-5

คุณไม่จำเป็นต้องตั้งค่า"fixed"ทั้งหมดที่คุณต้องการคือการตั้งค่าoverflow:hiddenเนื่องจากความกว้างของคอลัมน์ถูกตั้งค่า


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