Quick answer: Materialize CSS has no dedicated table component — you style plain HTML tables by adding classes. Wrap your <table> in <div class="col s12"> inside a row, then add responsive-table to the table itself to get horizontal scrolling on screens under 992px. The striped, highlight, centered and bordered classes handle the common looks. If you were actually searching for a scrollable table in Angular Material (the mat-table component), jump to our dedicated scrollable table in Angular Material guide — the two frameworks are different things despite the similar names.

The two “material tables” people search for

Table-related searches split into two camps, and mixing them up wastes an afternoon:

You are usingThe table isScrollability comes from
Materialize CSS (plain HTML + classes)A normal <table> with styling classesresponsive-table wrapper class (CSS only)
Angular Material (Angular components)<mat-table> built from data arraysCSS on a wrapper div with overflow: auto, or sticky columns

Materialize is the plain-CSS framework; Angular Material is a component library for Angular apps that happens to share Google’s design language. This guide covers Materialize CSS end to end, then shows the Angular Material scroll pattern for readers who landed here from a mat-table scrollable search. New to the framework? The complete Materialize CSS tutorial covers setup and the grid in one afternoon.

Styling a table in Materialize CSS: the four classes

Start from a plain HTML table and add classes to the <table> tag itself:

<div class="row">
  <div class="col s12">
    <table class="striped highlight responsive-table">
      <thead>
        <tr><th>Student</th><th>Course</th><th>Grade</th></tr>
      </thead>
      <tbody>
        <tr><td>Asha</td><td>Bioinformatics</td><td>A</td></tr>
        <tr><td>Rahul</td><td>Web Development</td><td>B+</td></tr>
      </tbody>
    </table>
  </div>
</div>
ClassWhat it doesUse it when
stripedAlternating row backgroundAny table over ~5 rows — halves misreading
highlightRow highlights on hoverReadable rows the user scans before clicking
centeredCenters all cell textNumeric or status columns
borderedFull cell bordersDense data where cell edges carry meaning
responsive-tableHorizontal scroll under 992pxAlmost always — see the next section

The classes stack freely: class="striped highlight responsive-table" is the sensible default for data tables. Colors apply too — class="striped blue" tints the stripes with the standard Materialize color system.

Responsiveness: what responsive-table actually does

responsive-table is one CSS rule doing real work: below 992px the table’s wrapper becomes horizontally scrollable instead of letting columns crush. The rows stay rows, the user swipes sideways, and nothing overlaps. That behavior covers most cases, but know its limits:

  • It scrolls the whole table. On a 6-column table the first columns swipe out of view — if those columns are identifiers (names, IDs), that is bad UX on phones.
  • It does not stack. Unlike Bootstrap’s responsive-table (which reflows rows into cards under 768px), Materialize keeps tabular form. Stacking requires your own CSS or a different markup per breakpoint.
  • Columns-size truth: if your table is squeezed on desktop, the culprit is usually a missing col s12 wrapper — the table inherits whatever width its container gives it. Our grid system guide explains the wrapper mechanics.

Wide tables on mobile: the identifier-column pattern

When the first column must stay visible while the rest scroll (order lists, student results, leaderboards), the standard trick is sticky columns plus a scroll container. Materialize does not ship this; here is the minimal version that works with it:

<div class="row">
  <div class="col s12 table-scroll">
    <table class="striped highlight">
      <!-- ... -->
    </table>
  </div>
</div>
<style>
  .table-scroll { overflow-x: auto; }
  .table-scroll table { min-width: 700px; }
  .table-scroll th:first-child,
  .table-scroll td:first-child {
    position: sticky; left: 0;
    background: #fff; /* match your theme */
  }
</style>

The min-width keeps columns readable instead of crushed, overflow-x: auto supplies the scroll (this is the same primitive Angular Material tables use), and the sticky first column keeps names visible while data swipes past. That is a dozen lines of CSS for the pattern users expect from data-heavy mobile tables.

For the mat-table searchers: scrollable tables in Angular Material

If your project is Angular, the component is mat-table and scrollability is deliberately manual — Angular Material wants you to own the layout. The canonical pattern from our scrollable table in Angular Material tutorial:

<div class="mat-elevation-z8 table-wrapper">
  <mat-table [dataSource]="students" class="mat-table-scrollable">
    <!-- columns as usual -->
  </mat-table>
</div>
<style>
  .table-wrapper { overflow: auto; max-height: 400px; }
  .mat-table-scrollable { min-width: 800px; }
  th.mat-header-cell { position: sticky; top: 0; background: #fff; }
</style>

Same primitives as the Materialize pattern — scroll container, min-width, sticky headers — just wired into Angular’s component model with mat-elevation-z8 supplying the shadow that z-depth-2 gives in Materialize.

Choosing the right responsive strategy

SituationUseWhy
3–5 columns, mobile users includedresponsive-tableOne class, native feel, nothing hidden
6+ columns, first column is an identifierScroll container + sticky columnKeeps row identity while data scrolls
Long tables (50+ rows)Scroll container + max-height + sticky headerHeader stays visible; page height stays sane
Summary data, not raw tablesRethink: cards on mobileTen swipe-columns is a design failure, not a CSS problem

That last row is the honest advice: tables are for comparing across rows. If users only ever read one record at a time, a card list beats any responsive table. Learn when not to table and your mobile UIs get better than anything CSS can rescue.

If you want an instructor reviewing your responsive layouts and correcting these decisions with you in real time, Ampersand Academy teaches front-end development one-to-one, from first grid to production-quality mobile UIs.

Frequently asked questions

How do I make a table responsive in Materialize CSS?

Add the responsive-table class to your table tag and place the table inside a col s12 wrapper within a row. Below 992px the table becomes horizontally scrollable instead of crushing its columns.

How do I make a mat-table scrollable?

Wrap the mat-table in a div with overflow: auto and give the table a min-width, then make the header row sticky with position: sticky and top: 0. Angular Material does not include scrollability automatically – the wrapper div pattern is the official approach.

What is the difference between Materialize CSS and Angular Material?

Materialize CSS is a plain HTML, CSS and JavaScript framework you use with any stack by adding classes. Angular Material is a component library built for Angular applications. They share Google’s Material Design language but are installed and used completely differently.

Does Materialize have a striped table style?

Yes. Add the striped class to the table tag for alternating row colors, highlight for hover emphasis, centered for centered text and bordered for full borders. The classes combine, so class=’striped highlight responsive-table’ is a common data-table default.

How do I keep the first column visible while a table scrolls on mobile?

Put the table in a scroll container (overflow-x: auto), give the table a min-width, and set position: sticky with left: 0 on the first th and td cells, giving them a solid background. This works in both Materialize CSS and Angular Material.