【问题标题】:Input range slider not working on iOS Safari when clicking on track单击轨道时,输入范围滑块在 iOS Safari 上不起作用
【发布时间】:2016-01-25 10:34:23
【问题描述】:

我有一个非常直接的范围输入滑块。它适用于除 iOS Safari 之外的所有浏览器。

我遇到的主要问题是当我单击滑块轨道时,它不会移动滑块。它只是突出显示滑块。拖动拇指时效果很好。有关如何解决此问题的任何想法?

<div class="slider-wrap">
    <div id="subtractBtn"></div>
    <input type="range" class="slider">
    <div id="addBtn"></div>
</div>

【问题讨论】:

标签: ios html mobile-safari


【解决方案1】:

对于那些 仍然 像我一样寻找 javascript only 修复程序的人。我最终只是为此做了一个“polyfill”;它依赖于滑块的 max 属性并确定在 iOS 上强制输入范围的最佳步骤。你可以稍后感谢我:)

var diagramSlider = document.querySelector(".diagram-bar");

function iosPolyfill(e) {
  var val = (e.pageX - diagramSlider.getBoundingClientRect().left) /
   (diagramSlider.getBoundingClientRect().right - diagramSlider.getBoundingClientRect().left),
  max = diagramSlider.getAttribute("max"),
  segment = 1 / (max - 1),
  segmentArr = [];

  max++;

  for (var i = 0; i < max; i++) {
    segmentArr.push(segment * i);
  }

  var segCopy = segmentArr.slice(),
  ind = segmentArr.sort((a, b) => Math.abs(val - a) - Math.abs(val - b))[0];

  diagramSlider.value = segCopy.indexOf(ind) + 1;
}

if (!!navigator.platform.match(/iPhone|iPod|iPad/)) {
  diagramSlider.addEventListener("touchend", iosPolyfill, {passive: true});
}
&lt;input type="range" max="6" min="1" value="1" name="diagram selector" class="diagram-bar" /&gt;

【讨论】:

    【解决方案2】:

    Cameron Gilbert 提出的解决方案的增强版。此实现适用于最小值设置为负数和可选步长设置的滑块。

    对于那些不使用打字稿的人,我把它留给你转换成普通的 javascript。

    if (!!navigator.platform.match(/iPhone|iPad|iPod/)) {
    mySlider.addEventListener(
        "touchend",
        (touchEvent: TouchEvent) => {
            var element = touchEvent.srcElement as HTMLInputElement;
            if (element.min && element.max && touchEvent.changedTouches && touchEvent.changedTouches.length > 0) {
                const max = Number(element.max);
                const min = Number(element.min);
                let step = 1;
                if (element.step) {
                    step = Number(element.step);
                }
                //Calculate the complete range of the slider.
                const range = max - min;
    
                const boundingClientRect = element.getBoundingClientRect();
                const touch = touchEvent.changedTouches[0];
    
                //Calculate the slider value
                const sliderValue = (touch.pageX - boundingClientRect.left) / (boundingClientRect.right - boundingClientRect.left) * range + min;
    
                //Find the closest valid slider value in respect of the step size
                for (let i = min; i < max; i += step) {
                    if (i >= sliderValue) {
                        const previousValue = i - step;
                        const previousDifference = sliderValue - previousValue;
                        const currentDifference = i - sliderValue;
                        if (previousDifference > currentDifference) {
                            //The sliderValue is closer to the previous value than the current value.
                            element.value = previousValue.toString();
                        } else {
                            element.value = i.toString();
                        }
    
                        //Trigger the change event.
                        element.dispatchEvent(new Event("change"));
                        break;
                    }
                }
            }
        },
        {
            passive: true
        }
    );
    

    }

    【讨论】:

      【解决方案3】:

      Safari 5.1 + 应该完全支持“范围”类型 - 所以奇怪的是它不起作用。 您是否尝试添加最小/最大/步长值?尝试仅使用纯 HTML 属性而不使用任何可能干扰的类怎么样 - 尝试粘贴此代码并在 Safari 浏览器上运行它

      &lt;input type="range" min="0" max="3.14" step="any"&gt;

      • 它应该可以工作 - 如果可以,它可能与您的 css 相关,如果没有,请尝试使用此处的纯 HTML 示例之一:

      https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range

      【讨论】:

      【解决方案4】:

      将 CSS 属性 -webkit-tap-highlight-color: transparent 添加到元素的 CSS 或完整的 html 页面。这将消除在移动设备上点击元素时对元素的麻烦突出效果。

      【讨论】:

      • 这个完全不行,你还有什么建议吗?
      • 它确实消除了高亮效果,不是吗?为我工作。
      • 它移除了效果,但轨道无法选择,我使用了一个名为 rangetouch 的小 JS 文件解决了这个问题
      【解决方案5】:

      尝试使用jQuery Mobile?解决方法是令人讨厌的,我很确定没有办法将本机界面与标准 HTML 一起使用。从其他线程看来,您可以做一个精心设计的 CSS/JS 解决方案。

      【讨论】:

      • 因为你不应该导入(大量)库来解决问题
      猜你喜欢
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多