Main Content Area
Scroll down this page to see the sidebar stick to viewport! 👉
The sidebar contains widgets (TOC, popular posts, categories) که remain visible whilst scrolling through long articles. This dramatically improves navigation та engagement.
Why Sticky Sidebars?
Long-form content benefits від persistent navigation. Cultivation guides які span 3000+ words need persistent TOC access. Research articles benefit від related content suggestions always visible.
Try scrolling: Notice how sidebar stays in view, until hitting footer boundary. On mobile devices (<1024px), sticky behavior disables та sidebar appears above content.
📌 Sticky Sidebar Implementation Guide
Sticky sidebars remain visible as users scroll, keeping navigation, TOC, ads, або related
content accessible throughout page interaction. Unlike fixed positioning (always visible, even at page top),
sticky sidebars "stick" only після scrolling past initial position та unstick коли reaching footer content.
Modern CSS position: sticky makes implementation straightforward з minimal JavaScript. Для
mushroom education site з detailed cultivation guides або species profiles, sticky sidebars ensure TOC,
popular posts, та category widgets stay accessible during lengthy reads. Цей guide охоплює CSS
implementation, scroll boundaries, max-height calculations, responsive behavior, та performance
optimization.
💻 CSS Implementation
Basic Sticky Sidebar:
/* HTML Structure */
<div class="article-layout">
<main class="article-content">
<!-- Long article content -->
</main>
<aside class="sidebar">
<!-- Sidebar widgets -->
</aside>
</div>
/* CSS Grid Layout */
.article-layout {
display: grid;
grid-template-columns: 1fr 300px; /* Content | Sidebar */
gap: 40px;
max-width: 1200px;
margin: 0 auto;
padding: 40px 20px;
}
/* Sticky Sidebar */
.sidebar {
position: sticky;
top: 20px; /* Distance від top коли sticks */
align-self: start; /* CRITICAL: prevents stretching */
height: fit-content;
/* Optional max-height */
max-height: calc(100vh - 40px); /* Viewport height - padding */
overflow-y: auto; /* Scroll if content exceeds viewport */
}
/* Responsive: Disable sticky на mobile */
@media (max-width: 1024px) {
.article-layout {
grid-template-columns: 1fr; /* Stack */
}
.sidebar {
position: static; /* Disable sticky */
max-height: none;
}
}
Advanced: Sticky з Header Offset:
/* Якщо site має sticky header (80px height) */
.sidebar {
position: sticky;
top: calc(80px + 20px); /* Header height + spacing */
max-height: calc(100vh - 80px - 40px); /* Account для header */
}
Stop sticking at Footer:
/* Option 1: Grid Parent Control */
.article-layout {
display: grid;
grid-template-columns: 1fr 300px;
/* Sidebar automatically stops коли parent container ends */
}
/* Option 2: JavaScript (if needed) */
const sidebar = document.querySelector('.sidebar');
const footer = document.querySelector('footer');
window.addEventListener('scroll', () => {
const footerTop = footer.getBoundingClientRect().top;
const viewportHeight = window.innerHeight;
if (footerTop < viewportHeight) {
sidebar.style.position = 'absolute';
sidebar.style.bottom = '20px';
} else {
sidebar.style.position = 'sticky';
sidebar.style.top = '20px';
}
});
🎯 Key Techniques
align-self: start
CRITICAL property для sticky sidebars!
.sidebar {
position: sticky;
top: 20px;
align-self: start; /* Prevents stretching */
}
Without this, sidebar stretches до parent height та sticky fails!
max-height Calculation
Prevent sidebar від exceeding viewport:
.sidebar {
max-height: calc(100vh - 40px);
overflow-y: auto;
}
Adds scroll if widgets too tall для screen
Multiple Widgets
Stacking widgets inside sticky container:
<aside class="sidebar">
<div class="widget toc"></div>
<div class="widget popular"></div>
<div class="widget categories"></div>
</aside>
.widget {
margin-bottom: 25px;
}
Flexbox Alternative
Using flexbox instead of grid:
.article-layout {
display: flex;
gap: 40px;
}
.article-content {
flex: 1; /* Grow */
}
.sidebar {
flex: 0 0 300px; /* Fixed width */
position: sticky;
top: 20px;
align-self: flex-start;
}
⚡ Common Issues & Solutions
Issue 1: Sidebar Not Sticking
Причина: Missing align-self: start або parent overflow hidden
Solution:
.sidebar {
align-self: start; /* Add this */
}
/* Check parent containers */
.article-layout {
overflow: visible; /* Not hidden */
}
Issue 2: Sidebar Overlaps Footer
Причина: Sticky continues beyond parent container
Solution: Ensure parent grid/flex container ends before footer
<div class="article-layout"> <!-- Ends here -->
<main>...</main>
<aside class="sidebar">...</aside>
</div>
<footer>...</footer> <!-- Outside layout -->
Issue 3: Sidebar Too Tall для Viewport
Причина: Too many widgets, screen too small
Solution: Add max-height та overflow scroll
.sidebar {
max-height: calc(100vh - 100px);
overflow-y: auto;
/* Smooth scrollbar */
scrollbar-width: thin;
scrollbar-color: #d299c2 #f8f9fa;
}
/* WebKit browsers */
.sidebar::-webkit-scrollbar {
width: 6px;
}
.sidebar::-webkit-scrollbar-thumb {
background: #d299c2;
border-radius: 3px;
}
📱 Responsive Behavior
Recommended Breakpoints:
/* Desktop: Sticky sidebar */
@media (min-width: 1025px) {
.article-layout {
grid-template-columns: 1fr 300px;
}
.sidebar {
position: sticky;
top: 20px;
}
}
/* Tablet: Narrower sidebar */
@media (min-width: 768px) and (max-width: 1024px) {
.article-layout {
grid-template-columns: 1fr 250px;
}
.sidebar {
position: sticky;
top: 20px;
}
}
/* Mobile: Stack, disable sticky */
@media (max-width: 767px) {
.article-layout {
grid-template-columns: 1fr;
}
.sidebar {
position: static; /* No sticky */
max-height: none;
order: -1; /* Place sidebar above content */
}
}
🍄 Complete Mushroom Hub Example
<!-- HTML -->
<div class="mushroom-article-layout">
<main class="article-main">
<article>
<h1>Complete PF Tek Cultivation Guide</h1>
<!-- 3000+ word article -->
</article>
</main>
<aside class="article-sidebar">
<!-- TOC Widget -->
<div class="widget widget-toc">
<h3>📑 On This Page</h3>
<nav><!-- TOC links --></nav>
</div>
<!-- Popular Posts Widget -->
<div class="widget widget-popular">
<h3>🔥 Trending Guides</h3>
<!-- Popular posts list -->
</div>
<!-- Categories Widget -->
<div class="widget widget-categories">
<h3>📁 Browse Topics</h3>
<!-- Category list -->
</div>
</aside>
</div>
<!-- CSS -->
<style>
.mushroom-article-layout {
display: grid;
grid-template-columns: 1fr 320px;
gap: 50px;
max-width: 1300px;
margin: 0 auto;
padding: 60px 30px;
}
.article-main {
min-width: 0; /* Prevent overflow */
}
.article-sidebar {
position: sticky;
top: 100px; /* Account для sticky header (80px) + spacing */
align-self: start;
height: fit-content;
max-height: calc(100vh - 120px);
overflow-y: auto;
}
/* Widget spacing */
.widget {
background: white;
border: 2px solid #e9ecef;
border-radius: 12px;
padding: 25px;
margin-bottom: 25px;
}
.widget:last-child {
margin-bottom: 0;
}
.widget h3 {
font-size: 1.2em;
margin-bottom: 15px;
color: #2c3e50;
}
/* Responsive */
@media (max-width: 1024px) {
.mushroom-article-layout {
grid-template-columns: 1fr;
gap: 30px;
}
.article-sidebar {
position: static;
max-height: none;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
}
.widget {
margin-bottom: 0;
}
}
@media (max-width: 640px) {
.article-sidebar {
grid-template-columns: 1fr;
}
}
</style>
✅ Sticky Sidebar Checklist
Implementation Checklist:
- ☐
position: stickyapplied - ☐
top: [value]specified (20-100px) - ☐
align-self: startcritical property added - ☐
height: fit-contentset - ☐
max-heightcalculated (100vh - offsets) - ☐
overflow-y: autoдля tall content - ☐ Parent overflow not hidden
- ☐ Grid або flex layout на parent
- ☐ Stops sticking at footer boundary
- ☐ Mobile: Disabled (position: static)
- ☐ Tablet: Adjusted width if needed
- ☐ Tested з different content lengths