css 防止按钮顶部的伪元素可单击

bwitn5fc  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(127)

我想做一个按钮,将在一个U形水平和这样做,我把一个白色的伪元素的顶部现有的按钮,但问题是,伪元素仍然是可点击的部分,它是在按钮的顶部。
在开始时,悬停时光标也发生了变化,但我通过将光标设置为auto来解决这个问题,因此光标变化不会发生在伪元素上,但单击事件仍然会被触发。
这是css代码和代码笔链接:https://codepen.io/SawanSunar24/pen/KKxQvWm?editors=1111

.btn {
    border: none;
    height: 60px;
    background-color: #3b82f6;
    border-radius: 0 30px 30px 0;
    color: white;
    padding-top: 5px;
    padding-bottom: 5px;
    padding-left: 40px;
    padding-right: 20px;
    position: relative;
    overflow: hidden;
    cursor: pointer;
}

.btn::before {
    background-color: white;
    border-radius: 0 100% 100% 0;
    bottom: 0px;
    left: -20px;
    content: "";
    display: block;
    height: 60px;
    cursor: auto;
    position: absolute;
    width: 40px;
}

我把各种其他元素放在按钮的顶部,但它们是不可点击的,这个问题/情况只发生在伪元素上。
如果有人能告诉我一个解决这个问题的方法,我将不胜感激,或者也许我只是很愚蠢,这是一个坏的做法,所以批评一个更好的方法也将是有益的。
谢谢你。

guicsvcw

guicsvcw1#

This answer is for the opposite problem,但是,可以应用相同的解决方案,并让您的事件处理程序检查event.target;如果是子元素,则不执行任何操作。

const btn = document.querySelector(".btn");

btn.addEventListener("click", (e) => {

  if (e.target.tagName === "SPAN") {
    e.preventDefault();
    e.stopPropagation();

    return false;
  }

  console.log("Data", e.target.tagName);

});
.main {
  padding: 100px;
}

.btn {
  border: none;
  height: 60px;
  background-color: #3b82f6;
  border-radius: 0 30px 30px 0;
  color: white;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 40px;
  padding-right: 20px;
  position: relative;
  overflow: hidden;
  cursor: pointer;
}

.btn>span {
  background-color: white;
  border-radius: 0 100% 100% 0;
  bottom: 0px;
  left: -20px;
  content: "";
  display: block;
  height: 60px;
  cursor: auto;
  position: absolute;
  width: 40px;
}
<div class="main">
  <button class="btn">
  <span></span>
  Submit
 </button>
</div>

CodePen

sigwle7e

sigwle7e2#

在我最初的回答中,我说你只需要在你的before元素中添加pointer-events: none;。正如在另一个回答中指出的,这不会有你想要的效果。下面是一个片段,展示了你如何使用clip-path来代替。

工作片段:

body {
  font-family: sans-serif;
  display: grid;
  place-content: center;
  min-height: 100vh;
  gap: 3rem;
}

.btn {
  border: none;
  border-radius: 0 30px 30px 0;
  background-color: #3b82f6;
  color: white;
  cursor: pointer;
  font: inherit;
  height: 60px;
  padding: 5px 20px 5px 40px;
  position: relative;
  overflow: hidden;
  width: 120px;
}

.btn:hover {
  background-color: red;
}

.btn.covered::before {
  aspect-ratio: 1;
  height: 100%;
  position: absolute;
  inset-block: 0;
  left: -30%;
  background-color: yellow;
  border-radius: 50%;
  content: "";
  /* ✨ Add this property ✨ */
  pointer-events: none;
}

.btn.clipped {
  clip-path: path("M120,60H0s15-10,15-30C15,10,0,0,0,0H120V60Z");
}
<button
  class="btn covered"
  type="button"
  onclick="console.log('covered')">
    covered
</button>

<button
  class="btn clipped"
  type="button"
  onclick="console.log('clipped')">
    covered
</button>

相关问题