mui search 在苹果ios上多次点击才能调出输入法原因分析,简述pointer-events

mui中的search功能做搜索框还算好用

<div id="search" style="position: fixed;top:40px;left:0;">
	<div class="mui-input-row mui-search" id="search" >
		<input type="search" class="mui-input-clear" placeholder="请输入" v-model="searchIssue">
	</div>
</div>

但是它有一个bug,就是在pc或者安卓上没什么问题,一点击安卓上就可以弹出输入法,但在苹果ios中一般需要点两次才能弹出输入框,这是什么原因呢?

原因分析:

这需要仔细看一下页面元素是什么

审查元素后会发现页面上mui自动添加了一个mui-placeholder覆盖在input上,因为它是绝对定位的,而且z-index还是1

mui的意思就是先用个东西罩在input上充当placeholder,当点击这个遮罩时,添加类,使遮罩消失,这个源码上中有,我就不粘贴了。

原本想的是遮罩一消失,正好就相当于点在了input上,就可以调出输入法框了

在安卓上,这个想法是成立的,因为事件相应并没有延迟

但是在ios上,因为ios有一个300ms的事件延迟机制,会使得mui-placeholder遮罩层延迟300ms消失,自然点击事件就没有落在input上面,所以第一次输入法没有弹出。当点击第二次时,因为遮罩已经消失了,所以点击作用在input上,输入法调用成功。

解决思路:

方法一:由于是因为ios事件延迟机制导致,可以引入fastclick使延迟机制消失,这个具体可以百度,我是对第二种方法比较感兴趣

方法二:既然mui-placeholder消失的比较慢挡住了input点击,那就可以穿过它,直接点击它下面的那一层

这就用到了css中的point-events

pointer-events:  auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit

point-events主要是svg中确定点击定位用的,但浏览器中只支持三个值:auto,none,inherit

pointer-events属性值详解

  • auto——效果和没有定义pointer-events属性相同,鼠标不会穿透当前层。在SVG中,该值和visiblePainted的效果相同。

  • none——元素不再是鼠标事件的目标,鼠标不再监听当前层而去监听下面的层中的元素。但是如果它的子元素设置了pointer-events为其它值,比如auto,鼠标还是会监听这个子元素的。

也就是说,谁设置了pointer-events:none,那点击此元素时就会忽视此元素,直接点击到了下面那层元素上。

比如:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
<style type="text/css">
	.container{
		width:200px;height:200px;margin-left:200px;margin-top:200px;
		position: fixed;z-index:100
	}
	.div1{
		width:200px;height:200px;
		background:pink;
	}
	.div2{
		width:200px;height:200px;
		background:none;
		position: absolute;
		left:0;top:0;
		z-index: 1;
		display: inline-block;
		/*pointer-events: none;*/
	}
	.div3{
		width:200px;height:200px;
		background:none;
		position: absolute;
		left:0;top:0;
		z-index: 1;
		display: inline-block;
		/*pointer-events: none;*/
	}
</style>
	</head>
	<body>
		
		<div class="container">
			<div class="div1">
				<input type="text" />
			</div>
			<div class="div2"></div>
			<div class="div3"></div>
		</div>
		<script type="text/javascript">
			var div1=document.querySelector(".div1");
			console.log(div1)
			var div2=document.querySelector(".div2");
			var div3=document.querySelector(".div3");
			div1.addEventListener("click",function(){
				alert(111)
			})
			
			div2.addEventListener("click",function(){
				alert(222)
			},false)
			
			div3.addEventListener("click",function(){
				alert(333)
			},false)
		</script>
	</body>
</html>

三个元素重叠时,我点击最上面元素,弹出的333,注意第一层的input被挡住了,无法聚焦

 

当我把div3设置point-event:none时,再点击,则弹222,div3相当于完全被忽视了;由于div2挡住,input还是无法聚焦

.div3{
	width:200px;height:200px;
	background:none;
	position: absolute;
	left:0;top:0;
	z-index: 1;
	display: inline-block;
	pointer-events: none;
}

当我把div2也设置后,往input上面点击时,弹出111,而且input聚焦成功,相当于div2,div3都不存在一样;

.div2{
	width:200px;height:200px;
	background:none;
	position: absolute;
	left:0;top:0;
	z-index: 1;
	display: inline-block;
	pointer-events: none;
}

 

解决方法:

给mui-placeholder的css加上point-events:none,让他直接被忽略完事,相当于直接被点击在input上

.mui-search .mui-placeholder {
	pointer-events: none;
}

这样在安卓和ios输入法都可以一次调出

PS:方法很简单,关键是探索真理的过程很有趣^_^

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆趣编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值