2013-11-26 113 views
0

假設我有一個表象下面這樣:表列組寬度

|<--      Fixed width       ->| 
|<- group width  ->|<- group width  ->| 
-------------------------------------------------------------------- 
| Label 1 | Input 1 | Label 2 | Input 2 | Filler (auto-expand) | 
| Label 3 | Input 3 | Label 4 | Input 4 |      | 
| Section header (colspan=5)          | 
-------------------------------------------------------------------- 
| Label 5 | Input 5 | Label 6 | Input 6 |      | 
| Label 7 | Input 7 | Label 8 | Input 8 |      | 
-------------------------------------------------------------------- 

如何將樣式它使得每個列組具有固定的寬度,但各組下的各個列自動調整像這樣:

  1. 標籤列調整到以顯示該列文本所需的最小寬度不包裹
  2. 輸入列擴展以填充左爲組寬度減去標籤列寬的空間。

實施例:

|<--      Fixed width       ->| 
|<- group width  ->|<- group width  ->| 
-------------------------------------------------------------------- 
| Label 1 | Input 1 | Label 2 | Input 2 | Filler (auto-expand) | 
| Label 3.. | Input 3 | Label 4 | Input 4 |      | 
| Section header (colspan=5)          | 
-------------------------------------------------------------------- 
| Label 5 | Input 5 | Label 6 | Input 6 |      | 

在上述中,含有標籤1,3和5中的標籤欄已經調整到所有文本所需的最小寬度被示出爲沒有截斷(標籤3的寬度)。同時,相應的輸入列已經調整過,以使組寬保持不變。

我有一個jsfiddle的結構和初始css here

如果需要,可隨意調整結構,但我寧願對其進行微小的更改。我希望這可能只是一個HTML結構的變化和CSS。

我會歡迎jquery解決方案。雖然我還應該提到標籤/輸入行可以動態添加,並且列需要適當調整(所以我不能只在初始文檔加載時設置固定寬度)。

如果這也可以改變,以便不再需要一個表,更好。

+0

不會在每個組中嵌套表做你想要的嗎?然後在父表的列上設置固定寬度 –

+0

它會,除了每隔一段時間我會有部分標題(如上),將跨越整行。這意味着我需要將嵌套表分成兩行(一個在節標題之前,另一個在之後)。如果我這樣做了,我不能保證兩個嵌套表格在定義固定寬度之外的列寬度上是一致的。 –

+0

http://jsfiddle.net/vin_g/Lvy7G/1/顯示此問題。在小提琴中,標籤1和3的寬度是正確的,但在部分標題後面,標籤5的寬度不一樣。 –

回答

1

this你在找什麼?根據您的評論如預期的圖片如果是,請看看下面的代碼

// Assume you want widths 60, 90, 120 widths to each header 

    var widths = [60, 90, 120]; 

    $('table td[colspan]').each(function (i, v) { 
     var th = $(this), 
      width = Math.floor(widths[i]/th.attr('colspan') * 1), 
      indStrt = 0; 
     th.width(widths[i]); 
     th.prevAll().each(function() { 
      var ind = $(this).attr('colspan'); 
      indStrt += ind ? ind * 1 : 1; 
     }); 
     var nextTr = th.closest('tr').next(), 
      tds = nextTr.find('td'); 
     var $siblings = tds.eq(indStrt).nextUntil(tds.eq(indStrt + th.attr('colspan') * 1)).andSelf(); 
     $siblings.each(function() { 
      $(this).width(width); 
     }); 
    });  

按照註釋代碼

var COLUMN_GROUP_WIDTH=100; 
    var TABLE_WIDTH=$("#thetable").width(); 

    // reset width so we can get proper column widths 
    $("#thetable").width("auto"); 

    $('td.label').each(function (e, v) { 
     var labelWidth = $(v).width(); 
     $(v).width(labelWidth); 
     console.log(labelWidth); 
     $(v).next().width(COLUMN_GROUP_WIDTH-labelWidth); 

    }); 

    // so we can check total widths 
    //$(".header").css("display", "table-row"); 

    $("#thetable").width(TABLE_WIDTH); 
+0

標籤列(第1列第3列等)需要爲這些列中的所有文本設置最小寬度以適應。 –

+0

@ Vin-G然後調整標題欄寬度數組的寬度。 – redV

+0

@ Vin-G希望你能學會欣賞那些正在努力解決你的問題的人在這裏的計算器。com – redV

1

使用此demo

.col1{ 
    table-layout: fixed; 
} 
.col2{ 
    table-layout: fixed; 
} 
.col1 td{ 
    width: 200px; 
} 
.col2 td{ 
    width: 200px; 
} 

看到這個updated demo

+0

嗯,標籤列需要最小寬度,同時標籤5並不能正確排列。請參閱http://i.imgur.com/K06idhY.png –

+0

查看答案中的更新演示。 –

+0

嗨C-Link,差不多,但標籤5仍然沒有與標籤1和標籤3相同的寬度(或者是我只看到這個?)。這就是我在迴應西蒙特魯舍拉時提到的問題。如果您認爲需要修改html結構才能使其工作,那麼只要顯示相同的內容(兩個列組,每個子組兩個列,一個跨越所有列的標題行等),就可以隨意這樣做, 。 –