Как я могу отключить браузер или полосу прокрутки элемента, но все же разрешить прокрутку с помощью колесика или клавиш со стрелками?

Я хочу скрыть любые полосы прокрутки от моего div элементы и мое целое body, но все же позволяйте пользователю прокручивать колесико мыши или клавиши со стрелками. Как этого можно достичь с помощью необработанного JavaScript или jQuery? Есть идеи?

7 ответов

Как и предыдущие ответы, вы бы использовали overflow:hidden отключить полосы прокрутки на теле / ​​div.

Тогда вы бы связать mousewheel событие в функцию, которая изменит scrollTop div, чтобы подражать прокрутке.

Для клавиш со стрелками, вы должны связать keydown событие, чтобы распознать клавишу со стрелкой, а затем изменить scrollTop а также scrollLeft деления в зависимости от обстоятельств для имитации прокрутки. (Примечание: вы используете keydown вместо keypress поскольку IE не распознает keypress для клавиш со стрелками.)
Изменить: я не мог заставить FF/Chrome распознать keydown на div, но это работает в IE8. В зависимости от того, для чего вам это нужно, вы можете установить keydown слушатель на document прокрутить div. (Проверьте ссылку на код клавиши в качестве примера.)

Например, прокрутка с помощью колесика мыши (с помощью jQuery и плагина mousewheel):

<div id="example" style="width:300px;height:200px;overflow:hidden">
insert enough text to overflow div here
</div>

<script>
$("#example").bind("mousewheel",function(ev, delta) {
    var scrollTop = $(this).scrollTop();
    $(this).scrollTop(scrollTop-Math.round(delta));
});
</script>

(Это быстрый макет, вам придется корректировать числа, так как для меня это прокручивается немного медленно.)

ссылка keyCode
плагин колесика мыши
keydown, нажатие клавиши @ quirksmode

Обновление 19.12.2012:

Обновленное местоположение плагина mousewheel: https://github.com/brandonaaron/jquery-mousewheel

А как насчет чисто CSS-решения? Я проверил это, и он отлично работает. Однако я бы порекомендовал решение 3, так как оно не хакерское, оно поддерживается всеми браузерами с JS и очень простое.

Решение 1 (кросс-браузер, но более хакерский)

#div {
  position: fixed;
  right: -20px;
  left: 20px;
  background-color: black;
  color: white;
  height: 5em;
  overflow-y: scroll;
  overflow-x: hidden;
}
<html>

<body>
  <div id="div">
    Scrolling div with hidden scrollbars!<br/>
    On overflow, this div will scroll with the mousewheel but scrollbars won't be visible.<br/>
    Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>
  </div>
</body>

</html>

Решение 2 (только IE и Chrome)

Просто добавьте nobars класс для любого элемента, на котором вы хотите скрыть полосы прокрутки.

Firefox overflow: -moz-scrollbars-none является, согласно MDN, устаревшим. Раньше работал, но теперь скрывает переполнение и отключает прокрутку, если используется.

.nobars {
    /* Firefox: https://developer.mozilla.org/en/docs/Web/CSS/overflow */
    /* overflow: -moz-scrollbars-none; (no longer works) */
    /* IE: https://msdn.microsoft.com/en-us/library/hh771902(v=vs.85).aspx */
    -ms-overflow-style: none;
}
.nobars::-webkit-scrollbar {
    /* Chrome: https://css-tricks.com/custom-scrollbars-in-webkit/ */
    display: none;
}

Решение 3 (кросс-браузерный JavaScript)

Perfect Scrollbar не требует jQuery (хотя он может использовать jQuery, если установлен) и имеет демоверсию, доступную здесь. Компоненты могут быть стилизованы с помощью CSS, как в следующем примере:

.ps-scrollbar-y-rail {
  display: none !important;
}

Вот полный пример, включающий реализацию Perfect Scrollbar:

<link rel="stylesheet" href="css/perfect-scrollbar.min.css">
<style>
  #container {
    position: relative; /* can be absolute or fixed if required */
    height: 200px; /* any value will do */
    overflow: scroll;
  }
  .ps-scrollbar-y-rail {
    display: none !important;
  }
</style>
<script src='js/perfect-scrollbar.min.js'></script>

<div id="container">
  Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>
</div>

<script>
  // on dom ready...
  var container = document.getElementById("container");
  Ps.initialize(container);
  //Ps.update(container);
  //Ps.destroy(container);
</script>

Вам не нужно использовать jquery или js, чтобы сделать это. Это более производительный с простым webkit.

Просто добавьте приведенный ниже код в ваш файл CSS.

::-webkit-scrollbar { 
    display: none; 
}

Осторожно! Это отключит все полосы прокрутки, поэтому обязательно поместите их в определенный класс или идентификатор, если вы просто хотите, чтобы он был скрыт.

Я предпочитаю ответ SamGoody, предоставленный дубликату этого вопроса. Он оставляет нетронутыми собственные эффекты прокрутки, вместо того, чтобы пытаться вручную повторно реализовать несколько конкретных устройств ввода:

Лучшее решение - установить для целевого элемента div значение overflow: scroll и обернуть его во второй элемент, который на 8px уже, который переполняется: скрытый.

Смотрите оригинальный комментарий для подробного примера. Возможно, вы захотите использовать JavaScript для определения фактического размера полос прокрутки, а не предполагать, что они всегда имеют ширину 8 пикселей, как в его примере.

Чтобы это работало на меня, я использовал этот CSS:

html { overflow-y: hidden; }

Но у меня были проблемы с использованием $(this).scrollTop(), поэтому я привязал к своему #id, но настроил scrollTop окна. Кроме того, моя мышь с плавной прокруткой запускает много 1 или -1 дельты, поэтому я умножил это на 20.

$("#example").bind("mousewheel", function (ev, delta) {
    var scrollTop = $(window).scrollTop();
    $(window).scrollTop(scrollTop - Math.round(delta * 20));
});

Как сказал выше Балдрани

::-webkit-scrollbar { display: none; }

Или вы можете сделать

::-webkit-scrollbar{ width: 0px; }


(опубликовано для других людей, которые наткнулись на это из поиска Google!)

Ну, возможно, не самый интуитивный, на мой взгляд, но я могу представить, что вы можете сделать это достойным опытом, попробуйте.

overflow:hidden; 

убедитесь, что родительский объект имеет height а также widthи отображается как block

Другие вопросы по тегам