wake-up-neo.net

Tabellenrolle mit HTML und CSS

Ich habe eine solche Tabelle, die ich mit Daten fülle 

<table id="products-table"  style="overflow-y:scroll" >
    <thead>
        <tr>
            <th>Product (Parent Product)</th> 
            <th>Associated Sites</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        @for (int i = 0; i < Model.Count(); i++)
        { 
        <tr>
            <td>
                <a href="Edit"><strong>@Model.ElementAt(i).Name</strong></a><br />
            </td>
            <td>
                <span class="lesser"></span>
            </td>
            <td>@Html.ActionLink("Edit Product", "Edit", "Products")<br />
                @Html.ActionLink("Associate Site", "Associate", "Products")
            </td>
         </tr>
        }
        <tr>
</tbody>
</table>

und CSS so 

    #products-table
{
     width: 200px;
    height: 400px;
    overflow:scroll;
}

aber scrollen funktioniert nicht, ich möchte die höhe der tabelle festlegen und wenn sie die tabelle überschreitet, arbeite mit scrollleiste

51
Mohamed Naguib

Tabelle mit festem Header

<table cellspacing="0" cellpadding="0" border="0" width="325">
<tr>
  <td>
   <table cellspacing="0" cellpadding="1" border="1" width="300" >
     <tr style="color:white;background-color:grey">
        <th>Header 1</th>
        <th>Header 2</th>
     </tr>
   </table>
  </td>
</tr>
<tr>
 <td>
   <div style="width:320px; height:60px; overflow:auto;">
     <table cellspacing="0" cellpadding="1" border="1" width="300" >
       <tr>
         <td>new item</td>
         <td>new item</td>
       </tr>
       <tr>
         <td>new item</td>
         <td>new item</td>
       </tr>
       <tr>
         <td>new item</td>
         <td>new item</td>
       </tr>
       <tr>
         <td>new item</td>
         <td>new item</td>
       </tr>   
     </table>  
   </div>
  </td>
 </tr>
</table>

Ergebnis

Demo Image

Dies funktioniert in allen Browsern 

Demo jsfiddle http://jsfiddle.net/nyCKE/6302/

60
Garry

Späte Antwort, eine andere Idee, aber sehr kurz.

  1. lege den Tisch in den Wrapper div 
  2. füge den Inhalt von Kopfzellen in div ein
  3. fixiere den Header contents, siehe CSS

HTML

<div id="scrolltable">
    <table>
        <tr><th><div>first col</div></th><th><div>second</div></th></tr>
        <tr><td>foo</td><td>bar</td></tr>
        ... many rows ...
    </table>
</div>

CSS

#scrolltable { margin-top: 20px; height: 200px; overflow: auto; }
#scrolltable th div { position: absolute; margin-top: -20px; }

teste die Geige

13
Jan Turoň

Für diejenigen, die sich fragen, wie sie Garrys Lösung mit mehr als einem Header implementieren können, ist dies folgende:

#wrapper {
  width: 235px;
}

table {
  border: 1px solid black;
  width: 100%;
}

th,
td {
  width: 100px;
  border: 1px solid black;
}

thead>tr {
  position: relative;
  display: block;
}

tbody {
  display: block;
  height: 80px;
  overflow: auto;
}
<div id="wrapper">
  <table>
    <thead>
      <tr>
        <th>column1</th>
        <th>column2</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>row1</td>
        <td>row1</td>
      </tr>
      <tr>
        <td>row2</td>
        <td>row2</td>
      </tr>
      <tr>
        <td>row3</td>
        <td>row3</td>
      </tr>
      <tr>
        <td>row4</td>
        <td>row4</td>
      </tr>
    </tbody>
  </table>
</div>

4
patrickdamery

Funktioniert nur in Chrome, kann jedoch an andere moderne Browser angepasst werden. Tabelle fällt zurück auf eine allgemeine Tabelle mit Bildlaufleiste in anderen Browsern.

http://jsfiddle.net/4SUP8/1/

<table border="1px" class="flexy">
    <caption>Lista Sumnjivih vozila:</caption>
    <thead>
        <tr>
            <td>Opis Sumnje</td>
        <td>Registarski<br>broj vozila</td>
        <td>Datum<br>Vreme</td>
        <td>Brzina<br>(km/h)</td>
        <td>Lokacija</td>
        <td>Status</td>
        <td>Akcija</td>
        </tr>
    </thead>
    <tbody>

        <tr>
        <td>Osumnjičen tranzit</td>
        <td>NS182TP</td>
        <td>23-03-2014 20:48:08</td>
        <td>11.3</td>
        <td>Raskrsnica kod pumpe<br></td>
        <td></td>
        <td>Prikaz</td>
        </tr>
        <tr>

        <tr>
        <td>Osumnjičen tranzit</td>
        <td>NS182TP</td>
        <td>23-03-2014 20:48:08</td>
        <td>11.3</td>
        <td>Raskrsnica kod pumpe<br></td>
        <td></td>
        <td>Prikaz</td>
        </tr>
        <tr>

        <tr>
        <td>Osumnjičen tranzit</td>
        <td>NS182TP</td>
        <td>23-03-2014 20:48:08</td>
        <td>11.3</td>
        <td>Raskrsnica kod pumpe<br></td>
        <td></td>
        <td>Prikaz</td>
        </tr>
        <tr>


        <tr>
        <td>Osumnjičen tranzit</td>
        <td>NS182TP</td>
        <td>23-03-2014 20:48:08</td>
        <td>11.3</td>
        <td>Raskrsnica kod pumpe<br></td>
        <td></td>
        <td>Prikaz</td>
        </tr>

    </tbody>
</table>

Stil (CSS 3):

caption {
    display: block;
    line-height: 3em;
    width: 100%;
    -webkit-align-items: stretch;
    border: 1px solid #eee;
}

       .flexy {
            display: block;
            width: 90%;
            border: 1px solid #eee;
            max-height: 320px;
            overflow: auto;
        }

        .flexy thead {
            display: -webkit-flex;
            -webkit-flex-flow: row;
        }

        .flexy thead tr {
            padding-right: 15px;
            display: -webkit-flex;
            width: 100%;
            -webkit-align-items: stretch;
        }

        .flexy tbody {
            display: -webkit-flex;
            height: 100px;
            overflow: auto;
            -webkit-flex-flow: row wrap;
        }
        .flexy tbody tr{
            display: -webkit-flex;
            width: 100%;
        }

        .flexy tr td {
            width: 15%;
        }
4
Gawran

Diese Arbeit für mich

Demo: jsfiddle

$(function() 
{
    Fixed_Header();
});

function Fixed_Header()
{
    $('.User_Table thead').css({'position': 'absolute'});
    $('.User_Table tbody tr:eq("2") td').each(function(index,e){
        $('.User_Table thead tr th:eq("'+index+'")').css({'width' : $(this).outerWidth() +"px" });
    });
    var Header_Height = $('.User_Table thead').outerHeight();
    $('.User_Table thead').css({'margin-top' : "-"+Header_Height+"px"});
    $('.User_Table').css({'margin-top' : Header_Height+"px"});
}
1
<div style="overflow:auto">
    <table id="table2"></table>
</div>

Verwenden Sie diesen Code für eine ÜberlauftabelleIt funktioniert nur für das div-Tag 

0
Thinesh Thinesh

Fügt einem überfließenden HTML-Tabellenelement einen verblassenden Farbverlauf hinzu, um besser anzuzeigen, dass mehr Inhalt gescrollt werden muss.

  • Tabelle mit festem Kopf
  • Überlauf Scrollgradient
  • Benutzerdefinierte Bildlaufleiste

Sehen Sie sich das Live-Beispiel unten an:

$("#scrolltable").html("<table id='cell'><tbody></tbody></table>");
$("#cell").append("<thead><tr><th><div>First col</div></th><th><div>Second col</div></th></tr></thead>");

for (var i = 0; i < 40; i++) {
  $("#scrolltable > table > tbody").append("<tr><td>" + "foo" + "</td><td>" + "bar" + "</td></tr>");
}
/* Table with fixed header */

table,
thead {
  width: 100%;
  text-align: left;
}

#scrolltable {
  margin-top: 50px;
  height: 120px;
  overflow: auto;
  width: 200px;
}

#scrolltable table {
  border-collapse: collapse;
}

#scrolltable tr:nth-child(even) {
  background: #EEE;
}

#scrolltable th div {
  position: absolute;
  margin-top: -30px;
}


/* Custom scrollbar */

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  border-radius: 10px;
}

::-webkit-scrollbar-thumb {
  border-radius: 10px;
  box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
}


/* Overflow scroll gradient */

.overflow-scroll-gradient {
  position: relative;
}

.overflow-scroll-gradient::after {
  content: '';
  position: absolute;
  bottom: 0;
  width: 240px;
  height: 25px;
  background: linear-gradient( rgba(255, 255, 255, 0.001), white);
  pointer-events: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="overflow-scroll-gradient">
  <div id="scrolltable">
  </div>
</div>

0
Yi-Ting Liu

Für was auch immer es sich lohnt: Hier ist noch eine andere Lösung: 

  • erstellen Sie zwei Divs innerhalb eines display: inline-block
  • im ersten div eine Tabelle nur mit dem Header (Header-Tabelle tabhead)
  • im 2. Div eine Tabelle mit Header und Daten einfügen (Datentabelle/vollständige Tabelle tabfull)
  • verwenden Sie JavaScript und verwenden Sie setTimeout(() => {/*...*/}), um Code nach dem Rendern auszuführen/nachdem Sie die Tabelle mit Ergebnissen aus fetch gefüllt haben.
  • messen Sie die Breite jedes Th in der Datentabelle (mit clientWidth
  • wenden Sie dieselbe Breite auf das Gegenstück in der Kopftabelle an
  • legen Sie die Sichtbarkeit des Headers der Datentabelle auf ausgeblendet fest, und legen Sie den oberen Rand auf -1 * Höhe der Datentabelle mit den Pixeln fest

Mit ein paar Änderungen ist dies die Methode, die verwendet werden soll (zur Vereinfachung/Einfachheit habe ich d3js verwendet, die gleichen Operationen können mit einfachem DOM ausgeführt werden): 

setTimeout(() => { // pass one cycle
  d3.select('#tabfull')
    .style('margin-top', (-1 * d3.select('#tabscroll').select('thead').node().getBoundingClientRect().height) + 'px')
    .select('thead')
      .style('visibility', 'hidden');
  let widths=[]; // really rely on COMPUTED values
  d3.select('#tabfull').select('thead').selectAll('th')
    .each((n, i, nd) => widths.Push(nd[i].clientWidth));
  d3.select('#tabhead').select('thead').selectAll('th')
    .each((n, i, nd) => d3.select(nd[i])
          .style('padding-right', 0)
          .style('padding-left', 0)
          .style('width', widths[i]+'px'));
})

Das Warten auf den Render-Zyklus hat den Vorteil, dass die Browser-Layout-Engine während des gesamten Prozesses verwendet wird - für jede Art von Header. Es ist nicht an bestimmte Bedingungen oder Längen von Zelleninhalten gebunden, die sich irgendwie ähneln. Es passt auch korrekt für sichtbare Bildlaufleisten (wie unter Windows)

Ich habe hier ein Codepen mit einem vollständigen Beispiel erstellt: https://codepen.io/sebredhh/pen/QmJvKy