<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stack Theme on Daniel Zhang</title><link>https://zhangdapeng.dev/tags/stack-theme/</link><description>Recent content in Stack Theme on Daniel Zhang</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 03 Nov 2026 01:08:00 +0800</lastBuildDate><atom:link href="https://zhangdapeng.dev/tags/stack-theme/index.xml" rel="self" type="application/rss+xml"/><item><title>Elegant and Smooth: How to Optimize the Related Content Scrollbar in Hugo Stack Theme</title><link>https://zhangdapeng.dev/p/hugo-stack-scrollbar-optimization/</link><pubDate>Tue, 03 Nov 2026 01:08:00 +0800</pubDate><guid>https://zhangdapeng.dev/p/hugo-stack-scrollbar-optimization/</guid><description>&lt;img src="https://zhangdapeng.dev/p/hugo-stack-scrollbar-optimization/hugo-scrollbar-opt.jpg" alt="Featured image of post Elegant and Smooth: How to Optimize the Related Content Scrollbar in Hugo Stack Theme" /&gt;&lt;p&gt;In modern web design, &lt;strong&gt;hugo-theme-stack&lt;/strong&gt; is a top choice for independent bloggers due to its elegant card-based layout and clean responsive design. At the bottom of the article detail page, the Stack theme features a native horizontal scrolling card flow for &amp;ldquo;Related Content.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;However, the default system scrollbars (especially on Chrome/Edge for Windows) can look clunky and rigid, often disrupting the aesthetic harmony of the page. In this post, I will share how to smoothly optimize the scrollbar for &lt;code&gt;hugo-theme-stack&lt;/code&gt; using pure CSS/SCSS across three different design approaches.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-finding-the-core-class-names"&gt;🎯 Finding the Core Class Names
&lt;/h2&gt;&lt;p&gt;Before jumping into the code, we need to locate the DOM structure of the related content section in the Stack theme. By inspecting the elements, we can find the core classes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scrollbar Container&lt;/strong&gt;: &lt;code&gt;.related-contents--list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Individual Post Card&lt;/strong&gt;: &lt;code&gt;.article-card&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Hugo, you do not need to modify the theme&amp;rsquo;s core files. Simply add your custom styles to the &lt;strong&gt;&lt;code&gt;assets/scss/custom.scss&lt;/code&gt;&lt;/strong&gt; file located in your project root.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-three-optimization-approaches"&gt;🚀 Three Optimization Approaches
&lt;/h2&gt;&lt;h3 id="option-1-completely-hidden-minimal-touch-style---recommended"&gt;Option 1: Completely Hidden (Minimal Touch Style) — ✨ Recommended
&lt;/h3&gt;&lt;p&gt;The cards in the Stack theme already have a natural breathing room. Modern devices (such as smartphones, trackpads, and desktops via &lt;code&gt;Shift + Scroll&lt;/code&gt;) support horizontal swiping natively. &lt;strong&gt;Hiding the scrollbar altogether often yields the cleanest look.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add the following code to your &lt;code&gt;custom.scss&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scss" data-lang="scss"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Hide default scrollbar for related content while maintaining native smooth scrolling */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;.related-contents--list&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Hide scrollbar for Firefox */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scrollbar-width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; none; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Hide scrollbar for IE/Edge */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;-ms-overflow-style&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; none; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Optimize momentum scrolling on mobile devices */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;-webkit-overflow-scrolling&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; touch;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Hide scrollbar for Chrome, Safari, and newer Edge */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;::-webkit-scrollbar&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;display&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; none &lt;span style="color:#66d9ef"&gt;!important&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="option-2-sleek--custom-dark-mode-responsive"&gt;Option 2: Sleek &amp;amp; Custom (Dark Mode Responsive)
&lt;/h3&gt;&lt;p&gt;If you prefer keeping a scrollbar to guide your readers visually, you can use CSS pseudo-elements to turn it into a thin, rounded, and elegant indicator. This code utilizes Stack&amp;rsquo;s built-in CSS variables to perfectly adapt to both &lt;strong&gt;Light and Dark modes&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scss" data-lang="scss"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Fine-tune the horizontal scrollbar style */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;.related-contents--list&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scroll-behavior&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; smooth;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;padding-bottom&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* Leave space to prevent the thumb from clipping card shadows */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Set horizontal scrollbar height */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;::-webkit-scrollbar&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Scrollbar track background (keep it transparent to blend with the page) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;::-webkit-scrollbar-track&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; transparent; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Scrollbar thumb */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;::-webkit-scrollbar-thumb&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background-color&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;card-background); &lt;span style="color:#75715e"&gt;/* Uses the theme&amp;#39;s card background variable */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;brightness&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.9&lt;/span&gt;); &lt;span style="color:#75715e"&gt;/* Makes it slightly darker than the card in Light Mode */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;border-radius&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;border&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; solid transparent;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;transition&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; background-color &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.3&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt; ease;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;:hover&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background-color&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;accent-color); &lt;span style="color:#75715e"&gt;/* Changes to theme accent color on hover */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Micro-adjustments for Dark Mode */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#f92672"&gt;data-scheme&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.related-contents--list&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;::-webkit-scrollbar-thumb&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;brightness&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.2&lt;/span&gt;); &lt;span style="color:#75715e"&gt;/* Makes it slightly brighter than the background in Dark Mode */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="option-3-card-alignment-scroll-snapping---bonus-feature"&gt;Option 3: Card Alignment (Scroll Snapping) — 💡 Bonus Feature
&lt;/h3&gt;&lt;p&gt;Whether you choose to hide or style the scrollbar, you can always layer on a &amp;ldquo;magnetic alignment&amp;rdquo; effect. When users swipe and release their finger or trackpad, the cards won&amp;rsquo;t awkwardly stop halfway. Instead, they will &lt;strong&gt;automatically snap to the left edge&lt;/strong&gt;, much like a mobile app slider:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scss" data-lang="scss"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Enable strong horizontal scroll snapping */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;.related-contents--list&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;display&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; flex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;overflow-x&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; auto;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scroll-snap-type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; x mandatory; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Set each card as a snap point */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;.related-contents--list&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.article-card&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scroll-snap-align&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; start; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="-quick-deployment"&gt;🛠️ Quick Deployment
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Open your Hugo blog root directory.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;code&gt;assets/scss/&lt;/code&gt; folder (create it manually if it doesn&amp;rsquo;t exist).&lt;/li&gt;
&lt;li&gt;Open or create &lt;code&gt;custom.scss&lt;/code&gt; and paste your preferred snippet.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;hugo server&lt;/code&gt; locally, clear your browser cache, and enjoy your smooth new related content slider!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hope this quick layout hack improves your independent blog&amp;rsquo;s user experience. If you run into any style conflicts or layout glitches, feel free to drop a comment below!&lt;/p&gt;</description></item></channel></rss>