Android在滚动事件上更新内容时设置了scrollLeft不会更新滚动条位置

用户名

设置scrollLeft确实会重置滚动条的位置,并且更新内容可以按预期进行,但是同时执行这两个操作时,滚动条会变得混乱并且不会重置。

要查看预期行为与意外行为,请在带有触摸板的设备上查看每个演示,并使用触摸板在包装器内向左或向右滚动,然后尝试在android设备上执行相同的操作。

请注意,在笔记本电脑上,元素将无限滚动,而在android设备上,元素将仅滚动直到达到初始设置的“最大滚动”

应该发生什么:

当用户向左或向右滚动时,将第一个子元素移动到nodeList的末尾,或者将最后一个子元素移动到开头,然后将滚动位置重置为第一个子元素的一半。

以下是我解决此问题的尝试

  1. 设置transform: translateX(0px).inner 这里看到其中有比以前更糟的行为。

  2. 此处列出的修复程序是针对android中以前的错误的,其中设置scrollLeft根本不起作用。这根本没有帮助问题。

  3. wrap.appendChild(inner)每次滚动事件时,放慢了滚动速度,但没有解决问题,因为chrome记住滚动位置。即使我可以让chrome忘记滚动位置,这也将是一个hack(看起来似乎是合理的,但会是另一个hack)

我意识到我可以嗅探浏览器,而只是恢复到jQuery ui移动滑动设置,但是我认为,如果我能做到这一点,我就不必使用外部库来模仿本地行为(并且本地总是更好的做法) )。

var log = function(event) {
  var log = document.querySelector('.log');
  log.innerHTML = event + "<br>" + log.innerHTML;
};
var wrap = document.querySelector('.wrap');
var inner = document.querySelector('.inner');
var items = document.querySelectorAll('.item');
var controlLeft = document.createElement('a');
controlLeft.className = 'control control-left';
controlLeft.href = 'javascript:void(0)';
controlLeft.innerHTML = '&lt;';
controlLeft.onclick = function() {
  log('click left');
  inner.scrollLeft++;
};
wrap.appendChild(controlLeft);
var controlRight = document.createElement('a');
controlRight.className = 'control control-right';
controlRight.href = 'javascript:void(0)';
controlRight.innerHTML = '&gt;';
controlRight.onclick = function() {
  log('click right');
  inner.scrollLeft--;
};
wrap.appendChild(controlRight);
var darken1 = document.createElement('div');
var darken2 = document.createElement('div');
darken1.className = 'darken';
darken2.className = 'darken';
items[0].appendChild(darken1);
items[2].appendChild(darken2);
var getWidth = function(element) {
  return Number(window.getComputedStyle(element, null).getPropertyValue('width').replace('px', '')) + 1;
};
wrap.style.overflow = 'hidden';
inner.style.overflowY = 'hidden';
inner.style.overflowX = 'auto';
wrap.style.height = inner.scrollHeight + 'px';
window.onresize = function() {
  wrap.style.height = inner.scrollHeight + 'px';
  inner.scrollLeft = 0;
  inner.scrollLeft = getWidth(items[0]) / 2;
};
inner.scrollLeft = getWidth(items[0]) / 2;
oldScroll = inner.scrollLeft;
inner.onscroll = function() {
  if (inner.scrollLeft < oldScroll) {
    log('scroll right');
    inner.appendChild(inner.querySelector('.item:first-child'));
    inner.querySelector('.item:first-child').appendChild(darken1);
    inner.querySelector('.item:nth-child(3)').appendChild(darken2);
  } else if (inner.scrollLeft > oldScroll) {
    log('scroll left');
    var first = inner.querySelector('.item:first-child');
    var last = inner.querySelector('.item:last-child');
    inner.insertBefore(last, first);
    inner.querySelector('.item:first-child').appendChild(darken1);
    inner.querySelector('.item:nth-child(3)').appendChild(darken2);
  }
  inner.scrollLeft = 0;
  inner.scrollLeft = getWidth(items[0]) / 2;
  oldScroll = inner.scrollLeft;
};
*, *::before, *::after {
  box-sizing: border-box;
}
html,
body {
  padding: 0;
  margin: 0;
  max-height: 100%;
  overflow: hidden;
}
.wrap {
  position: relative;
}
.control {
  font-weight: bold;
  text-decoration: none;
  display: inline-block;
  position: absolute;
  padding: 10px;
  background: rgba(255, 255, 255, 0.5);
  top: 50%;
  transform: translateY(-50%);
  color: #FFF;
  font-size: 20pt;
}
.control-left {
  padding-right: 20px;
  border-top-right-radius: 50%;
  border-bottom-right-radius: 50%;
  left: 0;
}
.control-right {
  padding-left: 20px;
  border-top-left-radius: 50%;
  border-bottom-left-radius: 50%;
  right: 0;
}
.inner {
  font-size: 0;
  white-space: nowrap;
  overflow: auto;
}
.item {
  position: relative;
  display: inline-block;
  font-size: 1rem;
  white-space: initial;
  padding-bottom: 33.3333%;
  width: 50%;
}
.item .darken {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.8);
}
.item[data-n="2"] {
  background-image: url(http://www.lorempixel.com/400/300/animals);
  background-size: cover;
}
.item[data-n="3"] {
  background-image: url(http://www.lorempixel.com/400/300/business);
  background-size: cover;
}
.item[data-n="4"] {
  background-image: url(http://www.lorempixel.com/400/300/cats);
  background-size: cover;
}
.item[data-n="5"] {
  background-image: url(http://www.lorempixel.com/400/300/city);
  background-size: cover;
}
.item[data-n="6"] {
  background-image: url(http://www.lorempixel.com/400/300/food);
  background-size: cover;
}
.item[data-n="7"] {
  background-image: url(http://www.lorempixel.com/400/300/nightlife);
  background-size: cover;
}
.item[data-n="8"] {
  background-image: url(http://www.lorempixel.com/400/300/fashion);
  background-size: cover;
}
.item[data-n="9"] {
  background-image: url(http://www.lorempixel.com/400/300/people);
  background-size: cover;
}
.item[data-n="10"] {
  background-image: url(http://www.lorempixel.com/400/300/nature);
  background-size: cover;
}
.item[data-n="11"] {
  background-image: url(http://www.lorempixel.com/400/300/sports);
  background-size: cover;
}
.item[data-n="12"] {
  background-image: url(http://www.lorempixel.com/400/300/technics);
  background-size: cover;
}
.item[data-n="13"] {
  background-image: url(http://www.lorempixel.com/400/300/transport);
  background-size: cover;
}
<div class="wrap">
  <div class="inner">
    <div class="item" data-n="2"></div>
    <div class="item" data-n="3"></div>
    <div class="item" data-n="4"></div>
    <div class="item" data-n="5"></div>
    <div class="item" data-n="6"></div>
    <div class="item" data-n="7"></div>
    <div class="item" data-n="8"></div>
    <div class="item" data-n="9"></div>
    <div class="item" data-n="10"></div>
    <div class="item" data-n="11"></div>
    <div class="item" data-n="12"></div>
    <div class="item" data-n="13"></div>
  </div>
</div>
<div class="log">
</div>

用户名

为了暂时解决此问题,我将函数包装为超时。超时时间可短至1毫秒。我不知道为什么,但是在滚动的确切事件发生时更改内容并设置scrollLeft会导致浏览器无法重置滚动条。

演示

inner.onscroll = function() {
  window.clearTimeout(window.updateTimeout);
  window.updateTimeout = window.setTimeout(function() {
    if (inner.scrollLeft < oldScroll) {
      log('scroll right');
      inner.appendChild(inner.querySelector('.item:first-child'));
    } else if (inner.scrollLeft > oldScroll) {
      log('scroll left')
      var first = inner.querySelector('.item:first-child');
      var last = inner.querySelector('.item:last-child');
      inner.insertBefore(last, first);
    }
    inner.querySelector('.item:first-child').appendChild(darken1);
    inner.querySelector('.item:nth-child(3)').appendChild(darken2);
    inner.scrollLeft = 0;
    inner.scrollLeft = getWidth(items[0]) / 2;
    oldScroll = inner.scrollLeft;
  }, 1);
};

尽管这确实可以“解决”问题,但我认为这是一个hack。我让这个问题开放,看看我能否得到一个真正的答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更新数据时如何保持gridview滚动条的位置

来自分类Dev

删除滚动条时如何保持html内容的位置?

来自分类Dev

如何使用Tkinter更新滚动条位置

来自分类Dev

表格内容上的滚动条,android phonegap

来自分类Dev

HighCharts设置滚动条位置

来自分类Dev

滚动条设置

来自分类Dev

设置动画时禁用滚动条

来自分类Dev

将div设置为位置:用jquery固定在滚动条上,导致下面的内容跳升

来自分类Dev

在滚动到滚动条时滚动条放错了位置

来自分类Dev

在滚动到滚动条时滚动条放错了位置

来自分类Dev

没有滚动位置时,如何在Microsoft Chrome上隐藏溢出滚动条?

来自分类Dev

内容可滚动时如何隐藏滚动条?

来自分类Dev

滚动问题-当我向上滚动滚动条时不会向后滚动

来自分类Dev

不在Android网页上滚动时的CSS自动隐藏滚动条

来自分类Dev

WPF滚动条内容

来自分类Dev

滚动条无内容

来自分类Dev

在Firefox上设置滚动条的样式。如何摆脱滚动条上的黑色边框/轮廓?

来自分类Dev

表单滚动但滚动条不会移动

来自分类Dev

表单滚动但滚动条不会移动

来自分类Dev

调用setImage()后,包含ImageView的ScrollPane不会更新其滚动条。

来自分类Dev

滚动时更新div的位置

来自分类Dev

使滚动条更新另一个滚动条,反之亦然

来自分类Dev

完美滚动条不以模式显示/更新滚动条

来自分类Dev

使用$ selector.html()更新内部内容后,滚动条将重置

来自分类Dev

仅在其上设置带有滚动条的内容 div

来自分类Dev

使固定位置div可滚动而无需滚动条,也无需滚动背景内容

来自分类Dev

将水平滚动条位置设置在最右边

来自分类Dev

Delphi-获取和设置ListView的滚动条位置

来自分类Dev

jQuery-如果hasClass设置滚动条的位置

Related 相关文章

  1. 1

    更新数据时如何保持gridview滚动条的位置

  2. 2

    删除滚动条时如何保持html内容的位置?

  3. 3

    如何使用Tkinter更新滚动条位置

  4. 4

    表格内容上的滚动条,android phonegap

  5. 5

    HighCharts设置滚动条位置

  6. 6

    滚动条设置

  7. 7

    设置动画时禁用滚动条

  8. 8

    将div设置为位置:用jquery固定在滚动条上,导致下面的内容跳升

  9. 9

    在滚动到滚动条时滚动条放错了位置

  10. 10

    在滚动到滚动条时滚动条放错了位置

  11. 11

    没有滚动位置时,如何在Microsoft Chrome上隐藏溢出滚动条?

  12. 12

    内容可滚动时如何隐藏滚动条?

  13. 13

    滚动问题-当我向上滚动滚动条时不会向后滚动

  14. 14

    不在Android网页上滚动时的CSS自动隐藏滚动条

  15. 15

    WPF滚动条内容

  16. 16

    滚动条无内容

  17. 17

    在Firefox上设置滚动条的样式。如何摆脱滚动条上的黑色边框/轮廓?

  18. 18

    表单滚动但滚动条不会移动

  19. 19

    表单滚动但滚动条不会移动

  20. 20

    调用setImage()后,包含ImageView的ScrollPane不会更新其滚动条。

  21. 21

    滚动时更新div的位置

  22. 22

    使滚动条更新另一个滚动条,反之亦然

  23. 23

    完美滚动条不以模式显示/更新滚动条

  24. 24

    使用$ selector.html()更新内部内容后,滚动条将重置

  25. 25

    仅在其上设置带有滚动条的内容 div

  26. 26

    使固定位置div可滚动而无需滚动条,也无需滚动背景内容

  27. 27

    将水平滚动条位置设置在最右边

  28. 28

    Delphi-获取和设置ListView的滚动条位置

  29. 29

    jQuery-如果hasClass设置滚动条的位置

热门标签

归档