uni-app slider组件在IOS nvue中中间点与手指触碰位置不一致

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app slider组件在IOS nvue中中间点与手指触碰位置不一致

操作步骤:

slider组件在IOS nvue中 中间的点跟手指触碰的地方不在同一个位置,手指点哪里 中间那个滑块就会在手指前面一段 而且能移出进度条。

预期结果:

slider组件在IOS nvue中 中间的点跟手指触碰的地方在同一个位置,手指点哪里 中间那个滑块就在哪里

实际结果:

slider组件在IOS nvue中 中间的点跟手指触碰的地方不在同一个位置,手指点哪里 中间那个滑块就会在手指前面一段 而且能移出进度条。

bug描述:

slider组件在IOS nvue中 中间的点跟手指触碰的地方不在同一个位置,手指点哪里 中间那个滑块就会在手指前面一段 而且能移出进度条。

开发环境 版本号 项目创建方式
PC开发环境操作系统 Windows 10 HBuilderX
HBuilderX类型 正式版
HBuilderX版本号 2.8.13
手机系统 iOS
手机系统版本号 iOS 13.4
手机厂商 苹果
手机机型 都会
页面类型 vue
打包方式 云端

14 回复

2024年还存在


还不如人家插件市场的小插件呢。做成这样简直了。

我也是 遇见这样 直接去进度条一半的位置 服了

这还是官方插件

我也是这个问题,而且 step 不能设置小于 1 的值。

我也碰到这个问题,苹果13 ios 15, 这都2022年了,这个问题还存在,真服了 在ios nvue下,竟然没有可用的slider组件

slider必须得在宽度750rpx下,拖动时位置才正常,一旦position:absolute,就对应不上
<view class="flex flex-row" style="position:absolute;bottom: 400rpx;left:100rpx;width:500rpx;height:80rpx;background-color: #ffffff;">
<slider min="50" value="170" max="250" show-value style="height:80rpx;flex:1;"/>
</view>

希望官方尽快修复下,都2年了

回复 东方教父: 这个问题在2022年4月26日20:47:53依然存在

别说2年了,都快3年了这个问题还是存在。服了,官方确认bug问题又不修复。

2023年6月3日依然存在无语, 不能跟其他元素共处一行…

哥你找到解决的办法了吗

2025啦,问题依旧存在

在处理uni-app中nvue(NativeScript Vue)环境下的slider组件时,如果在iOS平台上遇到中间点与手指触碰位置不一致的问题,这通常与原生组件的渲染和事件处理有关。以下是一个可能的解决方案,通过自定义slider组件来更精确地控制触摸事件和位置显示。

首先,我们需要创建一个自定义的slider组件。由于nvue支持直接使用Vue语法结合原生组件,我们可以利用这一点来更精细地处理触摸事件。

自定义Slider组件示例

  1. 创建自定义Slider组件 (MySlider.nvue)
<template>
  <view class="container">
    <view 
      class="slider-track" 
      :style="{ width: sliderWidth + 'px' }"
    >
      <view 
        class="slider-thumb" 
        :style="{ left: thumbPosition + 'px' }"
        @touchstart="onTouchStart"
        @touchmove="onTouchMove"
        @touchend="onTouchEnd"
      ></view>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      thumbPosition: 0,
      startX: 0,
      sliderWidth: 300, // 假设slider宽度为300px
      currentValue: 0
    };
  },
  methods: {
    onTouchStart(e) {
      this.startX = e.touches[0].clientX - this.$refs.thumb.offsetLeft;
    },
    onTouchMove(e) {
      let newX = e.touches[0].clientX - this.startX;
      newX = Math.max(0, Math.min(newX, this.sliderWidth));
      this.thumbPosition = newX;
      this.currentValue = newX / this.sliderWidth; // 计算当前值
    },
    onTouchEnd() {
      // 可以在这里处理值变化后的逻辑
      console.log('Current Value:', this.currentValue);
    }
  }
};
</script>

<style>
.container {
  width: 100%;
  height: 50px;
  position: relative;
}
.slider-track {
  width: 100%;
  height: 100%;
  background-color: #ddd;
  position: relative;
}
.slider-thumb {
  width: 50px;
  height: 100%;
  background-color: #007aff;
  position: absolute;
  left: 0;
  top: 0;
  border-radius: 5px;
}
</style>

使用自定义Slider组件

在你的页面或组件中引入并使用这个自定义的slider组件:

<template>
  <view>
    <MySlider />
  </view>
</template>

<script>
import MySlider from '@/components/MySlider.nvue';

export default {
  components: {
    MySlider
  }
};
</script>

上述代码提供了一个基本的自定义slider组件实现,通过监听touchstart、touchmove和touchend事件来手动控制thumb的位置,并确保其位置与手指触摸位置一致。这种方法绕过了直接使用uni-app内置slider组件可能存在的平台兼容性问题。

回到顶部