Materialize CSS Framework
A modern responsive front-end framework based on Material Design. Create beautiful, consistent interfaces with Google's Material Design principles.
Why Choose Materialize?
Materialize is a modern responsive CSS framework based on Material Design by Google. It provides a set of components and animations that follow Material Design principles, making it easy to create beautiful, consistent web applications.
Material Design
Based on Google's Material Design principles
Responsive
Mobile-first framework with responsive grid
Components
Rich set of pre-built components and animations
Grid System
Key Features:
- 12-Column Grid - Standard 12-column responsive grid system
- Mobile-First - Designed with mobile-first approach
- Screen Sizes - s (mobile), m (tablet), l (desktop) breakpoints
- Offset & Push/Pull - Advanced grid positioning options
- Container System - Centered container with proper margins
Grid System Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Materialize Grid System</title>
<!-- Materialize CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!-- Material Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<style>
.demo-col {
background: #26a69a;
color: white;
padding: 15px;
border: 2px solid white;
text-align: center;
margin-bottom: 10px;
}
.demo-row {
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1 class="center-align">Materialize Grid System</h1>
<!-- Basic Grid -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Basic 12-Column Grid</h2>
<div class="row demo-row">
<div class="col s12 demo-col">s12 (full width)</div>
</div>
<div class="row demo-row">
<div class="col s6 demo-col">s6 (half)</div>
<div class="col s6 demo-col">s6 (half)</div>
</div>
<div class="row demo-row">
<div class="col s4 demo-col">s4 (third)</div>
<div class="col s4 demo-col">s4 (third)</div>
<div class="col s4 demo-col">s4 (third)</div>
</div>
<div class="row demo-row">
<div class="col s3 demo-col">s3 (quarter)</div>
<div class="col s3 demo-col">s3 (quarter)</div>
<div class="col s3 demo-col">s3 (quarter)</div>
<div class="col s3 demo-col">s3 (quarter)</div>
</div>
</div>
</div>
<!-- Responsive Grid -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Responsive Grid</h2>
<div class="row demo-row">
<div class="col s12 m6 l4 demo-col">
s12 (mobile)<br>
m6 (tablet)<br>
l4 (desktop)
</div>
<div class="col s12 m6 l4 demo-col">
Responsive column
</div>
<div class="col s12 m6 l4 demo-col">
Adapts to screen size
</div>
</div>
</div>
</div>
<!-- Offset Columns -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Offset Columns</h2>
<div class="row demo-row">
<div class="col s6 offset-s3 demo-col">s6 offset-s3 (centered)</div>
</div>
<div class="row demo-row">
<div class="col s4 offset-s4 demo-col">s4 offset-s4</div>
</div>
<div class="row demo-row">
<div class="col s4 demo-col">s4</div>
<div class="col s4 offset-s4 demo-col">s4 offset-s4</div>
</div>
</div>
</div>
<!-- Push and Pull -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Push and Pull (Column Reordering)</h2>
<div class="row demo-row">
<div class="col s7 push-s5 demo-col">s7 push-s5 (moved right)</div>
<div class="col s5 pull-s7 demo-col">s5 pull-s7 (moved left)</div>
</div>
</div>
</div>
<!-- Section Divider -->
<div class="divider"></div>
<!-- Grid with Sections -->
<div class="section">
<h2>Grid with Sections</h2>
<div class="row">
<div class="col s12 m4">
<div class="card-panel teal lighten-2">
<span class="white-text">Section 1</span>
</div>
</div>
<div class="col s12 m4">
<div class="card-panel teal">
<span class="white-text">Section 2</span>
</div>
</div>
<div class="col s12 m4">
<div class="card-panel teal darken-2">
<span class="white-text">Section 3</span>
</div>
</div>
</div>
</div>
</div>
<!-- Materialize JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
</body>
</html>Components
Component Library:
ButtonsCardsNavbarCollectionsBadgesChipsFooterIcons
Components Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Materialize Components</title>
<!-- Materialize CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!-- Material Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<style>
body {
display: flex;
min-height: 100vh;
flex-direction: column;
}
main {
flex: 1 0 auto;
}
.component-demo {
margin: 20px 0;
}
</style>
</head>
<body>
<!-- Navigation -->
<nav>
<div class="nav-wrapper teal">
<div class="container">
<a href="#" class="brand-logo">Materialize</a>
<a href="#" data-target="mobile-demo" class="sidenav-trigger"><i class="material-icons">menu</i></a>
<ul class="right hide-on-med-and-down">
<li><a href="#">Home</a></li>
<li><a href="#">Components</a></li>
<li><a href="#">JavaScript</a></li>
<li><a href="#">Mobile</a></li>
</ul>
</div>
</div>
</nav>
<ul class="sidenav" id="mobile-demo">
<li><a href="#">Home</a></li>
<li><a href="#">Components</a></li>
<li><a href="#">JavaScript</a></li>
<li><a href="#">Mobile</a></li>
</ul>
<main>
<div class="container">
<h1 class="center-align">Materialize Components</h1>
<!-- Buttons -->
<div class="card component-demo">
<div class="card-content">
<h2 class="card-title">Buttons</h2>
<div class="section">
<a class="waves-effect waves-light btn">Default</a>
<a class="waves-effect waves-light btn teal"><i class="material-icons left">cloud</i>Button</a>
<a class="waves-effect waves-light btn disabled">Disabled</a>
<a class="waves-effect waves-light btn-large">Large</a>
<a class="waves-effect waves-light btn-small">Small</a>
<a class="waves-effect waves-light btn-flat">Flat</a>
<a class="waves-effect waves-light btn-floating pulse"><i class="material-icons">add</i></a>
</div>
</div>
</div>
<!-- Cards -->
<div class="card component-demo">
<div class="card-content">
<h2 class="card-title">Cards</h2>
<div class="row">
<div class="col s12 m6">
<div class="card blue-grey darken-1">
<div class="card-content white-text">
<span class="card-title">Card Title</span>
<p>I am a very simple card. I am good at containing small bits of information.
I am convenient because I require little markup to use effectively.</p>
</div>
<div class="card-action">
<a href="#">This is a link</a>
<a href="#">This is a link</a>
</div>
</div>
</div>
<div class="col s12 m6">
<div class="card">
<div class="card-image">
<img src="https://materializecss.com/images/sample-1.jpg">
<span class="card-title">Card Title</span>
<a class="btn-floating halfway-fab waves-effect waves-light red"><i class="material-icons">add</i></a>
</div>
<div class="card-content">
<p>I am a very simple card. I am good at containing small bits of information.
I am convenient because I require little markup to use effectively.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Collections -->
<div class="card component-demo">
<div class="card-content">
<h2 class="card-title">Collections</h2>
<ul class="collection">
<li class="collection-item">Alvin</li>
<li class="collection-item">Alvin</li>
<li class="collection-item">Alvin</li>
<li class="collection-item">Alvin</li>
</ul>
</div>
</div>
<!-- Badges -->
<div class="card component-demo">
<div class="card-content">
<h2 class="card-title">Badges</h2>
<a class="waves-effect waves-light btn">Inbox <span class="new badge">4</span></a>
<a class="waves-effect waves-light btn">Notifications <span class="new badge blue" data-badge-caption="new">4</span></a>
</div>
</div>
<!-- Chips -->
<div class="card component-demo">
<div class="card-content">
<h2 class="card-title">Chips</h2>
<div class="chip">
Tag 1
<i class="close material-icons">close</i>
</div>
<div class="chip">
Tag 2
<i class="close material-icons">close</i>
</div>
<div class="chip">
Tag 3
<i class="close material-icons">close</i>
</div>
</div>
</div>
</div>
</main>
<!-- Footer -->
<footer class="page-footer teal">
<div class="container">
<div class="row">
<div class="col l6 s12">
<h5 class="white-text">Footer Content</h5>
<p class="grey-text text-lighten-4">You can use rows and columns here to organize your footer content.</p>
</div>
<div class="col l4 offset-l2 s12">
<h5 class="white-text">Links</h5>
<ul>
<li><a class="grey-text text-lighten-3" href="#!">Link 1</a></li>
<li><a class="grey-text text-lighten-3" href="#!">Link 2</a></li>
<li><a class="grey-text text-lighten-3" href="#!">Link 3</a></li>
<li><a class="grey-text text-lighten-3" href="#!">Link 4</a></li>
</ul>
</div>
</div>
</div>
<div class="footer-copyright">
<div class="container">
© 2024 Materialize CSS
<a class="grey-text text-lighten-4 right" href="#!">More Links</a>
</div>
</div>
</footer>
<!-- Materialize JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
// Initialize components
document.addEventListener('DOMContentLoaded', function() {
var elems = document.querySelectorAll('.sidenav');
var instances = M.Sidenav.init(elems);
});
</script>
</body>
</html>Forms
Form Features:
- Input Fields - Beautiful animated input fields with labels
- Validation - Built-in validation states and helper text
- Select Menus - Enhanced select dropdowns with search
- Checkboxes & Radios - Material Design styled form controls
- Date Pickers - Interactive date and time pickers
- File Inputs - Styled file upload components
Forms Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Materialize Forms</title>
<!-- Materialize CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!-- Material Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<div class="container">
<h1 class="center-align">Materialize Forms</h1>
<!-- Basic Form -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Contact Form</h2>
<form>
<!-- Text Inputs -->
<div class="row">
<div class="input-field col s6">
<input id="first_name" type="text" class="validate">
<label for="first_name">First Name</label>
</div>
<div class="input-field col s6">
<input id="last_name" type="text" class="validate">
<label for="last_name">Last Name</label>
</div>
</div>
<!-- Email Input -->
<div class="row">
<div class="input-field col s12">
<input id="email" type="email" class="validate">
<label for="email">Email</label>
<span class="helper-text" data-error="wrong" data-success="right">Helper text</span>
</div>
</div>
<!-- Textarea -->
<div class="row">
<div class="input-field col s12">
<textarea id="textarea1" class="materialize-textarea"></textarea>
<label for="textarea1">Message</label>
</div>
</div>
<!-- Select -->
<div class="row">
<div class="input-field col s12">
<select>
<option value="" disabled selected>Choose your option</option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<label>Materialize Select</label>
</div>
</div>
<!-- Checkboxes -->
<div class="row">
<div class="col s12">
<p>
<label>
<input type="checkbox" class="filled-in" checked="checked" />
<span>Filled in</span>
</label>
</p>
<p>
<label>
<input type="checkbox" />
<span>Default</span>
</label>
</p>
</div>
</div>
<!-- Radio Buttons -->
<div class="row">
<div class="col s12">
<p>Choose your favorite color:</p>
<p>
<label>
<input name="group1" type="radio" checked />
<span>Red</span>
</label>
</p>
<p>
<label>
<input name="group1" type="radio" />
<span>Yellow</span>
</label>
</p>
<p>
<label>
<input class="with-gap" name="group1" type="radio" />
<span>Green</span>
</label>
</p>
</div>
</div>
<!-- Switches -->
<div class="row">
<div class="col s12">
<p>Switches</p>
<div class="switch">
<label>
Off
<input type="checkbox">
<span class="lever"></span>
On
</label>
</div>
<div class="switch">
<label>
No
<input type="checkbox" checked>
<span class="lever"></span>
Yes
</label>
</div>
</div>
</div>
<!-- File Input -->
<div class="row">
<div class="file-field input-field col s12">
<div class="btn">
<span>File</span>
<input type="file">
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text" placeholder="Upload one or more files">
</div>
</div>
</div>
<!-- Range Slider -->
<div class="row">
<div class="col s12">
<p>Range</p>
<form action="#">
<p class="range-field">
<input type="range" id="test5" min="0" max="100" />
</p>
</form>
</div>
</div>
<!-- Date Picker -->
<div class="row">
<div class="input-field col s12">
<input type="text" class="datepicker">
<label for="birthdate">Birthdate</label>
</div>
</div>
<!-- Buttons -->
<div class="row">
<div class="col s12">
<button class="btn waves-effect waves-light" type="submit" name="action">Submit
<i class="material-icons right">send</i>
</button>
<button class="btn waves-effect waves-light teal lighten-2" type="reset" name="action">Reset</button>
</div>
</div>
</form>
</div>
</div>
<!-- Input Variations -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Input Variations</h2>
<!-- Character Counter -->
<div class="row">
<div class="input-field col s12">
<input id="input_text" type="text" data-length="10" class="validate">
<label for="input_text">Text with character limit</label>
</div>
</div>
<!-- Icons -->
<div class="row">
<div class="input-field col s12">
<i class="material-icons prefix">account_circle</i>
<input id="icon_prefix" type="text" class="validate">
<label for="icon_prefix">First Name with Icon</label>
</div>
</div>
<!-- Prefilled Input -->
<div class="row">
<div class="input-field col s12">
<input id="prefilled" type="text" class="validate" value="I am prefilled">
<label for="prefilled">Prefilled Text</label>
</div>
</div>
</div>
</div>
</div>
<!-- Materialize JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
// Initialize form components
document.addEventListener('DOMContentLoaded', function() {
// Select
var elems = document.querySelectorAll('select');
var instances = M.FormSelect.init(elems);
// Datepicker
var datepickers = document.querySelectorAll('.datepicker');
var dateInstances = M.Datepicker.init(datepickers, {
format: 'yyyy-mm-dd',
autoClose: true
});
// Character counter
var charCounters = document.querySelectorAll('#input_text');
var charInstances = M.CharacterCounter.init(charCounters);
});
</script>
</body>
</html>JavaScript Components
Interactive Components:
- Modal - Dialog prompts with flexible content
- Collapsible - Expandable/collapsible content sections
- Dropdown - Contextual overlays for displaying links
- Tabs - Dynamic tabbed content navigation
- Carousel - Responsive image and content sliders
- Tooltips - Small popup boxes with information
- Material Box - Lightbox functionality for images
JavaScript Components Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Materialize JavaScript Components</title>
<!-- Materialize CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!-- Material Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<div class="container">
<h1 class="center-align">Materialize JavaScript Components</h1>
<!-- Modal -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Modal</h2>
<!-- Modal Trigger -->
<a class="waves-effect waves-light btn modal-trigger" href="#modal1">Modal Demo</a>
<!-- Modal Structure -->
<div id="modal1" class="modal">
<div class="modal-content">
<h4>Modal Header</h4>
<p>A bunch of text</p>
</div>
<div class="modal-footer">
<a href="#!" class="modal-close waves-effect waves-green btn-flat">Agree</a>
<a href="#!" class="modal-close waves-effect waves-red btn-flat">Close</a>
</div>
</div>
</div>
</div>
<!-- Collapsible -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Collapsible</h2>
<ul class="collapsible">
<li>
<div class="collapsible-header"><i class="material-icons">filter_drama</i>First</div>
<div class="collapsible-body"><span>Lorem ipsum dolor sit amet.</span></div>
</li>
<li>
<div class="collapsible-header"><i class="material-icons">place</i>Second</div>
<div class="collapsible-body"><span>Lorem ipsum dolor sit amet.</span></div>
</li>
<li>
<div class="collapsible-header"><i class="material-icons">whatshot</i>Third</div>
<div class="collapsible-body"><span>Lorem ipsum dolor sit amet.</span></div>
</li>
</ul>
</div>
</div>
<!-- Dropdown -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Dropdown</h2>
<!-- Dropdown Trigger -->
<a class='dropdown-trigger btn' href='#' data-target='dropdown1'>Drop Me!</a>
<!-- Dropdown Structure -->
<ul id='dropdown1' class='dropdown-content'>
<li><a href="#!">one</a></li>
<li><a href="#!">two</a></li>
<li class="divider" tabindex="-1"></li>
<li><a href="#!">three</a></li>
</ul>
</div>
</div>
<!-- Tabs -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Tabs</h2>
<div class="row">
<div class="col s12">
<ul class="tabs">
<li class="tab col s3"><a href="#test1">Test 1</a></li>
<li class="tab col s3"><a class="active" href="#test2">Test 2</a></li>
<li class="tab col s3"><a href="#test3">Test 3</a></li>
<li class="tab col s3"><a href="#test4">Test 4</a></li>
</ul>
</div>
<div id="test1" class="col s12">Test 1 Content</div>
<div id="test2" class="col s12">Test 2 Content</div>
<div id="test3" class="col s12">Test 3 Content</div>
<div id="test4" class="col s12">Test 4 Content</div>
</div>
</div>
</div>
<!-- Carousel -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Carousel</h2>
<div class="carousel">
<a class="carousel-item" href="#one!"><img src="https://lorempixel.com/250/250/nature/1"></a>
<a class="carousel-item" href="#two!"><img src="https://lorempixel.com/250/250/nature/2"></a>
<a class="carousel-item" href="#three!"><img src="https://lorempixel.com/250/250/nature/3"></a>
<a class="carousel-item" href="#four!"><img src="https://lorempixel.com/250/250/nature/4"></a>
<a class="carousel-item" href="#five!"><img src="https://lorempixel.com/250/250/nature/5"></a>
</div>
</div>
</div>
<!-- Tooltips -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Tooltips</h2>
<a class="btn tooltipped" data-position="bottom" data-tooltip="I am a tooltip">Hover me!</a>
<a class="btn tooltipped" data-position="top" data-tooltip="I am a tooltip on top">Top Tooltip</a>
<a class="btn tooltipped" data-position="left" data-tooltip="I am a left tooltip">Left Tooltip</a>
<a class="btn tooltipped" data-position="right" data-tooltip="I am a right tooltip">Right Tooltip</a>
</div>
</div>
<!-- Material Box -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Material Box (Lightbox)</h2>
<img class="materialboxed" width="250" src="https://lorempixel.com/250/250/nature/1" data-caption="A beautiful nature image">
</div>
</div>
<!-- Feature Discovery -->
<div class="card">
<div class="card-content">
<h2 class="card-title">Feature Discovery</h2>
<!-- Tap Target Trigger -->
<div class="fixed-action-btn" style="bottom: 45px; right: 24px;">
<a id="menu" class="btn btn-floating btn-large cyan">
<i class="material-icons">menu</i>
</a>
</div>
<!-- Tap Target Structure -->
<div class="tap-target cyan" data-target="menu">
<div class="tap-target-content">
<h5>Title</h5>
<p>A bunch of text</p>
</div>
</div>
</div>
</div>
</div>
<!-- Materialize JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
// Initialize all JavaScript components
document.addEventListener('DOMContentLoaded', function() {
// Modal
var modals = document.querySelectorAll('.modal');
var modalInstances = M.Modal.init(modals);
// Collapsible
var collapsibles = document.querySelectorAll('.collapsible');
var collapsibleInstances = M.Collapsible.init(collapsibles);
// Dropdown
var dropdowns = document.querySelectorAll('.dropdown-trigger');
var dropdownInstances = M.Dropdown.init(dropdowns);
// Tabs
var tabs = document.querySelectorAll('.tabs');
var tabInstances = M.Tabs.init(tabs);
// Carousel
var carousels = document.querySelectorAll('.carousel');
var carouselInstances = M.Carousel.init(carousels);
// Tooltips
var tooltips = document.querySelectorAll('.tooltipped');
var tooltipInstances = M.Tooltip.init(tooltips);
// Materialbox
var materialboxes = document.querySelectorAll('.materialboxed');
var materialboxInstances = M.Materialbox.init(materialboxes);
// Tap Target
var tapTargets = document.querySelectorAll('.tap-target');
var tapTargetInstances = M.TapTarget.init(tapTargets);
});
</script>
</body>
</html>Quick Start Guide
CDN Method (Easiest)
<!-- Materialize CSS --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"> <!-- Material Icons --> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <!-- Materialize JavaScript --> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
Package Manager (npm)
# Install via npm
npm install materialize-css
# Import in your JavaScript
import M from 'materialize-css';
# Import CSS
import 'materialize-css/dist/css/materialize.min.css';
# Initialize components
document.addEventListener('DOMContentLoaded', function() {
var elems = document.querySelectorAll('.modal');
var instances = M.Modal.init(elems);
});Best Practices
✅ Do This
- Use container class - Wrap content in container for proper spacing
- Initialize JavaScript - Always initialize components after DOM load
- Follow Material Design - Stick to Material Design principles
- Use Material Icons - Leverage Google's Material Icons
- Mobile-first approach - Design for mobile then enhance for desktop
❌ Avoid This
- Forgetting JavaScript init - Components need initialization
- Overriding core styles - Use SASS variables for customization
- Ignoring breakpoints - Always consider responsive design
- Mixing design systems - Stick to Material Design patterns
- Complex nesting - Keep HTML structure clean and semantic
Ready to Build with Materialize?
Start creating beautiful, Material Design compliant websites with this modern CSS framework that combines aesthetics with functionality.