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

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
打包方式 云端

更多关于uni-app slider组件在IOS nvue中中间点与手指触碰位置不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html

14 回复

2024年还存在

更多关于uni-app slider组件在IOS nvue中中间点与手指触碰位置不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html


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

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

这还是官方插件

我也是这个问题,而且 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组件可能存在的平台兼容性问题。

回到顶部