Bulma Card
The Card component in Bulma is a versatile container that can hold virtually any type of content. It's perfect for displaying articles, products, user profiles, and other content in an organized, visually appealing manner.
Basic Card Structure
A card consists of several optional parts:
<div class="card">
<!-- Card header (optional) -->
<header class="card-header">
<p class="card-header-title">Card Title</p>
</header>
<!-- Card image (optional) -->
<div class="card-image">
<figure class="image is-4by3">
<img src="https://bulma.io/images/placeholders/1280x960.png" alt="Placeholder" />
</figure>
</div>
<!-- Card content (required for content) -->
<div class="card-content">
<div class="content">
<p>Card content goes here. This is where you put your main information.</p>
</div>
</div>
<!-- Card footer (optional) -->
<footer class="card-footer">
<a href="#" class="card-footer-item">Save</a>
<a href="#" class="card-footer-item">Edit</a>
<a href="#" class="card-footer-item">Delete</a>
</footer>
</div>Card Title
Card content goes here. This is where you put your main information.
Card Components
Card Header
<header class="card-header">
<!-- Simple title -->
<p class="card-header-title">Product Name</p>
<!-- Title with icon -->
<p class="card-header-title">
<span class="icon">
<i class="fas fa-star"></i>
</span>
<span>Featured</span>
</p>
<!-- Header with action button -->
<button class="card-header-icon" aria-label="more options">
<span class="icon">
<i class="fas fa-angle-down"></i>
</span>
</button>
</header>Card Image
<div class="card-image">
<!-- Basic image -->
<figure class="image is-4by3">
<img src="image.jpg" alt="Description" />
</figure>
<!-- Image with overlay -->
<div class="card-image">
<figure class="image is-16by9">
<img src="image.jpg" alt="Description" />
</figure>
<div class="card-content is-overlay">
<p class="title is-4 has-text-white">Overlay Text</p>
</div>
</div>
</div>Card Content
<div class="card-content">
<!-- Simple content -->
<div class="content">
<p>Main content goes here.</p>
</div>
<!-- Content with media object -->
<article class="media">
<figure class="media-left">
<p class="image is-48x48">
<img src="avatar.jpg" />
</p>
</figure>
<div class="media-content">
<div class="content">
<p>
<strong>John Doe</strong>
<br />
Content with media alignment.
</p>
</div>
</div>
</article>
</div>Card Footer
<footer class="card-footer">
<!-- Simple footer items -->
<a href="#" class="card-footer-item">View</a>
<a href="#" class="card-footer-item">Edit</a>
<!-- Footer with icons -->
<a href="#" class="card-footer-item">
<span class="icon">
<i class="fas fa-heart"></i>
</span>
<span>Like</span>
</a>
<!-- Disabled footer item -->
<span class="card-footer-item is-disabled">Disabled</span>
</footer>Card Variations
Compact Card
<div class="card">
<div class="card-content">
<div class="content">
<p class="is-size-6">Compact card with smaller text.</p>
</div>
</div>
</div>Wide Card
<div class="card is-wide">
<div class="card-content">
<p>Wide card that takes more horizontal space.</p>
</div>
</div>Interactive Card (Hover Effects)
<div class="card is-clickable">
<div class="card-content">
<p>This card has hover effects and is clickable.</p>
</div>
</div>Colored Cards
<!-- Primary card -->
<div class="card has-background-primary has-text-white">
<div class="card-content">
<p>Primary colored card.</p>
</div>
</div>
<!-- Success card with light background -->
<div class="card has-background-success-light">
<div class="card-content">
<p>Success card with light background.</p>
</div>
</div>Card Layouts in Grid
Cards in Columns
<div class="columns is-multiline">
<div class="column is-4">
<div class="card">
<div class="card-content">
<p>Card 1</p>
</div>
</div>
</div>
<div class="column is-4">
<div class="card">
<div class="card-content">
<p>Card 2</p>
</div>
</div>
</div>
<div class="column is-4">
<div class="card">
<div class="card-content">
<p>Card 3</p>
</div>
</div>
</div>
</div>Responsive Card Grid
<div class="columns is-multiline">
<div class="column is-12-mobile is-6-tablet is-4-desktop">
<div class="card">
<div class="card-content">
<p>Responsive card</p>
</div>
</div>
</div>
<!-- More cards... -->
</div>Use Cases
1. Product Card
<div class="card">
<div class="card-image">
<figure class="image is-4by3">
<img src="product.jpg" alt="Product image" />
</figure>
</div>
<div class="card-content">
<div class="media">
<div class="media-content">
<p class="title is-4">Product Name</p>
<p class="subtitle is-6">$29.99</p>
</div>
</div>
<div class="content">
<p>Product description goes here. This is a brief description of the product features.</p>
<div class="tags">
<span class="tag is-primary">In Stock</span>
<span class="tag is-light">Free Shipping</span>
</div>
<br />
<time datetime="2023-12-01">Added: 1 Dec 2023</time>
</div>
</div>
<footer class="card-footer">
<a href="#" class="card-footer-item">
<span class="icon">
<i class="fas fa-shopping-cart"></i>
</span>
<span>Add to Cart</span>
</a>
<a href="#" class="card-footer-item">
<span class="icon">
<i class="fas fa-heart"></i>
</span>
<span>Save</span>
</a>
<a href="#" class="card-footer-item">
<span class="icon">
<i class="fas fa-share"></i>
</span>
<span>Share</span>
</a>
</footer>
</div>2. User Profile Card
<div class="card">
<div class="card-content">
<div class="media">
<div class="media-left">
<figure class="image is-64x64">
<img class="is-rounded" src="avatar.jpg" alt="Profile" />
</figure>
</div>
<div class="media-content">
<p class="title is-4">John Doe</p>
<p class="subtitle is-6">@johndoe</p>
</div>
</div>
<div class="content">
<p>Frontend Developer | UI/UX Designer</p>
<p>📍 San Francisco, CA</p>
<br />
<div class="tags">
<span class="tag is-primary">JavaScript</span>
<span class="tag is-info">React</span>
<span class="tag is-success">Bulma</span>
<span class="tag is-warning">CSS</span>
</div>
<br />
<div class="buttons">
<button class="button is-primary">Follow</button>
<button class="button is-light">Message</button>
</div>
</div>
</div>
</div>3. Blog Post Card
<div class="card">
<header class="card-header">
<p class="card-header-title">Blog Post Title</p>
<button class="card-header-icon" aria-label="bookmark">
<span class="icon">
<i class="fas fa-bookmark"></i>
</span>
</button>
</header>
<div class="card-image">
<figure class="image is-16by9">
<img src="blog-image.jpg" alt="Blog post image" />
</figure>
</div>
<div class="card-content">
<div class="content">
<p>This is a brief excerpt from the blog post. It gives readers a preview of the content and encourages them to click through to read more.</p>
<br />
<div class="media">
<div class="media-left">
<figure class="image is-32x32">
<img class="is-rounded" src="author.jpg" alt="Author" />
</figure>
</div>
<div class="media-content">
<p class="subtitle is-6">Written by <strong>Jane Smith</strong></p>
<p class="subtitle is-7">Published on December 1, 2023 • 5 min read</p>
</div>
</div>
</div>
</div>
<footer class="card-footer">
<a href="#" class="card-footer-item">
<span class="icon">
<i class="far fa-thumbs-up"></i>
</span>
<span>Like</span>
</a>
<a href="#" class="card-footer-item">
<span class="icon">
<i class="far fa-comment"></i>
</span>
<span>Comment</span>
</a>
<a href="#" class="card-footer-item">
<span class="icon">
<i class="fas fa-share"></i>
</span>
<span>Share</span>
</a>
</footer>
</div>4. Dashboard Stat Card
<div class="card">
<div class="card-content">
<div class="media">
<div class="media-left">
<figure class="image is-48x48 has-background-primary has-text-white is-flex is-align-items-center is-justify-content-center">
<i class="fas fa-users fa-lg"></i>
</figure>
</div>
<div class="media-content">
<p class="title is-3">1,254</p>
<p class="subtitle is-6">Total Users</p>
</div>
</div>
<div class="content">
<p class="has-text-success">
<span class="icon">
<i class="fas fa-arrow-up"></i>
</span>
<span>12.5% increase from last month</span>
</p>
</div>
</div>
</div>5. Pricing Card
<div class="card has-text-centered">
<header class="card-header">
<p class="card-header-title is-centered is-size-4">Pro Plan</p>
</header>
<div class="card-content">
<div class="content">
<p class="title is-1">$29</p>
<p class="subtitle is-6">per month</p>
<ul class="has-text-left">
<li>✅ 10 Projects</li>
<li>✅ 5GB Storage</li>
<li>✅ Priority Support</li>
<li>✅ Advanced Analytics</li>
<li>✅ API Access</li>
</ul>
</div>
</div>
<footer class="card-footer">
<a href="#" class="card-footer-item is-primary has-text-weight-bold">
Get Started
</a>
</footer>
</div>Advanced Card Features
Card with Tabs
<div class="card">
<header class="card-header">
<p class="card-header-title">Card with Tabs</p>
</header>
<div class="card-content">
<div class="tabs">
<ul>
<li class="is-active"><a>Tab 1</a></li>
<li><a>Tab 2</a></li>
<li><a>Tab 3</a></li>
</ul>
</div>
<div class="content">
<p>Content for the active tab goes here.</p>
</div>
</div>
</div>Card with Modal
<div class="card">
<div class="card-content">
<p>Card content with modal trigger.</p>
<button class="button is-primary modal-button" data-target="modal-card">
Open Modal
</button>
</div>
</div>Card with Dropdown
<div class="card">
<header class="card-header">
<p class="card-header-title">Card with Dropdown</p>
<div class="card-header-icon dropdown is-right">
<div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
<span class="icon">
<i class="fas fa-ellipsis-v"></i>
</span>
</button>
</div>
<div class="dropdown-menu" id="dropdown-menu" role="menu">
<div class="dropdown-content">
<a href="#" class="dropdown-item">Edit</a>
<a href="#" class="dropdown-item">Duplicate</a>
<hr class="dropdown-divider">
<a href="#" class="dropdown-item has-text-danger">Delete</a>
</div>
</div>
</div>
</header>
<div class="card-content">
<p>Card content here.</p>
</div>
</div>Customization
/* Custom card styles */
.card {
/* Custom border radius */
border-radius: 12px;
/* Custom shadow */
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
/* Custom border */
border: 1px solid #e0e0e0;
/* Smooth transition */
transition: all 0.3s ease;
}
/* Hover effects */
.card.is-hoverable:hover {
transform: translateY(-4px);
box-shadow: 0 12px 20px rgba(0, 0, 0, 0.15);
}
/* Custom card header */
.card-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.card-header-title {
color: white;
}
/* Custom card footer */
.card-footer {
border-top: 1px solid #f0f0f0;
background-color: #fafafa;
}
.card-footer-item:hover {
background-color: #f0f0f0;
}
/* Card with gradient border */
.card.has-gradient-border {
border: double 3px transparent;
background-image: linear-gradient(white, white),
linear-gradient(135deg, #667eea, #764ba2);
background-origin: border-box;
background-clip: content-box, border-box;
}Accessibility
<!-- Card with proper ARIA labels -->
<div class="card" role="article" aria-labelledby="card-title-1">
<header class="card-header">
<h2 id="card-title-1" class="card-header-title">Article Title</h2>
</header>
<div class="card-content">
<p>Article content here.</p>
</div>
</div>
<!-- Interactive card with keyboard support -->
<div class="card is-clickable" tabindex="0" role="button">
<div class="card-content">
<p>Clickable card with keyboard support.</p>
</div>
</div>
<!-- Card with screen reader text -->
<div class="card">
<div class="card-content">
<p>Regular content</p>
<span class="sr-only">Additional information for screen readers</span>
</div>
</div>Best Practices
- Use consistent card sizes within the same section
- Include clear call-to-action buttons in card footers
- Use appropriate images with correct aspect ratios
- Keep card content focused and concise
- Use color and typography to create visual hierarchy
- Make cards responsive for different screen sizes
- Add hover effects for interactive cards
- Ensure sufficient contrast for accessibility
- Test card layouts on various devices
Tip: Cards are incredibly versatile. You can combine them with other Bulma components like Media Object, Level, and Tags to create complex, information-rich layouts.
Up next: Bulma Content Component