不滚动时隐藏滚动条(Mac 类似行为)
Hide scrollbar when not scrolling (Mac like behaviour)
我在 Mac 浏览器上的 Vue 网络应用程序显示了非常优雅的滚动条。但是 Windows 上的同一应用程序打破了 UI,因为宽度太大并且滚动始终可见。
为了解决这个问题,我从 CSS 创建了滚动条,并添加了事件侦听器以仅在滚动条开始滚动时显示它。
div * {
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
::-webkit-scrollbar-track {
-webkit-box-shadow: none !important;
background-color: transparent;
}
::-webkit-scrollbar {
width: 3px !important;
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: transparent;
}
}
.on-scrollbar{
scrollbar-width: thin; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
}
.on-scrollbar::-webkit-scrollbar-track {
-webkit-box-shadow: none !important;
background-color: transparent !important;
}
.on-scrollbar::-webkit-scrollbar {
width: 6px !important;
background-color: transparent;
}
.on-scrollbar::-webkit-scrollbar-thumb {
background-color: #acacac;
}
JS:
window.addEventListener('scroll', (e) => {
if (e.target.classList.contains("on-scrollbar") === false) {
e.target.classList.add("on-scrollbar");
}
}, true);
但问题是,一旦滚动条可见。不滚动时我无法 remove/hide 滚动条。基本上我正在尝试实现我们在 Mac 上的滚动条的默认行为。
谁能帮我解决这个问题?
希望这对您有所帮助。滚动条的一些去抖动和 css。如果你想改变改变宽度的样式/动画,有更好的资源。祝你好运!
function debounce(func, timeout = 300){
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => { func.apply(this, args); }, timeout);
};
}
window.addEventListener("mousewheel", e => {
document.querySelector("div").classList.remove("hidden");
});
window.addEventListener("mousewheel", debounce(e => {
document.querySelector("div").classList.add("hidden");
}));
div {
background: gray;
overflow: auto;
height: 300px;
width: 100%;
}
div > div {
background: lighblue;
height: 800px;
}
/* width */
.shown::-webkit-scrollbar {
width: 10px;
}
/* width */
.hidden::-webkit-scrollbar {
width: 0px;
}
/* Track */
::-webkit-scrollbar-track {
background: black;
}
/* Handle */
::-webkit-scrollbar-thumb {
background: white;
}
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
background: lightblue;
}
<div class="shown">
<div></div>
</div>
window.addEventListener('scroll', (e) => {
if (e.target.classList.contains("on-scrollbar") === false) {
e.target.classList.add("on-scrollbar");
}else{
setTimeout(function(){
e.target.classList.remove("on-scrollbar");
},2000)
}
}, true);
我在 Mac 浏览器上的 Vue 网络应用程序显示了非常优雅的滚动条。但是 Windows 上的同一应用程序打破了 UI,因为宽度太大并且滚动始终可见。
为了解决这个问题,我从 CSS 创建了滚动条,并添加了事件侦听器以仅在滚动条开始滚动时显示它。
div * {
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
::-webkit-scrollbar-track {
-webkit-box-shadow: none !important;
background-color: transparent;
}
::-webkit-scrollbar {
width: 3px !important;
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: transparent;
}
}
.on-scrollbar{
scrollbar-width: thin; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
}
.on-scrollbar::-webkit-scrollbar-track {
-webkit-box-shadow: none !important;
background-color: transparent !important;
}
.on-scrollbar::-webkit-scrollbar {
width: 6px !important;
background-color: transparent;
}
.on-scrollbar::-webkit-scrollbar-thumb {
background-color: #acacac;
}
JS:
window.addEventListener('scroll', (e) => {
if (e.target.classList.contains("on-scrollbar") === false) {
e.target.classList.add("on-scrollbar");
}
}, true);
但问题是,一旦滚动条可见。不滚动时我无法 remove/hide 滚动条。基本上我正在尝试实现我们在 Mac 上的滚动条的默认行为。 谁能帮我解决这个问题?
希望这对您有所帮助。滚动条的一些去抖动和 css。如果你想改变改变宽度的样式/动画,有更好的资源。祝你好运!
function debounce(func, timeout = 300){
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => { func.apply(this, args); }, timeout);
};
}
window.addEventListener("mousewheel", e => {
document.querySelector("div").classList.remove("hidden");
});
window.addEventListener("mousewheel", debounce(e => {
document.querySelector("div").classList.add("hidden");
}));
div {
background: gray;
overflow: auto;
height: 300px;
width: 100%;
}
div > div {
background: lighblue;
height: 800px;
}
/* width */
.shown::-webkit-scrollbar {
width: 10px;
}
/* width */
.hidden::-webkit-scrollbar {
width: 0px;
}
/* Track */
::-webkit-scrollbar-track {
background: black;
}
/* Handle */
::-webkit-scrollbar-thumb {
background: white;
}
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
background: lightblue;
}
<div class="shown">
<div></div>
</div>
window.addEventListener('scroll', (e) => {
if (e.target.classList.contains("on-scrollbar") === false) {
e.target.classList.add("on-scrollbar");
}else{
setTimeout(function(){
e.target.classList.remove("on-scrollbar");
},2000)
}
}, true);