Is it possible to make a table row expand and collapse? Can anyone refer me to a script or an example?
I prefer jQuery if possible. I have a drawing concept I would like to achieve:
The expandable table can be achieved by using JavaScript with HTML. By Clicking on a row of the table, it expands and a sub-table pops up. When the user again clicks on that row the content will hide. This can be very useful when the data is complex but it is inter-related.
To freeze the row/column we can use a simple HTML table and CSS. HTML: In HTML we can define the header row by <th> tag or we can use <td> tag also. Below example is using the <th> tag. We also put the table in DIV element to see the horizontal and vertical scrollbar by setting the overflow property of the DIV element.
Yes, a table row can slide up and down, but it's ugly since it changes the shape of the table and makes everything jump. Instead, put an element in each td
, something that makes sense like a p
or h2
etc.
As for implementing a table slide toggle...
It's probably simplest to put the click handler on the entire table, .stopPropagation()
and check what was clicked.
If a td in a row with a colspan is clicked, close the p
in it. If it's not a td in a row with a colspan, then close then toggle the following row's p
.
It is essential to wrap all your written content in an element inside the td
s, since you never want to slideUp
a td
or tr
or table shape will change!
Something like:
$(function() { // Initially hide toggleable content $("td[colspan=3]").find("p").hide(); // Click handler on entire table $("table").click(function(event) { // No bubbling up event.stopPropagation(); var $target = $(event.target); // Open and close the appropriate thing if ( $target.closest("td").attr("colspan") > 1 ) { $target.slideUp(); } else { $target.closest("tr").next().find("p").slideToggle(); } }); });
... and try out this jsFiddle showing implementation of a +
- -
toggle.
The HTML just has to have alternating rows of several td
s and then a row with a td
of a colspan greater than 1. You can obviously adjust the specifics quite easily.
The HTML would look something like:
<table> <tr><td><p>Name</p></td><td><p>Age</p></td><td><p>Info</p></td></tr> <tr><td colspan="3"><p>Blah blah blah blah blah blah blah.</p> </td></tr> <tr><td><p>Name</p></td><td><p>Age</p></td><td><p>Info</p></td></tr> <tr><td colspan="3"><p>Blah blah blah blah blah blah blah.</p> </td></tr> <tr><td><p>Name</p></td><td><p>Age</p></td><td><p>Info</p></td></tr> <tr><td colspan="3"><p>Blah blah blah blah blah blah blah.</p> </td></tr> </table>
You could do it like this:
HTML
<table> <tr> <td>Cell 1</td> <td>Cell 2</td> <td>Cell 3</td> <td>Cell 4</td> <td><a href="#" id="show_1">Show Extra</a></td> </tr> <tr> <td colspan="5"> <div id="extra_1" style="display: none;"> <br>hidden row <br>hidden row <br>hidden row </div> </td> </tr> </table>
jQuery
$("a[id^=show_]").click(function(event) { $("#extra_" + $(this).attr('id').substr(5)).slideToggle("slow"); event.preventDefault(); });
See a demo on JSFiddle
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With