最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

html - How to apply overflow: auto and width="100%" to table? - Stack Overflow

programmeradmin1浏览0评论

Case 1. Table display: table.

table {
  display: table;
  width: 100%;
  overflow: auto;
  border-collapse: collapse;
}
tr,
td {
  border: 1px solid black;
  padding: 8px;
  text-align: left;
  white-space: nowrap
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Table Overflow Example</title>
</head>

<body>

  <p>Table 1</p>
  <table>
    <tbody>
      <tr>
        <td>row 1 - column 1</td>
        <td>row 1 - column 2</td>
      </tr>
      <tr>
        <td>row 2 - column 1</td>
        <td>row 2 - column 2</td>
      </tr>
    </tbody>
  </table>

  <p>Table 2</p>
    <table>
      <tbody>
        <tr>
          <td>row 1 - column 1</td>
          <td>row 1 - column 2</td>
          <td>row 1 - column 3</td>
          <td>row 1 - column 4</td>
          <td>row 1 - column 5</td>
          <td>row 1 - column 6</td>
          <td>row 1 - column 7</td>
          <td>row 1 - column 8</td>
          <td>row 1 - column 9</td>
          <td>row 1 - column 10</td>
        </tr>
        <tr>
          <td>row 2 - column 1</td>
          <td>row 2 - column 2</td>
          <td>row 2 - column 3</td>
          <td>row 2 - column 4</td>
          <td>row 2 - column 5</td>
          <td>row 2 - column 6</td>
          <td>row 2 - column 7</td>
          <td>row 2 - column 8</td>
          <td>row 2 - column 9</td>
          <td>row 2 - column 10</td>
        </tr>
      </tbody>
    </table>

</body>

</html>

Case 1. Table display: table.

table {
  display: table;
  width: 100%;
  overflow: auto;
  border-collapse: collapse;
}
tr,
td {
  border: 1px solid black;
  padding: 8px;
  text-align: left;
  white-space: nowrap
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Table Overflow Example</title>
</head>

<body>

  <p>Table 1</p>
  <table>
    <tbody>
      <tr>
        <td>row 1 - column 1</td>
        <td>row 1 - column 2</td>
      </tr>
      <tr>
        <td>row 2 - column 1</td>
        <td>row 2 - column 2</td>
      </tr>
    </tbody>
  </table>

  <p>Table 2</p>
    <table>
      <tbody>
        <tr>
          <td>row 1 - column 1</td>
          <td>row 1 - column 2</td>
          <td>row 1 - column 3</td>
          <td>row 1 - column 4</td>
          <td>row 1 - column 5</td>
          <td>row 1 - column 6</td>
          <td>row 1 - column 7</td>
          <td>row 1 - column 8</td>
          <td>row 1 - column 9</td>
          <td>row 1 - column 10</td>
        </tr>
        <tr>
          <td>row 2 - column 1</td>
          <td>row 2 - column 2</td>
          <td>row 2 - column 3</td>
          <td>row 2 - column 4</td>
          <td>row 2 - column 5</td>
          <td>row 2 - column 6</td>
          <td>row 2 - column 7</td>
          <td>row 2 - column 8</td>
          <td>row 2 - column 9</td>
          <td>row 2 - column 10</td>
        </tr>
      </tbody>
    </table>

</body>

</html>

Result: Table 1 is as wide as the entire container but Table 2 overflows the container.

Case 2. Table display: block.

table {
  display: block;
  width: 100%;
  overflow: auto;
  border-collapse: collapse;
}
tr,
td {
  border: 1px solid black;
  padding: 8px;
  text-align: left;
  white-space: nowrap
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Table Overflow Example</title>
</head>

<body>

  <p>Table 1</p>
  <table>
    <tbody>
      <tr>
        <td>row 1 - column 1</td>
        <td>row 1 - column 2</td>
      </tr>
      <tr>
        <td>row 2 - column 1</td>
        <td>row 2 - column 2</td>
      </tr>
    </tbody>
  </table>

  <p>Table 2</p>
    <table>
      <tbody>
        <tr>
          <td>row 1 - column 1</td>
          <td>row 1 - column 2</td>
          <td>row 1 - column 3</td>
          <td>row 1 - column 4</td>
          <td>row 1 - column 5</td>
          <td>row 1 - column 6</td>
          <td>row 1 - column 7</td>
          <td>row 1 - column 8</td>
          <td>row 1 - column 9</td>
          <td>row 1 - column 10</td>
        </tr>
        <tr>
          <td>row 2 - column 1</td>
          <td>row 2 - column 2</td>
          <td>row 2 - column 3</td>
          <td>row 2 - column 4</td>
          <td>row 2 - column 5</td>
          <td>row 2 - column 6</td>
          <td>row 2 - column 7</td>
          <td>row 2 - column 8</td>
          <td>row 2 - column 9</td>
          <td>row 2 - column 10</td>
        </tr>
      </tbody>
    </table>

</body>

</html>

Result: Table 2 shows horizontal slider but Table 1 is minimized

As far as I know overflow only works with display: block, but display: block makes width="100%" work incorrectly. How to make Table 1 always have the width of the entire container (like case 1) and Table 2 always have a slider (like case 2)? Thanks!

Share Improve this question edited Mar 24 at 8:10 Khiêm Trần Đăng asked Mar 19 at 7:49 Khiêm Trần ĐăngKhiêm Trần Đăng 11 bronze badge 2
  • 2 Messing with the display type of a table is usually not a good idea (because it makes it lose its basic "table behavior".) Assuming the HTML is not set in stone, you should wrap the tables into a div container, and apply overflow to that. – C3roe Commented Mar 19 at 8:01
  • Thanks for your reply. I am using Shopify, my store currently has tens of thousands of products with descriptions containing spreadsheets (and they keep increasing day by day), so i cant edit the html code for each one, i want to use css or javascript to solve it. – Khiêm Trần Đăng Commented Mar 22 at 12:16
Add a comment  | 

3 Answers 3

Reset to default 1

Wrap second table with div of width 100% and overflow: auto. Added border styles for visualization. It's better to avoid changing the table behaviour by display: block; but work with wrappers is a good idea.

.outer {
  height: 500px;
  width: 300px;
  border: red 1px dashed;
  overflow: hidden;
}

.container-2 {
  overflow: auto;
}

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

tr,
td {
  border: 1px solid black;
}
<div class="outer">



  <p>Table 1</p>
  <table width="100%">
    <tbody>
      <tr>
        <td>
          <p>row 1 - colum 1</p>
        </td>
        <td>
          <p>row 1 - colum 2</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>row 2 - colum 1</p>
        </td>
        <td>
          <p>row 2 - colum 2</p>
        </td>
      </tr>
    </tbody>
  </table>
  <p>Table 2</p>
  <div class="container-2">
    <table class"table2">
      <tbody>
        <tr>
          <td>
            <p>row 1 - colum 1</p>
          </td>
          <td>
            <p>row 1 - colum 2</p>
          </td>
          <td>
            <p>row 1 - colum 3</p>
          </td>
          <td>
            <p>row 1 - colum 4</p>
          </td>
          <td>
            <p>row 1 - colum 5</p>
          </td>
          <td>
            <p>row 1 - colum 6</p>
          </td>
          <td>
            <p>row 1 - colum 6</p>
          </td>
          <td>
            <p>row 1 - colum 7</p>
          </td>
        </tr>
        <tr>
          <td>
            <p>row 2 - colum 1</p>
          </td>
          <td>
            <p>row 2 - colum 2</p>
          </td>
          <td>
            <p>row 2 - colum 3</p>
          </td>
          <td>
            <p>row 2 - colum 4</p>
          </td>
          <td>
            <p>row 2 - colum 5</p>
          </td>
          <td>
            <p>row 2 - colum 6</p>
          </td>
          <td>
            <p>row 2 - colum 6</p>
          </td>
          <td>
            <p>row 2 - colum 7</p>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

</div>

Wrap only Table 2 inside a div with overflow: auto;, while keeping display: table; for both tables.

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Table Overflow Example</title>
  <style>
    table {
      width: 100%;
      border-collapse: collapse;
    }

    th,
    td {
      border: 1px solid black;
      padding: 8px;
      text-align: left;
    }

    /* Wrap Table 2 inside a div with overflow */
    .table-container {
      width: 100%;
      overflow: auto;
      /* Enables horizontal scrolling if needed */
    }
  </style>
</head>

<body>

  <p>Table 1</p>
  <table>
    <tbody>
      <tr>
        <td>row 1 - column 1</td>
        <td>row 1 - column 2</td>
      </tr>
      <tr>
        <td>row 2 - column 1</td>
        <td>row 2 - column 2</td>
      </tr>
    </tbody>
  </table>

  <p>Table 2</p>
  <div class="table-container">
    <table>
      <tbody>
        <tr>
          <td>row 1 - column 1</td>
          <td>row 1 - column 2</td>
          <td>row 1 - column 3</td>
          <td>row 1 - column 4</td>
          <td>row 1 - column 5</td>
          <td>row 1 - column 6</td>
          <td>row 1 - column 7</td>
        </tr>
        <tr>
          <td>row 2 - column 1</td>
          <td>row 2 - column 2</td>
          <td>row 2 - column 3</td>
          <td>row 2 - column 4</td>
          <td>row 2 - column 5</td>
          <td>row 2 - column 6</td>
          <td>row 2 - column 7</td>
        </tr>
      </tbody>
    </table>
  </div>

</body>

</html>

  1. Table 1 is unaffected and remains full-width.
  2. Table 2 gets a horizontal scrollbar if it overflows.
  3. No need to use display: block;, which would break width: 100%.

I solved the problem with a simple javascript code to automatically wrap the table tag in a div tag.

document.addEventListener("DOMContentLoaded", () => {
  const tables = document.querySelectorAll("table");

  tables.forEach((table) => {
    const wrapper = document.createElement("div");
    wrapper.className = "table-wrapper";
    table.parentNode.insertBefore(wrapper, table);
    wrapper.appendChild(table);
  });
});
table {
      width: 100%;
      border-collapse: collapse;
    }

    tr,
    td {
      border: 1px solid black;
      padding: 8px;
      text-align: left;
      white-space: nowrap
    }

.table-wrapper {
      max-width: 100%;
      overflow: auto;
    }
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Table Overflow Example</title>
</head>

<body>

  <p>Table 1</p>
  <table>
    <tbody>
      <tr>
        <td>row 1 - column 1</td>
        <td>row 1 - column 2</td>
      </tr>
      <tr>
        <td>row 2 - column 1</td>
        <td>row 2 - column 2</td>
      </tr>
    </tbody>
  </table>

  <p>Table 2</p>
    <table>
      <tbody>
        <tr>
          <td>row 1 - column 1</td>
          <td>row 1 - column 2</td>
          <td>row 1 - column 3</td>
          <td>row 1 - column 4</td>
          <td>row 1 - column 5</td>
          <td>row 1 - column 6</td>
          <td>row 1 - column 7</td>
          <td>row 1 - column 8</td>
          <td>row 1 - column 9</td>
          <td>row 1 - column 10</td>
        </tr>
        <tr>
          <td>row 2 - column 1</td>
          <td>row 2 - column 2</td>
          <td>row 2 - column 3</td>
          <td>row 2 - column 4</td>
          <td>row 2 - column 5</td>
          <td>row 2 - column 6</td>
          <td>row 2 - column 7</td>
          <td>row 2 - column 8</td>
          <td>row 2 - column 9</td>
          <td>row 2 - column 10</td>
        </tr>
      </tbody>
    </table>

</body>

</html>

发布评论

评论列表(0)

  1. 暂无评论