@area17/a17-tailwind-plugins
Version:
A collection of Tailwind plugins to help build responsive design systems in collaboration with A17 design and development build methodologies
405 lines (347 loc) • 14.2 kB
HTML
---
title: Scrollbar
---
{% include_relative includes/_header.html %}
<div class="copy">
<h2 id="description">Description</h2>
<p>
Attempts to unify the (relatively) new CSS standard
<code>scrollbar-width: *;</code> (<a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-width"
target="_blank"
>MDN</a
>) and <code>scrollbar-color: * *;</code> (<a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-color"
target="_blank"
>MDN</a
>) with the non-standard, but comically much better supported,<code
>::-webkit-scrollbar</code
>
styles (<a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/::-webkit-scrollbar"
target="_blank"
>MDN</a
>).
</p>
<h3>Accessibility Concern</h3>
<figure class="blockquote">
<blockquote>
<p>
Use this property with caution — setting scrollbar-width to thin
or none can make content hard or impossible to scroll if the author does
not provide an alternative scrolling mechanism. While swiping gestures
or mouse wheels can enable scrolling on such content, some devices have
no scroll alternative.
</p>
</blockquote>
<figcaption>
<cite
><a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-width#accessibility_concerns"
>MDN</a
></cite
>
</figcaption>
</figure>
<h2 id="setup">Setup</h2>
<figure class="code-example">
<figcaption class="code-example-filename">tailwind.config.js</figcaption>
<pre
class="code-example-code"
><code class="language-javascript">const { Scrollbar } = require('@area17/a17-tailwind-plugins');
module.exports = {
...
plugins: [Scrollbar],
theme: {
colors: {
"grey-15": "#d9d9d9",
"red-01": "#f00"
},
scrollbar: {
track: {
"primary": "#ADD8E6"
},
thumb: {
primary: "#004F91"
}
}
}
...
};</code></pre>
</figure>
<h2 id="demo">Demo</h2>
<p>For reference, an example of standard scroll bars:</p>
</div>
<div class="flex flex-row gap-gutter overflow-x-auto pb-20 my-40 max-w-400">
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<p>
You may need to show scrollbars in your operating system settings, but then
as a web developer, you already had your scrollbars always visible, didn't
you? 😉
</p>
<p>
The following demos show horizontal scrollbars - the styles will apply to
scrollbars in both directions.
</p>
<h3 id="thin">Thin scrollbars</h3>
<p>
Attempts to unify <code>scrollbar-width: thin;</code> (<a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-width"
target="_blank"
>MDN</a
>) and the corresponding <code>::-webkit-scrollbar</code> styles.
</p>
<p>
On this plugin authors Mac, running Mac OS Big Sur and FireFox 95 -
<code>scrollbar-width: thin;</code> draws a scrollbar that is
<code>10px</code> wide with a <code>2px</code> internal padding.
</p>
<p>
And so, as well as setting <code>scrollbar-width: thin;</code>,
<code>scrollbar-thin</code> alters the scrollbars to match those numbers.
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-thin"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-thin">...</div></code></pre>
</figure>
<h3 id="thin_collapsed">Thin scrollbars - collapsed</h3>
<p>
<code>scrollbar-thin-collapse</code> takes advantage of the ability to
collapse the padding around the scrollbar thumb for browsers that support
<code>::-webkit-scrollbar</code>. For other browsers, this sets
<code>scrollbar-width: thin;</code> as above.
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-thin-collapse"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-thin-collapse">...</div></code></pre>
</figure>
<h3 id="hidden">Hidden scrollbars</h3>
<p>
Possible, using <code>scrollbar-none</code>, unifies
<code>scrollbar-width: none;</code> and the equivalent
<code>::-webkit-scrollbar</code> <code>display: none;</code>.
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-none"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-none">...</div></code></pre>
</figure>
</div>
<h3 id="colors">Scrollbar colours</h3>
<p>
Attempts to unify <code>scrollbar-color: * *;</code> (<a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-color"
target="_blank"
>MDN</a
>) and the corresponding <code>::-webkit-scrollbar</code> styles.
</p>
<h4 id="track">Scrollbar track colour</h4>
<p>
Scrollbar track colour takes its values from your Tailwind config colors. It
creates classes from <code>theme.colors</code> and
<code>theme.scrollbarColor.track</code> and also name spaced and
<code>theme.backgroundColor</code>.
</p>
<p>
From <code>theme.theme.scrollbar.trackColor</code>, using the config in this
document:
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-track-primary"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-track-primary">...</div></code></pre>
</figure>
<h4 id="thumb">Scrollbar thumb colour</h4>
<p>
Scrollbar track colour takes its values from your Tailwind config colors. It
creates classes from <code>theme.colors</code> and
<code>theme.scrollbarColor.thumb</code> and also name spaced and
<code>theme.backgroundColor</code>.
</p>
<p>
From <code>theme.theme.scrollbar.thumbColor</code>, using the config in this
document:
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-thumb-primary"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-thumb-primary">...</div></code></pre>
</figure>
<h4 id="combining">Combining <code>scrollbar-</code> classes</h4>
<p>
Variations of combinations of
<code>scrollbar-thin</code>/<code>scrollbar-thin-collapsed</code>,
<code>scrollbar-track-*</code> and <code>scrollbar-thumb-*</code>
</p>
<p>
Using <code>scrollbar-track-*</code> and <code>scrollbar-thumb-*</code>:
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-track-primary scrollbar-thumb-primary"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-track-primary scrollbar-thumb-primary">...</div></code></pre>
</figure>
<p>
Using <code>scrollbar-thin</code>, <code>scrollbar-track-*</code> and
<code>scrollbar-thumb-*</code>:
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-thin scrollbar-track-primary scrollbar-thumb-primary"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-thin scrollbar-track-primary scrollbar-thumb-primary">...</div></code></pre>
</figure>
<p>
Using <code>scrollbar-thin-collapse</code>,
<code>scrollbar-track-*</code> and <code>scrollbar-thumb-*</code>:
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-thin-collapse scrollbar-track-primary scrollbar-thumb-primary"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-thin-collapse scrollbar-track-primary scrollbar-thumb-primary">...</div></code></pre>
</figure>
<p>Using <code>theme.colors</code> tokens as colour names:</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-thin-collapse scrollbar-track-grey-15 scrollbar-thumb-red-01"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-thin-collapse scrollbar-track-grey-15 scrollbar-thumb-red-0">...</div></code></pre>
</figure>
<p>
Using <code>theme.backgroundColor</code> tokens as colour names, note the
<code>bg-</code> colour name prefix:
</p>
</div>
<div
class="flex flex-row gap-gutter overflow-x-auto pb-20 mt-40 max-w-400 scrollbar-thin-collapse scrollbar-track-bg-column scrollbar-thumb-bg-column-alt"
>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
<div class="flex-none bg-header pointer-events-none w-100 h-40"></div>
</div>
<div class="copy">
<figure class="code-example">
<figcaption class="code-example-filename">document.html</figcaption>
<pre
class="code-example-code"
><code class="language-html"><div class="scrollbar-thin-collapse scrollbar-track-bg-column scrollbar-thumb-bg-column-alt">...</div></code></pre>
</figure>
</div>
{% include_relative includes/_footer.html %}