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 |3 Answers
Reset to default 1Wrap 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>
- Table 1 is unaffected and remains full-width.
- Table 2 gets a horizontal scrollbar if it overflows.
- 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>
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 adiv
container, and applyoverflow
to that. – C3roe Commented Mar 19 at 8:01