ChatGPT解决这个技术问题 Extra ChatGPT

Add a horizontal scrollbar to an HTML table

Is there a way to add a horizontal scrollbar to an HTML table? I actually need it to be scrollable both vertically and horizontally depending on how the table grows but I cannot get either scrollbar to appear.

... thought about putting the whole table in a div? ... then add scroll to the div?
Maybe time to change which answer to be the accepted answer?

S
Serge Stroobandt

First, make a display: block of your table

then, set overflow-x: to auto.

table {
    display: block;
    overflow-x: auto;
    white-space: nowrap;
}

Nice and clean. No superfluous formatting.

Here are more involved examples with scrolling table captions from a page on my website.

If an issue is taken about cells not filling the entire table, append the following additional CSS code:

table tbody {
    display: table;
    width: 100%;
}

This works for me in Chrome, but only after squashing everything together. white-space: nowrap; helps immediately see the scrollbar.
I actually tried this before. The only issue was that the table cells no longer filled the full width of the table.
As said by others this doesn't work properly: table rows don't fill the table width.
@collimarco Note I had to use max-width: 100% for the inline-block option.
If you use and the rule 'table tbody, table thead' columns and headers doesnt match. I didn't use the 'display:table' declaration and put column sizes in 's (inside ).
p
pasine

Did you try CSS overflow property?

overflow: scroll; /* Scrollbar are always visible */
overflow: auto;   /* Scrollbar is displayed as it's needed */

UPDATE As other users are pointing out, this is not enough to add the scrollbars. So please, see and upvote comments and answers below.


According to my own attempts and everything else I've read on the internet this simply won't work. You can overflow a wrapper element, sure, but not the table itself.
@bloudermilk You can if you add display: block.
Don't set display: block on tables - surprisingly it strips them of their semantics! This harms accessibility and makes life difficult for users of screen readers. See here developer.paciellogroup.com/blog/2018/03/…
Wow...so I was struggling to display a table in mobile view as it was messing up my whole phone layout. Thank You @CeesTimmerman. It fixed my issue
C
Colin M

Wrap the table in a DIV, set with the following style:

div.wrapper {
  width: 500px;
  height: 500px;
  overflow: auto;
}

It seem that the overflow:auto here is unecessary. Do you know of anyway to achieve this without setting the width... that always seems to be the solution in html - hardcode some width or height but that seems to defeat the point of having a layout engine!
o
ochomoswill

This is an improvement of Serge Stroobandt's answer and works perfectly. It solves the issue of the table not filling the whole page width if it has less columns.

<style> 
 .table_wrapper{
    display: block;
    overflow-x: auto;
    white-space: nowrap;
}
</style>

<div class="table_wrapper">
<table>
...
</table>
</div>

The white-space: nowrap; seems to be optional.
Excellent! Styling the div wrapper instead of the table, solved the issue of the table not filling the whole page width when it has few columns.
Seems there's no need for display: block;
@BrunoElo for some reason my table won't scroll without display: block
R
Roger Willcocks

Use the CSS attribute "overflow" for this.

Short summary:

overflow: visible|hidden|scroll|auto|initial|inherit;

e.g.

table {
    overflow: scroll;
}

link provided is broken
To quote @WickyNillams from the comment further above: > Don't set display: block on tables - surprisingly it strips them of their semantics! This harms accessibility and makes life difficult for users of screen readers. See here tpgi.com/…
M
Mary7678

Edit: @WickyNilliams has noted that setting display: block on a table body will strip the table of semantics and thus is not a good solution due to accessibility issues.

I had good success with the solution proposed by @Serge Stroobandt, but I encountered the problem @Shevy had with the cells then not filling the full width of the table. I was able to fix this by adding some styles to the tbody.

table {
  display: block;
  overflow-x: auto;
  white-space: nowrap;
}

table tbody {
  display: table;
  width: 100%;
}

This worked for me in Firefox, Chrome, and Safari on Mac.


Don't set display: block on tables - surprisingly it strips them of their semantics! This harms accessibility and makes life difficult for users of screen readers. See here developer.paciellogroup.com/blog/2018/03/…
Yikes, did NOT know that! Thanks for the info, @WickyNilliams.
It's very surprising behavior!
table tbody styles you apply will make it so that table thead cols have mismatched widths with tbody cols.
table tbody{...} styles don't get applied to my mat-table... Anyone have similar problems?
m
mpen

I couldn't get any of the above solutions to work. However, I found a hack:

body { background-color: #ccc; } .container { width: 300px; background-color: white; } table { width: 100%; border-collapse: collapse; } td { border: 1px solid black; } /* try removing the "hack" below to see how the table overflows the .body */ .hack1 { display: table; table-layout: fixed; width: 100%; } .hack2 { display: table-cell; overflow-x: auto; width: 100%; }

table or other arbitrary content that will cause your page to stretch
uncontrollably xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


None of the above worked for me either, but this did. Nice one, thanks.
@Gábriel Glad it worked for you. I tried it again just now in Firefox and it doesn't seem to be rendering correctly :-( i.imgur.com/BcjSaCV.png Chrome still looks good.
Strange; I was using it exactly on Firefox and it worked there - although not in this exact setup. I wanted to render a big grid made up of 10 x 10 px divs with collapsed borders and the maxed-out width + the overflow-x: auto seemed to be the key. With those in place, everything looked perfect. Also, I'm not using at all, only divs, with display: table, table-row and table-cell.
J
Josh

I was running into the same issue. I discovered the following solution, which has only been tested in Chrome v31:

table {
    table-layout: fixed;
}

tbody {
    display: block;
    overflow: scroll;
}

tbody {...} styles don't seem to get applied to my mat-table. Any idea why?
M
Mark Rotteveel

Insert the table inside a div, so the table will take full length

HTML

<div class="scroll">
 <table>  </table>
</div>   

CSS

.scroll{
    overflow-x: auto;
    white-space: nowrap;
}

That worked for me. I usually avoid changing the HTML but in that case it's much easier
F
Forrest

With bootstrap

 <div class="table-responsive">
   <table class="table">
     ...
   </table>
 </div>

G
George

I figured out this answer based on previous solution and it's comment and added some adjustments of my own. This works for me on the responsive table.

table {
  display: inline-block;
  overflow-x: auto;
  white-space: nowrap;
  // make fixed table width effected by overflow-x
  max-width: 100%;
  // hide all borders that make rows not filled with the table width
  border: 0;
}
// add missing borders
table td {
  border: 1px solid;
}

@Saeed Did you mean something like html structure?
My bad, I mean add more explanation, to help understand it better
Hope this version is more clarified.
P
Peps

The 'more than 100% width' on the table really made it work for me.

.table-wrap { width: 100%; overflow: auto; } table { table-layout: fixed; width: 200%; }


R
Riki krismawan

add tag table to div element with style="overflow-x:auto"

<div style="overflow-x:auto">
<table class="table table-bordered">
    <thead>
        <tr>
            <th><b>Name</b></th>
            <th><b>Username</b></th>
            <th><b>Email</b></th>
            <th><b>Avatar</b></th>
            <th><b>Status</b></th>
            <th><b>Action</b></th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

M
Mugetsu

This is what worked for me

.wrapper {
  overflow-x: auto;
  white-space: nowrap;
}

.wrapper table {
  width: auto;
  min-width: 100%;
}

<div class="wrapper">
   <table>...</table>
</div>

K
Khaled

For what it's worth, the best answer I found was here: https://github.com/filamentgroup/tablesaw/issues/58#issuecomment-63966574

table.tablesaw
{
    table-layout: fixed;
    max-width: none;
    width: auto;
    min-width: 100%;
}

s
sarfrazanwar

I tried all the above solutions but had some issues with them.

If we add display: 'block' to the table, the cells do not occupy the full width. If we add it to the table wrapper, your custom table header like search, filter etc will also scroll which will look bad.

I was able to achieve the expected behaviour by adding overflow-x: auto to the body wrapper of the table.

Cells take full width even with less columns and a scroll bar appears automatically as needed.


G
George Chond

Like already stated, using display:block; on table is bad. I tried most of the answers in this thread, none worked as I wanted. If your HTML is structured like this:

<div>
  <table>
    <tbody>

And you want the parent div to be horizontally scrollable, you can try the following:

.text-left {text-align:left;} /* Ignore */ .x-auto { overflow-x: auto; } .table { text-align: left; table-layout: fixed; width: 100%; white-space: nowrap; } .table tbody { display: table; width: 100%; }

Head1 Head2
Some short text! Some really long text, like really really really really really really really really really really really really long!


k
kinzzy goel
//Representation of table
<div class="search-table-outter">
<table class="table table-responsive search-table inner">
</table>
</div>

//Css to make Horizontal Dropdown

<style>

    .search-table{table-layout: auto; margin:40px auto 0px auto; }
    .search-table, td, th {
        border-collapse: collapse;
    }
th{padding:20px 7px; font-size:15px; color:#444;}
td{padding:5px 10px; height:35px;}
    .search-table-outter { overflow-x: scroll; }
th, td { min-width: 200px; }


</style>

Indentation and sample data would help if you intend to demo something. Also, did you mean "scrollbar" instead of "Dropdown"?