html - 溢出 :hidden not working with border-radius in Chrome

标签 html css google-chrome rounded-corners

我正在尝试制作一个圆形图像,并在悬停时显示叠加层。然而,悬停(和点击)的“hitbox”是不正确的,如下面的代码片段所示。

这个问题似乎只发生在 Chrome 中(不确定 Safari)。 我找到了 some fixes在互联网上,但没有一个有效。 JSFiddle for testing

$(document).ready(function() {
	$(".circle").click(function() {
		alert($(this).attr("id"));
	});
});
#canvas {
	width: 100%;
	padding-bottom: 75%;
	position: relative;
	overflow: hidden;
	background-color: #eee;
}
.circle {
	position: absolute;
	width: 25%;
	padding-bottom: 25%;
	border-radius: 50%;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	overflow: hidden;
	cursor: pointer;
	/*https://stackoverflow.com/a/32987370/5532169*/
	-webkit-backface-visibility: hidden;
	-moz-backface-visibility: hidden;
	/*https://stackoverflow.com/a/25206004/5532169*/
	z-index: 1;
	/*https://stackoverflow.com/a/10296258/5532169*/
	-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
	/*https://stackoverflow.com/a/16878347/5532169*/
	-webkit-mask-image: -webkit-radial-gradient(circle, white, black);
}
.mid {
	width: 100%;
	height: 100%;
	position: absolute;
}
.inner {
	width: 100%;
	height: 100%;
	position: relative;
}
.inner>* {
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	width: 100%;
	height: 100%;
}
.hover {
	background-color: rgba(255, 255, 255, 0.6);
	opacity: 0;
	transition: opacity 0.5s;
}
.hover:hover {
	opacity: 100;
	transition: opacity 0.5s;
}
span {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	width: 72%;
	text-align: center;
	font-family: monospace;
	font-size: 2em;
	font-weight: bold;
	color: #08f;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="canvas">
	<div id="div1" class="circle">
		<div class="mid">
		<div class="inner">
			<img src="https://dummyimage.com/320x320/000/fff" alt="">
			<div class="hover">
				<span>Hello World!</span>
			</div>
		</div>
		</div>
	</div>
</div>

编辑: 在 Firefox 57 中测试,没有问题。 IE 和 Edge 已经过测试,因此这是一个特定于 Chrome/webkit 的问题。

最佳答案

HTML 中的 block 是由位置 (x, y) 和大小(宽度、高度)定义的正方形,因此浏览器可以简化页面上的内容并与之交互。因此,即使有 border-radius、mask-image 等......你的 .circle div 仍然是一个正方形,里面有绘制。

enter image description here

为避免这种情况,您不能使用像 :hover 这样的动态选择器,因为它会使用 div 的形状,即正方形。您需要使用 javascript 来检测鼠标悬停在 block 上时的位置,并以此执行动画(使用正弦和余弦计算)。

你可以通过这样的方式获取鼠标位置:

<div class="circle" onmouseover="hoverFunction(e)"></div>
<script>
function hoverFunction(e) {
  var x = e.clientX;
  var y = e.clientY;
}
</script>

我还找到了this topic谈论获取元素在页面上的位置。

关于html - 溢出 :hidden not working with border-radius in Chrome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726300/

相关文章:

javascript - 如何更改地址栏的url

javascript - WebRTC - 如何设置始终使用 TURN 服务器?

javascript - 如果父 div 没有显示子项,则显示某个不同的子 div

html - textarea 适合 parent 宽度减去边距

javascript - 创建一个高度等于剩余可用空间的 div

CSS 优先边框框

html - 保留面包屑元素的颜色点击

python - 如何使用当前用户数据远程创建 Python Selenium Chrome webdriver?

javascript - 从 Canvas 数组中提取像素

javascript - 从 jquery ajax 加载导入数据时创建的重复 div 标签