uni-app button组件hover-class触发次数异常
uni-app button组件hover-class触发次数异常
操作步骤:
运行到EDGE浏览器,打开调试器,切换移动端模式
<button hover-class="oprate-btn-hover" class="oprate-btn">xx</button>
<button hover-class="oprate-btn-hover" class="oprate-btn">xx</button>
<button hover-class="oprate-btn-hover" class="oprate-btn">xx</button>
.oprate-btn {
width: 150rpx;
max-width: calc((100% - 100rpx) / 3);
min-width: 100rpx;
height: 60rpx;
line-height: 58rpx;
text-align: center;
color: #ff5833;
border-color: #ff5833;
background-color: transparent;
font-size: 28rpx;
margin: 0 0;
&::after {
display: none;
}
}
.oprate-btn-hover {
background-color: #ff583320;
}
预期结果:
运行到h5端点击触发一次hover-class
实际结果:
触发多次hover-class
bug描述:
button组件在运行到h5浏览器的移动端模式页面时hover-class单击后会连续触发两次,官方提供的网页代码也有如下bug,以下是录屏效果
更多关于uni-app button组件hover-class触发次数异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
是什么样的效果呢?能录屏看下嘛?我测试没发现有问题 换其他浏览器试试呢?
测试视频:https://mp-f31011df-efe5-4e43-a4b4-0bb25f1edafe.cdn.bspapp.com/屏幕录制2025-02-20 下午3.08.39.mp4
更多关于uni-app button组件hover-class触发次数异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
好的,视频附件上传了
试试移动端页面
回复 h***@163.com: 就是移动端页面 我在真机上也测试了 没出现你这情况
回复 爱豆豆: 你那边其他手机或者浏览器都会出现这个问题吗?
回复 爱豆豆: 只有移动端浏览器有这个问题,小程序没有,我也好奇啊,我昨天测试没问题的,昨天下午更新了一下编译器版本,今天h5按钮全变这样了,我现在把版本回退了,还是一样
回复 h***@163.com: 在你的浏览器上 试试 官方的模版项目中的buttonn有没有问题呢 https://hellouniapp.dcloud.net.cn/pages/component/button/button
回复 爱豆豆: 也有的,我这次把操作全录上
回复 爱豆豆: 只要是移动端模式下,单击就会闪两次
经过我测试,我的最新版 google chrome 、手机上的 alook 浏览器运行官方示例项目,button 表现都正常。
但是电脑上使用 edge 模拟手机的确会闪烁两次,使用隐私模式是两次,我进一步排查一下,不排除是部分浏览器的问题。
你也补充一下你具体测试的浏览器。
我刚把Edge更新到133.0.3065.82 (正式版本) (64 位)后就出现了 闪烁的问题 我之前用的Edge版本是 122.0.2365.92 (正式版本) (64 位) 没出现闪烁问题 隐私模式也不会出现闪烁
问题中提供了edge的浏览器版本信息,只有edge浏览器运行时有这个问题
目前谷歌浏览器也遇到了一样的问题,给view元素添加hover-stay-time之后,hover效果就会触发两次,如果只有hover-class则不会
不排除是 chrome 的 bug。我测试 chrome 131 是好的,chrome 133 是坏的,只会在 pc 浏览器上模拟移动端出现,真机测试移动端未复现。你是上面的测试方式吗?
这个问题是uni-app在H5端对移动端浏览器模拟点击事件的兼容性问题导致的。hover-class在移动端会同时响应touchstart和touchend事件,造成多次触发。
解决方案:
- 使用自定义处理替代hover-class:
<button
class="oprate-btn"
@touchstart="handleTouchStart"
@touchend="handleTouchEnd"
>xx</button>
- 在methods中添加处理逻辑:
methods: {
handleTouchStart(e) {
e.currentTarget.classList.add('oprate-btn-hover')
},
handleTouchEnd(e) {
e.currentTarget.classList.remove('oprate-btn-hover')
}
}
- 或者使用CSS媒体查询限制只在非触摸设备生效:
[@media](/user/media) (hover: hover) {
.oprate-btn-hover:hover {
background-color: #ff583320;
}
}