使用pointer-events属性,禁止部分手机微信里任何img标签点击放大全屏显示

本文介绍了解决H5页面中图片点击放大及canvas生成图片点击无效的问题,通过使用CSS属性pointer-events进行控制,实现了既禁止图片点击又支持长按保存的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一个h5活动的项目,翻来覆去要做疯了,中途也遇到了千奇百怪的问题。昨天,上线的前一刻某同事发现 他在微信里可以把页面里的logo放大,如果只是这样也还好,但是我页面里有用canvas截图生成的一张图片(base64的路径)然后出现的效果就是点击图片,屏幕出现黑色遮罩层和loading加载gif,这个肯定就得解决了。经过百度各种资料,终于找到了一个有用的属性pointer-events,先介绍一下这个属性:

pointer-events:auto | none | visiblepainted | visiblefill | visiblestroke | visible | painted | fill | stroke | all

默认值:auto

适用于:所有元素

继承性:有

动画性:否

计算值:指定值

取值:

auto:
与pointer-events属性未指定时的表现效果相同。在svg内容上与visiblepainted值相同
none:
元素永远不会成为鼠标事件的target。但是,当其后代元素的pointer-events属性指定其他值时,鼠标事件可以指向后代元素,在这种情况下,鼠标事件将在捕获或冒泡阶触发父元素的事件侦听器。
其他值只能应用在SVG上。

说明:

设置或检索在何时成为属性事件的target。
  • 使用pointer-events来阻止元素成为鼠标事件目标不一定意味着元素上的事件侦听器永不会触发。如果元素后代明确指定了pointer-events属性并允许其成为鼠标事件的目标,那么指向该元素的任何事件在事件传播过程中都将通过父元素,并以适当的方式触发其上的事件侦听器。当然位于屏幕上在父元素上但不在后代元素上的鼠标活动都不会被父元素和后代元素捕获(将会穿过父元素而指向位于其下面的元素)。
  • 对应的脚本特性为pointerEvents。

 

简单来说,这个pointer-events的属性值为none可以禁止点击事件,所以我就给所有的img标签设置了这个属性。但是问题来了,我生成的图片是需要支持在微信里长按保存的还有一个页面有图片预览的功能,这个属性把长按和点击预览都禁止了,然后解决思路就是动态改变某个img的pointer-events属性。支持长按的代码如下:

 

实际代码:

$('.myImg').on({
touchstart: function (e) {
$('.share_page').find('img').css('pointer-events','auto') //点击触发时把改变pointe-events:auto;使支持后续事件。
timeOutEvent = setTimeout(function () {
$('.share_page').find('img').css('pointer-events','auto')//这行代码应该是没用的,保险起见又加了一次
}, 100);
},
touchmove: function (e) {
clearTimeout(timeOutEvent);
timeOutEvent = 0;

},
touchend: function () {
clearTimeout(timeOutEvent);
return false;
}
})

这样就可以实现禁止默认点击图片放大,还可以支持长按弹出保存图片识别二维码,目前没发现其他兼容问题。

转载于:https://www.cnblogs.com/xunhuang/p/8965975.html

在 UniApp 中实现全局悬浮球功能,可以通过以下几种方法进行开发: ### 使用 `movable-area` 和 `movable-view` 实现悬浮球 这是微信小程序原生支持的一种方式,适用于需要拖动的悬浮元素。通过将 `movable-area` 设置为全屏覆盖,并在其中放置一个可移动的 `movable-view`,可以轻松实现悬浮球效果。 ```html <template> <view> <movable-area class="movable-area"> <movable-view class="movable-view" :x="x" :y="y" direction="all" @change="onChange"> <image src="../static/suspend.png"></image> </moving-view> </movable-area> </view> </template> <script> export default { data() { return { x: 320, // 初始x坐标 y: 520 // 初始y坐标 }; }, methods: { onChange(e) { // 拖拽过程中的位置变化处理 this.x = e.detail.x; this.y = e.detail.y; } } }; </script> <style scoped> .movable-area { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; } .movable-view { width: 96rpx; height: 96rpx; pointer-events: auto; } </style> ``` ### 全局悬浮球实现(基于 `plus.nativeObj.View`) 如果希望在 App 端实现更复杂的全局悬浮球功能(例如后台运行时仍可见),可以使用 `plus.nativeObj.View`。该 API 提供了对原生视图的操作能力,适合用于创建全局浮动窗口[^2]。 示例代码: ```javascript let url = 'https://example.com/icon.png'; let width = '40px'; let leftPos = '10px'; let bottom = '100px'; let floatBall = new plus.nativeObj.View('floatBall', { bottom: bottom, left: leftPos, width: width, height: width, radius: width }, [{ tag: 'img', id: 'icon', src: url, position: { width: width, height: width } }]); floatBall.interceptTouchEvent(true); floatBall.addEventListener('click', () => { uni.navigateTo({ url: '/pages/chat/chat' }); }); floatBall.show(); ``` ### 自定义组件 + Vuex 实现全局状态管理 为了实现全局可用的悬浮球组件,可以结合 Vue 的自定义组件和 Vuex 进行状态管理。这样可以在多个页面中统一控制悬浮球的显示与隐藏,同时避免重复渲染问题[^4]。 - 创建悬浮球组件 `SuspendBall.vue` ```html <template> <view v-if="showBall" class="suspend-ball"> <image src="/static/ball.png" @click="handleClick"></image> </view> </template> <script> export default { props: ['showBall'], methods: { handleClick() { this.$emit('click'); } } }; </script> <style scoped> .suspend-ball { position: fixed; right: 20px; bottom: 100px; width: 60px; height: 60px; z-index: 999; } </style> ``` - 在 `main.js` 中引入 Vuex 并注册全局状态 ```javascript import store from './store'; Vue.prototype.$store = store; const app = new Vue({ store, ...App }); ``` - 在任意页面中调用 ```html <suspend-ball :show-ball="showBall" @click="navigateToChat" /> ``` ### 吸附边缘功能实现 对于释放时自动吸附到屏幕左右边缘的功能,可以通过计算当前悬浮球的位置与屏幕边界的关系来判断吸附方向。具体逻辑如下: ```javascript onChange(e) { const systemInfo = uni.getSystemInfoSync(); const screenWidth = systemInfo.windowWidth; const currentX = e.detail.x; if (currentX < screenWidth / 2) { this.x = 0; // 吸附到左侧 } else { this.x = screenWidth - 96; // 吸附到右侧 } } ``` ### 总结 - 微信小程序推荐使用 `movable-area` 和 `movable-view`。 - App 端可以使用 `plus.nativeObj.View` 来实现更灵活的悬浮球。 - 对于全局状态管理,建议使用 Vuex 结合自定义组件。 - 吸附边缘功能可以通过简单的数学运算实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值