2013-07-24 21 views
16

Chcę, aby nagłówek mojego stołu został naprawiony. Stolik znajduje się wewnątrz przewijanego elementu div. Poniżej znajduje się mój kod.Jak zrobić stały nagłówek tabeli wewnątrz scrollable div?

<div id="table-wrapper"> 
    <div id="table-scroll"> 
     <table bgcolor="white" border="0" cellpadding="0" cellspacing="0" id="header-fixed" width="100%" overflow="scroll" class="scrollTable"> 
      <thead> 
       <tr> 
        <th>Order ID</th> 
        <th>Order Date</th> 
        <th>Status</th> 
        <th>Vol Number</th> 
        <th>Bonus Paid</th> 
        <th>Reason for no Bonus</th> 
       </tr> 
      </thead> 
      <tbody> 
       <tr> 
        <td><%=snd.getOrderId()%></td> 
        <td><%=snd.getDateCaptured()%></td> 
        <td><%=snd.getOrderStatus()%></td> 
        <td>Data Not Available</td> 
        <td>Data Not Available</td> 
        <td>Data Not Available</td> 
       </tr> 
      </tbody> 
     </table> 
    </div> 
</div> 

Poniżej jest mój CSS, który używam w powyższym Gr:

#table-wrapper { 
    position:relative; 
} 

#table-scroll { 
    height:250px; 
    overflow:auto; 
    margin-top:20px; 
} 

#table-wrapper table { 
    width:100%; 
} 

#table-wrapper table * { 
    background:white; 
    color:black; 
} 

#table-wrapper table thead th .text { 
    position:absolute; 
    top:-20px; 
    z-index:2; 
    height:20px; 
    width:35%; 
    border:1px solid red; 
} 
+0

Co masz na myśli przez „make nagłówek mój stół naprawiony "? Czy mimo przewijania w dół ma być zawsze widoczny? – Mario

+0

@Mario dokładnie górny rząd tabeli powinien być zawsze widoczny – Rohan

+0

Właśnie dodałem odpowiedź na podobne pytanie, które może pomóc http://stackoverflow.com/questions/31433833/fix-table-header-at-top-of-scrollable- div/31434590 # 31434590 –

Odpowiedz

29

Jak o zrobieniu czegoś takiego? Zrobiłem to od zera ...

Co zrobiłem to 2 tabele, jedna dla nagłówka, która będzie zawsze statyczna, a druga tabela renderuje komórki, które owinąłem przy użyciu elementu div o stałej wysokości, oraz umożliwienie zwój, używam overflow-y: auto;

również upewnić się użyć o stałej szerokości td elementy tak, że table nie pęka, gdy stosuje się ciąg bez white space, więc inorder przerwać ten ciąg Używam word-wrap: break-word;

Demo

.wrap { 
    width: 352px; 
} 

.wrap table { 
    width: 300px; 
    table-layout: fixed; 
} 

table tr td { 
    padding: 5px; 
    border: 1px solid #eee; 
    width: 100px; 
    word-wrap: break-word; 
} 

table.head tr td { 
    background: #eee; 
} 

.inner_table { 
    height: 100px; 
    overflow-y: auto; 
} 

<div class="wrap"> 
    <table class="head"> 
     <tr> 
      <td>Head 1</td> 
      <td>Head 1</td> 
      <td>Head 1</td> 
     </tr> 
    </table> 
    <div class="inner_table"> 
     <table> 
     <tr> 
      <td>Body 1</td> 
      <td>Body 1</td> 
      <td>Body 1</td> 
     </tr> 
     <!-- Some more tr's --> 
    </table> 
    </div> 
</div> 
+0

cześć .. to nie działa, jeśli kolumny mówią 40 kolumn .. i trzeba przewijać od prawej i lewej .. jak również góra i dół ... nagłówek kolumny musi być naprawiony i to też w przewijanym div. każdy ma rozwiązanie ... zobacz pełne ogłoszenie tutaj: http://stackoverflow.com/questions/22093319/large-html-table-with-fixed-header-inside-scrollable-div-how – ihightower

+4

Umieściłeś statyczne szerokości w kolumnach tabeli, co stanowi niemal najlepszy punkt używania tabel do wyświetlania treści w pierwszej kolejności. To wcale nie jest rozwiązanie. Po co zawracać sobie głowę stołem, jeśli masz tylko ustalone szerokości? Dlaczego po prostu nie używać divs? – RavenHursT

+5

@RavenHursT, ponieważ element '

' jest doskonały dla danych tabelarycznych, co wydaje się mieć PO. – mikedidthis

0

ten kod działa tworzą mnie. Dołącz plik jquery.js.

<!DOCTYPE html> 
<html> 

<head> 
<script src="jquery.js"></script> 
<script> 
var headerDivWidth=0; 
var contentDivWidth=0; 
function fixHeader(){ 

var contentDivId = "contentDiv"; 
var headerDivId = "headerDiv"; 

var header = document.createElement('table'); 
var headerRow = document.getElementById('tableColumnHeadings'); 

/*Start : Place header table inside <DIV> and place this <DIV> before content table*/ 
var headerDiv = "<div id='"+headerDivId+"' style='width:500px;overflow-x:hidden;overflow-y:scroll' class='tableColumnHeadings'><table></table></div>"; 
$(headerRow).wrap(headerDiv); 
$("#"+headerDivId).insertBefore("#"+contentDivId); 
/*End : Place header table inside <DIV> and place this <DIV> before content table*/ 

fixColumnWidths(headerDivId,contentDivId); 
} 
function fixColumnWidths(headerDivId,contentDivId){ 
/*Start : Place header row cell and content table first row cell inside <DIV>*/ 
      var contentFirstRowCells = $('#'+contentDivId+' table tr:first-child td'); 
      for (k = 0; k < contentFirstRowCells.length; k++) { 
       $(contentFirstRowCells[k]).wrapInner("<div ></div>"); 
      } 
      var headerFirstRowCells = $('#'+headerDivId+' table tr:first-child td'); 
      for (k = 0; k < headerFirstRowCells.length; k++) { 
       $(headerFirstRowCells[k]).wrapInner("<div></div>"); 
      } 
/*End : Place header row cell and content table first row cell inside <DIV>*/ 

/*Start : Fix width for columns of header cells and content first ror cells*/ 
      var headerColumns = $('#'+headerDivId+' table tr:first-child td div:first-child'); 
      var contentColumns = $('#'+contentDivId+' table tr:first-child td div:first-child'); 
      for (i = 0; i < contentColumns.length; i++) { 
       if (i == contentColumns.length - 1) { 
        contentCellWidth = contentColumns[i].offsetWidth; 
       } 
       else { 
        contentCellWidth = contentColumns[i].offsetWidth; 
       } 
       headerCellWidth = headerColumns[i].offsetWidth; 
       if(contentCellWidth>headerCellWidth){ 
       $(headerColumns[i]).css('width', contentCellWidth+"px"); 
       $(contentColumns[i]).css('width', contentCellWidth+"px"); 
       }else{ 
       $(headerColumns[i]).css('width', headerCellWidth+"px"); 
       $(contentColumns[i]).css('width', headerCellWidth+"px"); 
       } 
      } 
/*End : Fix width for columns of header and columns of content table first row*/ 
} 

    function OnScrollDiv(Scrollablediv) { 
    document.getElementById('headerDiv').scrollLeft = Scrollablediv.scrollLeft; 
    } 
function radioCount(){ 
    alert(document.form.elements.length); 

} 
</script> 
<style> 
table,th,td 
{ 
border:1px solid black; 
border-collapse:collapse; 
} 
th,td 
{ 
padding:5px; 
} 
</style> 

</head> 

<body onload="fixHeader();"> 
<form id="form" name="form"> 
<div id="contentDiv" style="width:500px;height:100px;overflow:auto;" onscroll="OnScrollDiv(this)"> 
<table> 
<!--tr id="tableColumnHeadings" class="tableColumnHeadings"> 
    <td><div>Firstname</div></td> 
    <td><div>Lastname</div></td>  
    <td><div>Points</div></td> 
    </tr> 

<tr> 
    <td><div>Jillsddddddddddddddddddddddddddd</div></td> 
    <td><div>Smith</div></td>  
    <td><div>50</div></td> 
    </tr--> 

    <tr id="tableColumnHeadings" class="tableColumnHeadings"> 
    <td>&nbsp;</td> 

    <td>Firstname</td> 
    <td>Lastname</td>  
    <td>Points</td> 
    </tr> 

<tr style="height:0px"> 
<td></td> 
    <td></td> 
    <td></td>  
    <td></td> 
    </tr> 

<tr > 
<td><input type="radio" id="SELECTED_ID" name="SELECTED_ID" onclick="javascript:radioCount();"/></td> 
    <td>Jillsddddddddddddddddddddddddddd</td> 
    <td>Smith</td>   
    <td>50</td> 
    </tr> 

<tr> 
<td><input type="radio" id="SELECTED_ID" name="SELECTED_ID"/></td> 

    <td>Eve</td> 
    <td>Jackson</td>  
    <td>9400000000000000000000000000000</td> 
</tr> 
<tr> 
<td><input type="radio" id="SELECTED_ID" name="SELECTED_ID"/></td> 

    <td>John</td> 
    <td>Doe</td>  
    <td>80</td> 
</tr> 
<tr> 
<td><input type="radio" id="SELECTED_ID" name="SELECTED_ID"/></td> 

    <td><div>Jillsddddddddddddddddddddddddddd</div></td> 
    <td><div>Smith</div></td>  
    <td><div>50</div></td> 
    </tr> 
<tr> 
<td><input type="radio" id="SELECTED_ID" name="SELECTED_ID"/></td> 

    <td>Eve</td> 
    <td>Jackson</td>  
    <td>9400000000000000000000000000000</td> 
</tr> 
<tr> 
<td><input type="radio" id="SELECTED_ID" name="SELECTED_ID"/></td> 

    <td>John</td> 
    <td>Doe</td>  
    <td>80</td> 
</tr> 
</table> 
</div> 

</form> 
</body> 

</html> 
3

Myślę, że potrzebujesz czegoś takiego?

Like this http://s13.postimage.org/rv6jqaxvr/tabel_fixed_header.jpg

..... 
<style> 
.table{width: 500px;height: 200px;border-collapse:collapse;} 
.table-wrap{max-height: 200px;width:100%;overflow-y:auto;overflow-x:hidden;} 
.table-dalam{height:300px;width:500px;border-collapse:collapse;} 
.td-nya{border-left:1px solid white;border-right:1px solid grey;border-bottom:1px solid grey;} 

</style> 

<table class="table"> 
<thead> 
    <tr> 
    <th>Judul1</th> 
    <th>Judul2</th> 
    <th>Judul3</th> 
    <th>Judul4</th> 
    </tr> 
</thead> 
<tbody> 
    <tr> 
     <td colspan="4"> 
     <div class="table-wrap" > 
     <table class="table-dalam"> 
     <tbody> 
      <?php foreach(range(1,10) as $i): ?> 
       <tr > 
        <td class="td-nya">td1 </td> 
        <td class="td-nya">td2</td> 
        <td class="td-nya">td2</td> 
        <td class="td-nya">td2</td> 
       </tr> 
      <?php endforeach;?> 
     </tbody> 
     </table> 
    </div> 
    </td> 
</tr> 
    </tbody> 
</table> 

Source

+2

Wydaje się to działać dobrze dla kolumn o stałej szerokości. Jeśli szerokość kolumn nagłówka zależy od danych w nich zawartych, to rozwiązanie nie działa zbyt dobrze. Nadal +1 za pomysł. – BrianLegg

4

Niektóre z tych odpowiedzi wydaje się niepotrzebnie skomplikowane. Zrób swój tbody:

display: block; height: 300px; overflow-y: auto 

Następnie ręcznie ustaw szerokość każdej kolumny tak, aby kolumny thead i tbody miały taką samą szerokość. Ustawienie stylu tabeli = "table-layout: fixed" może również być konieczne.

+6

To zepsułoby szerokość kolumn tabeli. –

0

użyć do tego celu StickyTableHeaders.js.

Nagłówek był przezroczysty. więc spróbuj dodać to css.

thead { 
    border-top: none; 
    border-bottom: none; 
    background-color: #FFF; 
} 
1

Musiałem to samo i to rozwiązanie działało najbardziej prosty i bezpośredni sposób:

http://www.farinspace.com/jquery-scrollable-table-plugin/

prostu dać id do tabeli chcę, aby przewinąć i umieścić jedną linię w JavaScript. To jest to!

Przy okazji, najpierw pomyślałem, że chcę użyć przewijanego div, ale to wcale nie jest konieczne. Możesz użyć elementu div i umieścić go w nim, ale to rozwiązanie robi dokładnie to, czego potrzebujemy: przewija tabelę.

1

To jest moje rozwiązanie "kule" przy użyciu html i css. Kiedyś 2 tabel i stałej szerokości tabel i tabela cell`s

https://jsfiddle.net/babaikawow/s2xyct24/1/

HTML:

<div class="container"> 
<table class="table" border = 1; > <!-- fixed width header --> 
          <thead > 
           <tr> 
            <th class="tbDataId" >№</th> 
            <th class="tbDataName">Працівник</th> 
            <th class="tbDataData">Дата</th> 
            <th class="tbDataData">Дійсно до</th> 
            <th class="tbDataDiseases">Критерій1</th> 
            <th class="tbDataDiseases">Критерій2</th> 
            <th class="tbDataDiseases">Критерій3</th> 
            <th class="tbDataDiseases">Критерій4</th> 
            <th class="tbDataDiseases">Критерій5</th> 
           </tr> 
          </thead> 
         </table> 

         <div class="scrollTable"> <!-- scrolling block --> 
          <table class="table" border = 1;> 
           <tbody> 
        <tr> 
         <td class="tbDataId" >№</td> 
            <td class="tbDataName">Працівник</td> 
            <td class="tbDataData">Дата</td> 
            <td class="tbDataData">Дійсно до</td> 
            <td class="tbDataDiseases">Критерій1</td> 
            <td class="tbDataDiseases">Критерій2</td> 
            <td class="tbDataDiseases">Критерій3</td> 
            <td class="tbDataDiseases">Критерій4</td> 
            <td class="tbDataDiseases">Критерій5</td> 
        </tr> 
        <tr> 
         <td class="tbDataId" >№</td> 
            <td class="tbDataName">Працівник</td> 
            <td class="tbDataData">Дата</td> 
            <td class="tbDataData">Дійсно до</td> 
            <td class="tbDataDiseases">Критерій1</td> 
            <td class="tbDataDiseases">Критерій2</td> 
            <td class="tbDataDiseases">Критерій3</td> 
            <td class="tbDataDiseases">Критерій4</td> 
            <td class="tbDataDiseases">Критерій5</td> 
        </tr> 
        <tr> 
         <td class="tbDataId" >№</td> 
            <td class="tbDataName">Працівник</td> 
            <td class="tbDataData">Дата</td> 
            <td class="tbDataData">Дійсно до</td> 
            <td class="tbDataDiseases">Критерій1</td> 
            <td class="tbDataDiseases">Критерій2</td> 
            <td class="tbDataDiseases">Критерій3</td> 
            <td class="tbDataDiseases">Критерій4</td> 
            <td class="tbDataDiseases">Критерій5</td> 
        </tr> 
        <tr> 
         <td class="tbDataId" >№</td> 
            <td class="tbDataName">Працівник</td> 
            <td class="tbDataData">Дата</td> 
            <td class="tbDataData">Дійсно до</td> 
            <td class="tbDataDiseases">Критерій1</td> 
            <td class="tbDataDiseases">Критерій2</td> 
            <td class="tbDataDiseases">Критерій3</td> 
            <td class="tbDataDiseases">Критерій4</td> 
            <td class="tbDataDiseases">Критерій5</td> 
        </tr> 
        <tr> 
         <td class="tbDataId" >№</td> 
            <td class="tbDataName">Працівник</td> 
            <td class="tbDataData">Дата</td> 
            <td class="tbDataData">Дійсно до</td> 
            <td class="tbDataDiseases">Критерій1</td> 
            <td class="tbDataDiseases">Критерій2</td> 
            <td class="tbDataDiseases">Критерій3</td> 
            <td class="tbDataDiseases">Критерій4</td> 
            <td class="tbDataDiseases">Критерій5</td> 
        </tr> 
           </tbody> 
          </table> 
         </div> 
</div> 

CSS:

*{ 
    box-sizing: border-box; 
} 

.container{ 
width:1000px; 
} 
.scrollTable{ 

    overflow: scroll; 
    overflow-x: hidden; 
    height: 100px; 
} 
table{ 
margin: 0px!important; 
width:983px!important; 
border-collapse: collapse; 

} 

/* Styles of the th and td */ 

/* Id */ 
.tbDataId{ 
    width:5%; 
} 

/* Дата, 
Дійсно до */ 
.tbDataData{ 
    /*width:170px;*/ 
    width: 15%; 
} 

/* П І Б */ 
.tbDataName{ 
    width: 15%; 
} 

/*Критерії */ 
.tbDataDiseases{ 
    width:10%; 
} 
Powiązane problemy