<h1 class="title">scrollbar-gutter</h1>
<div class="actions">
<button class="btn" id="addContent">Add content</button>
<button class="btn btn--gutter" id="addGutter">Add gutter</button>
<button class="btn" id="reset">Reset</button>
</div>
<p class="info-wrapper"><span class="info">16px padding</span> <span class="info info--gutter">Gutter</span></p>
<div class="box">
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquam, asperiores tempore debitis sunt porro.</p>
<p class="p-2 hidden">ipsum dolor sit amet consectetur adipisicing elit. Aliquam, asperiores tempore debitis sunt porro.</p>
</div>
.box {
--padding: 1rem;
position: relative;
max-width: 300px;
max-height: 200px;
overflow-y: auto;
scrollbar-gutter: var(--gutter, auto);
margin: 1rem auto 0;
background: linear-gradient(
to right,
#fff calc(100% - 15px),
#d98daf 0,
#d98daf 15px
);
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.1);
border-radius: 6px;
padding: var(--padding);
&:after {
content: "";
position: absolute;
left: 0;
top: 0;
right: 0;
width: 100%;
height: 100%;
border: 16px solid #d2e7c9;
}
}
p {
margin-bottom: 1rem;
}
p.hidden {
display: none;
}
.actions {
display: flex;
justify-content: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
}
.btn {
appearnce: none;
border: 0;
font-size: 1rem;
padding: 0.5rem 1rem;
border: 1px solid grey;
border-radius: 100px;
cursor: pointer;
}
.btn.is-active {
color: #fff;
background-color: #000;
border-color: #000;
}
.btn--gutter.is-active {
color: #fff;
background-color: #db498a;
border-color: #db498a;
}
.info-wrapper {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 1.25rem;
margin: 2rem auto 0;
}
.title {
font-size: 1.5rem;
text-align: center;
font-family: monospace;
font-weight: bolder;
margin-bottom: 1rem;
}
.info {
font-size: 0.85rem;
&:before {
content: "";
display: inline-block;
vertical-align: middle;
width: 1.25em;
height: 1.25em;
background-color: #d2e7c9;
border-radius: 2px;
margin-right: 0.5em;
border: 2px solid rgba(#000, 0.05);
}
}
.info--gutter {
&:before {
background-color: #d98daf;
}
}
*,
*:before,
*:after {
box-sizing: border-box;
}
body {
font-family: "Arial";
color: #222;
background-color: #f4f4f4;
line-height: 1.35;
padding: 2rem;
}
View Compiled
let addContent = document.querySelector("#addContent");
let addGutter = document.querySelector("#addGutter");
let reset = document.querySelector("#reset");
let content = document.querySelector(".p-2");
let wrapper = document.querySelector(".box");
addContent.addEventListener("click", function () {
content.classList.remove("hidden");
this.classList.add("is-active");
});
addGutter.addEventListener("click", function () {
wrapper.style.setProperty("--gutter", "stable");
this.classList.add("is-active");
/*
* This is a hack/workaround
* See the bug for details: https://bugs.chromium.org/p/chromium/issues/detail?id=1252492
* Updated, it's fixed in Chrome Canary.
*/
resetOverflow();
});
reset.addEventListener("click", function () {
content.classList.add("hidden");
wrapper.setAttribute("style", "");
addContent.classList.remove("is-active");
addGutter.classList.remove("is-active");
resetOverflow();
});
function resetOverflow() {
var timer = setTimeout(function () {
wrapper.style.overflowY = "visible";
var timer2 = setTimeout(function () {
wrapper.style.overflowY = "auto";
}, 10);
}, 30);
}
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.