悬停并单击CSS三角形

gn6*_*n66 8 css geometry svg css3 css-shapes

我有一个带有javascript函数的三角形可以移动该图像.

问题是该元素具有方形形状,因此在三角形之外触发点击和悬停状态(参见下图中的红色部分):

带有错误悬停和点击区域的CSS三角形

如何防止悬停并在三角形外部单击并仅允许在三角形内部单击/悬停状态?

web*_*iki 14

防止悬停并在CSS三角形外部单击,可以使用变换来制作三角形.

这里描述了这种技术:带有变换旋转的CSS三角形

关键是要使用一个带有隐藏溢出的包装器并旋转可点击/可移动元素,使其实际上具有三角形形状,并防止点击事件或悬停状态在三角形外部.

演示:单击并将鼠标悬停在CSS三角形上

悬停并单击CSS三角形 悬停状态和单击事件仅在三角形内触发

.tr {
  width: 40%;
  padding-bottom: 28.2842712474619%; /* = width / sqrt(2) */
  position: relative;
  overflow: hidden;
}
.tr a {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  background-color: rgba(0, 122, 199, 0.7);
  transform-origin: 0 100%;
  transform: rotate(45deg);
  transition: background-color .3s;
}
/** hover effect **/
.tr a:hover {
  background: rgba(255, 165, 0, 0.7);
}
Run Code Online (Sandbox Code Playgroud)
<div class="tr"><a href="#"></a></div>
Run Code Online (Sandbox Code Playgroud)


另一种方法是使用带有可点击三角形的SVG:

#tr{
  fill:transparent;
  transition:fill .3s;
}
#tr:hover{
  fill: orange;
}

/** for the demo **/
html,body{height:100%;margin:0; padding:0;}
body{background:url('https://farm8.staticflickr.com/7435/13629508935_62a5ddf8ec_c.jpg') center no-repeat;background-size:contain;}
svg{display:block;width:30%;margin:0 auto;}
Run Code Online (Sandbox Code Playgroud)
<svg viewbox="-2 -2 104 64">
  <a xlink:href="#">
    <polygon id="tr" points="50 0 100 60 0 60" fill="transparent" stroke="darkorange" stroke-width="2"/>
  </a>
</svg>
Run Code Online (Sandbox Code Playgroud)


fre*_*top 5

您应该能够只使用图像映射。只需通过将坐标设置为宽度和高度的(w/2, 0), (w, h), (0, h)位置wh位置来创建一个覆盖三角形的多边形。(假设像您的示例中那样是等边三角形。否则只需使用图像编辑器找到点。)

<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Green_equilateral_triangle_point_up.svg/600px-Green_equilateral_triangle_point_up.svg.png"
     width="60" height="52"
     usemap="#imgmap" />

<map name="imgmap">
    <area href="javascript:alert('Triggered')"
          shape="poly"
          coords="30,0,60,52,0,52"
          style="outline:none;"
          target="_self" />
</map>
Run Code Online (Sandbox Code Playgroud)

演示:http : //jsfiddle.net/QXv2c/