scrollWxs.wxs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. function scroll(event, ownerInstance) {
  2. // detail中含有scroll-view的信息,比如scroll-view的实际宽度,当前时间点scroll-view的移动距离等
  3. var detail = event.detail;
  4. var scrollWidth = detail.scrollWidth;
  5. var scrollLeft = detail.scrollLeft;
  6. // 获取当前组件的dataset,说白了就是祸国殃民的腾xun搞出来的垃ji
  7. var dataset = event.currentTarget.dataset;
  8. // 此为scroll-view外部包裹元素的宽度
  9. // 某些HX版本(3.1.18),发现view元素中大写的data-scrollWidth,在wxs中,变成了全部小写,所以这里需要特别处理
  10. var scrollComponentWidth = dataset.scrollWidth || dataset.scrollwidth || 0;
  11. // 指示器和滑块的宽度
  12. var indicatorWidth = dataset.indicatorWidth || dataset.indicatorwidth || 0;
  13. var barWidth = dataset.barWidth || dataset.barwidth || 0;
  14. // 检查是否显示指示器
  15. var indicator = dataset.indicator;
  16. // 此处的计算理由为:scroll-view的滚动距离与目标滚动距离(scroll-view的实际宽度减去包裹元素的宽度)之比,等于滑块当前移动距离与总需
  17. // 滑动距离(指示器的总宽度减去滑块宽度)的比值
  18. var x = (scrollLeft / (scrollWidth - scrollComponentWidth)) * (indicatorWidth - barWidth);
  19. setBarStyle(ownerInstance, x, indicator);
  20. }
  21. // 由于webview的无能,无法保证scroll-view在滑动过程中,一直触发scroll事件,会导致
  22. // 无法监听到某些滚动值,当在首尾临界值无法监听到时,这是致命的,因为错失这些值会导致滑块无法回到起点和终点
  23. // 所以这里需要对临界值做监听并处理
  24. function scrolltolower(event, ownerInstance) {
  25. ownerInstance.callMethod('scrollEvent', 'right');
  26. // 获取当前组件的dataset
  27. var dataset = event.currentTarget.dataset;
  28. // 指示器和滑块的宽度
  29. var indicatorWidth = dataset.indicatorWidth || dataset.indicatorwidth || 0;
  30. var barWidth = dataset.barWidth || dataset.barwidth || 0;
  31. // 检查是否显示指示器
  32. var indicator = dataset.indicator;
  33. // scroll-view滚动到右边终点时,将滑块也设置为到右边的终点,它所需移动的距离为:指示器宽度 - 滑块宽度
  34. setBarStyle(ownerInstance, indicatorWidth - barWidth, indicator);
  35. }
  36. function scrolltoupper(event, ownerInstance) {
  37. ownerInstance.callMethod('scrollEvent', 'left');
  38. // 获取当前组件的dataset
  39. var dataset = event.currentTarget.dataset;
  40. // 检查是否显示指示器
  41. var indicator = dataset.indicator;
  42. // 滚动到左边时,将滑块设置为0的偏移距离,回到起点
  43. setBarStyle(ownerInstance, 0, indicator);
  44. }
  45. function setBarStyle(ownerInstance, x, indicator) {
  46. // 只有当 indicator 为 true 时才操作指示器元素
  47. if (indicator) {
  48. var barElement = ownerInstance.selectComponent('.u-scroll-list__indicator__line__bar');
  49. if (barElement) {
  50. barElement.setStyle({
  51. transform: 'translateX(' + x + 'px)'
  52. });
  53. }
  54. }
  55. }
  56. module.exports = {
  57. scroll: scroll,
  58. scrolltolower: scrolltolower,
  59. scrolltoupper: scrolltoupper
  60. };