Отобразите пользовательскую горизонтальную полосу прокрутки для обоих событий 'mousemove' и 'scroll', а затем скройте полосу прокрутки, когда ни одно событие не запускается в течение ~ 1 секунды - PullRequest
3 голосов
/ 26 января 2020

У меня есть пользовательская полоса прокрутки, которую я хочу видеть только тогда, когда мышь перемещается по странице (всему телу, а не только внутри # scrolling-wrapper) или прокручивается div # scrolling-wrapper. Когда мышь все еще находится в течение ~ 1 секунды (или, как правило, долго используется по умолчанию для типичных полос прокрутки) и прокрутка отсутствует, полоса прокрутки должна исчезнуть. Он должен работать как автоматическая скрытая полоса прокрутки по умолчанию, но с моим собственным стилем. Единственное отличие состоит в том, что он также должен появляться, когда мышь перемещается, а не только когда прокручивается div, поскольку пользователи с мышью не смогут прокручивать горизонтальный div с помощью колесика мыши ... таким образом, для появления полосы прокрутки когда мышь перемещается.

Вот JSFiddle (https://jsfiddle.net/jde7s1kr/), который имеет решение @ nidhin-joseph, которое близко, но не работает правильно в 100% случаев, как Мне это нужно. Иногда полоса прокрутки не появляется при перемещении мыши или прокрутке, а иногда она не исчезает. Код также заставляет видео время от времени слегка подпрыгивать (проблема, которая не возникала до добавления событий JS для отображения / скрытия полосы прокрутки). Я предполагаю, что это связано с тем, что полоса прокрутки появляется и слегка подталкивает видео вверх. Этого также не может быть.

Итак, чтобы уточнить: когда мышь перемещается или прокручивается div, мне нужна видимая полоса прокрутки, и когда любое из этих двух действий не происходит в течение ~ 1 секунды, полоса прокрутки может исчезнуть. .

Код:

<div id="horizontalcontainer">
  <div id="scrolling-wrapper">
    <div class="videocard1">
      <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
    </div>
    <div class="videocard">
      <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
    </div>
    <div class="videocardlast">
      <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
    </div>
  </div>
</div>

::-webkit-scrollbar {
    height: 2%;
    display: var(--scroll-display);
}

:root {
    --scroll-display: none;
}

/* Track */
::-webkit-scrollbar-track {
    background: transparent;
}

/* Handle */
::-webkit-scrollbar-thumb {
    background: black;
    border-radius: 25px;
}

#horizontalcontainer {
    z-index: 0;
    position: fixed;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
}

#scrolling-wrapper {
    overflow-x: auto;
    overflow-y: hidden;
    white-space: nowrap;
    text-align: center;
    margin: 0 auto;
    height: 100vh;
    width: 100vw;
    -webkit-overflow-scrolling: touch;
    -ms-overflow-style: none;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

.videocard1 {
    padding-left: 27%;
    padding-right: 2.5%;
    display: inline-block;
    width: 46.5%;
    top: 50%;
    transform: translateY(-50%);
}

.videocard {
    padding-right: 2.5%;
    display: inline-block;
    position: relative;
    width: 46.5%;
    top: 50%;
    transform: translateY(-50%);
}

.videocardlast {
    padding-right: 27%;
    display: inline-block;
    position: relative;
    width: 46.5%;
    top: 50%;
    transform: translateY(-50%);
}

Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 февраля 2020

С учетом предоставленных вами данных, это решение предлагает вам индивидуальную настройку для вашей знаменитой пользовательской полосы прокрутки. Это решение обеспечивает совместимость браузера. Это решение предлагает только css или Css + jS обратный вызов

Обнаружены проблемы в вашем коде Вы хотите, чтобы он был совместим с браузером на 100%, но используете спецификацию c Webkit Css? По умолчанию полосы прокрутки занимают +/- 20 пикселей от области просмотра, которую обычно необходимо учитывать? Вот почему содержимое перемещается, когда вы показываете / скрываете полосы прокрутки по умолчанию. Это не ошибка, это особенность. Только на мобильном телефоне стандартная прокрутка над содержимым.

Таким образом, чтобы удовлетворить ваши требования. Вот что вам нужно сделать, использовать платформу, которая учитывает множественные предостережения разных браузеров, если нет, то вы будете постоянно настраивать Javascript и Css, чтобы протестировать его в новом браузере. В этом случае здесь я буду использовать SimpleBar, чтобы позволить вам настройку и использовать Jquery, чтобы вызвать SimpleBar Into Action и установить тайм-аут на «2000» миллисекунд. Это будет работать в современном браузере «100% времени».

Simplebar https://github.com/Grsmto/simplebar/tree/master/packages/simplebar

Рабочий JSfiddle https://jsfiddle.net/ft9h210g/12/

HTML

    <head>
        <link rel="stylesheet" href="https://unpkg.com/simplebar@latest/dist/simplebar.css" />
    </head>
<body>
    <script   src="https://code.jquery.com/jquery-3.4.1.min.js"
              integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
              crossorigin="anonymous"></script>
    <script src="https://unpkg.com/simplebar@latest/dist/simplebar.min.js"></script>

    <div id="horizontalcontainer">
      <div id="scrolling-wrapper">
        <div class="videocard1">
          <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
        </div>
        <div class="videocard">
          <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
        </div>
        <div class="videocard">
          <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
        </div>
        <div class="videocardlast">
          <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
        </div>
      </div>
    </div>
</body>

JS

    const simplebar = new SimpleBar(document.querySelector('#scrolling-wrapper'), {
    autoHide: true,
  timeout: 2000
});

css

.hidden {
  display: none;
}

#container {
  width: 200px;
}

#scrollable {
  height: 200px;
}

.simplebar {
  position: relative;
  z-index: 0;
  overflow: hidden;
  -webkit-overflow-scrolling: touch;
}

::-webkit-scrollbar {
  height: 1%;
  display: var(--scroll-display);
}

:root {
  --scroll-display: none;
}



#horizontalcontainer {
  z-index: 0;
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  width: 100%;
 /*
 height: 100%;
*/
height: 400px;
  display: flex;
  align-items: center;
}

#scrolling-wrapper {
  overflow-x: auto;
  overflow-y: hidden;
  white-space: nowrap;
  text-align: center;
  margin: 0 auto;
  height: 250px;
  width: 100vw;
/* 
 -webkit-overflow-scrolling: touch;
  -ms-overflow-style: none;
*/
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}

.videocard1 {
  padding-left: 27%;
  padding-right: 2.5%;
  display: inline-block;
  position: relative;
  width: 46.5%;
/*   top: 50%;
  transform: translateY(-50%); */
}

.videocard {
  padding-right: 2.5%;
  display: inline-block;
  position: relative;
  width: 46.5%;
 /* top: 50%;
  transform: translateY(-50%); */
}

.videocardlast {
  padding-right: 27%;
  display: inline-block;
  position: relative;
  width: 46.5%;
/*  top:0%;
  transform: translateY(-50%); */
}

Я изменил оригинал css Чтобы показать, где может отображаться горизонтальная прокрутка, например:

#horizontalcontainer {
 /*
 height: 100%; //show at the bottom
*/
height: 400px; //show after 400px
}

, но Вы можете изменить его по вкусу вашего проекта. Вы можете использовать Jquery и Simplebar из CDN или переместить файлы CSS + JS в свой проект, чтобы настроить полосу прокрутки, необходимую для загрузки простой панели. css и / или перезаписать свойства css simplebar. css со своими настройками.

1 голос
/ 26 января 2020

Вы можете использовать css-variable, чтобы установить значение для ::-webkit-scrollbar и, основываясь на движении мыши, изменить значение переменной и отследить его с помощью setInterval, чтобы скрыть полосу прокрутки через 2 секунды.

ПРИМЕЧАНИЕ : по какой-то странной причине это не работает при нажатии кнопки «Запустить фрагмент», используйте полный просмотр, и он будет работать. Угадай с помощью iframe или чего-то еще.

let div = document.getElementById('scrolling-wrapper');
var myTimer = setInterval(onTimer, 2000);

window.addEventListener('mousemove', () => {
  showScroll();
  resetTimer();
});

function onTimer() {
  hideScroll();
}

function resetTimer() {
  clearInterval(myTimer);
  myTimer = setInterval(onTimer, 2000);
}

function showScroll() {
  div.style.setProperty('--scroll-display', 'block');
}


function hideScroll() {
  div.style.setProperty('--scroll-display', 'none');
}
::-webkit-scrollbar {
  height: 1%;
  display: var(--scroll-display);
}

:root {
  --scroll-display: none;
}

#scrolling-wrapper:hover> ::-webkit-scrollbar {
  display: block;
}


/* Track */

::-webkit-scrollbar-track {
  background: transparent;
}


/* Handle */

::-webkit-scrollbar-thumb {
  background: black;
  border-radius: 25px;
}

#horizontalcontainer {
  z-index: 0;
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
}

#scrolling-wrapper {
  overflow-x: auto;
  overflow-y: hidden;
  white-space: nowrap;
  text-align: center;
  margin: 0 auto;
  height: calc(100% - 145px);
  width: 100vw;
  -webkit-overflow-scrolling: touch;
  -ms-overflow-style: none;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}

.videocard1 {
  padding-left: 27%;
  padding-right: 2.5%;
  display: inline-block;
  position: relative;
  width: 46.5%;
  top: 50%;
  transform: translateY(-50%);
}

.videocard {
  padding-right: 2.5%;
  display: inline-block;
  position: relative;
  width: 46.5%;
  top: 50%;
  transform: translateY(-50%);
}

.videocardlast {
  padding-right: 27%;
  display: inline-block;
  position: relative;
  width: 46.5%;
  top: 50%;
  transform: translateY(-50%);
}
<div id="horizontalcontainer">
  <div id="scrolling-wrapper">
    <div class="videocard1">
      <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
    </div>
    <div class="videocard">
      <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
    </div>
    <div class="videocardlast">
      <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://www.youtube.com/embed/_OBlgSz8sSM" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
    </div>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...