How do I create an HTML table with a fixed/frozen left column and a scrollable body?

后端 未结 25 1535
有刺的猬
有刺的猬 2020-11-21 22:27

I need a simple solution. I know it\'s similar to some other questions, like:

  • HTML table with fixed headers and a fixed column?
  • How can I lock the fir
25条回答
  •  甜味超标
    2020-11-21 23:29

    I didn't check each and every answer for this question, but after analyzing most of them I found that design fails in case of multiline data in cells or head. I used Javascript to solve this. I hope someone finds this helpful.

    https://codepen.io/kushagrarora/pen/zeYaoY

    var freezeTables = document.getElementsByClassName("freeze-pane");
    
    [].forEach.call(freezeTables, ftable => {
      var wrapper = document.createElement("div");
      wrapper.className = "freeze-pane-wrapper";
      var scroll = document.createElement("div");
      scroll.className = "freeze-pane-scroll";
    
      wrapper.appendChild(scroll);
    
      ftable.parentNode.replaceChild(wrapper, ftable);
    
      scroll.appendChild(ftable);
    
      var heads = ftable.querySelectorAll("th:first-child");
    
      let maxWidth = 0;
    
      [].forEach.call(heads, head => {
        var w = window
          .getComputedStyle(head)
          .getPropertyValue("width")
          .split("px")[0];
        if (Number(w) > Number(maxWidth)) maxWidth = w;
      });
    
      ftable.parentElement.style.marginLeft = maxWidth + "px";
      ftable.parentElement.style.width = "calc(100% - " + maxWidth + "px)";
      [].forEach.call(heads, head => {
        head.style.width = maxWidth + "px";
        var restRowHeight = window
          .getComputedStyle(head.nextElementSibling)
          .getPropertyValue("height");
        var headHeight = window.getComputedStyle(head).getPropertyValue("height");
        if (headHeight > restRowHeight)
          head.nextElementSibling.style.height = headHeight;
        else head.style.height = restRowHeight;
      });
    });
    @import url("https://fonts.googleapis.com/css?family=Open+Sans");
    * {
      font-family: "Open Sans", sans-serif;
    }
    
    .container {
      width: 400px;
      height: 90vh;
      border: 1px solid black;
      overflow: hidden;
    }
    
    table,
    th,
    td {
      border: 1px solid #eee;
    }
    
    .table {
      width: 100%;
      margin-bottom: 1rem;
      table-layout: fixed;
      border-collapse: collapse;
    }
    
    .freeze-pane-wrapper {
      position: relative;
    }
    
    .freeze-pane-scroll {
      overflow-x: scroll;
      overflow-y: visible;
    }
    
    .freeze-pane th:first-child {
      position: absolute;
      background-color: pink;
      left: 0;
      top: auto;
      max-width: 40%;
    }

    Model

    Mercedes Benz AMG C43 4dr

    Audi S4 Premium 4dr

    BMW 440i 4dr sedan

    Passenger capacity

    5

    5

    5

    Front (Head/Shoulder/Leg) (In.)

    37.1/55.3/41.7

    38.9/55.9/41.3

    39.9/54.8/42.2

    Second (Head/Shoulder/Leg) (In.)

    37.1/55.5/35.2

    37.4/54.5/35.7

    36.9/54.3/33.7

    Note: the "container" div is just to demonstrate that code is compatible with mobile-view.

提交回复
热议问题