【问题标题】:Hover and click on CSS triangle悬停并单击 CSS 三角形
【发布时间】:2014-07-28 07:07:16
【问题描述】:

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

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

如何防止在三角形外悬停和单击,并只允许在三角形内进行单击/悬停状态?

【问题讨论】:

  • 这是一个有效的解决方案吗? fileformat.info/info/unicode/char/25b2/index.htm
  • @Joe Frambach 很遗憾没有,但感谢您的想法
  • 这张图片是带有一些透明部分的PNG吗?您是否希望检测用户点击的像素是透明的还是不透明的?图像可以是任何东西,还是总是完全是这种形状的三角形?
  • 我知道一个适合你的解决方案,但是你能添加一些代码来完全理解你的问题吗?
  • 好的,感谢您的回复,这是小提琴:jsfiddle.net/EdB27/1

标签: css svg geometry css-shapes


【解决方案1】:

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

这里描述了这种技术:CSS Triangles with transform rotate

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

演示:Click and hover on a CSS triangle

.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);
}
<div class="tr"><a href="#"></a></div>

另一种方法是使用带有可点击三角形的 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;}
<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>

【讨论】:

  • 好的,非常感谢你的回答,我在这里升级了:jsfiddle.net/EdB27/2 你也看到一切正常,如果你不介意我需要一件事,你能把这个图像集成到代码中吗? static.tumblr.com/g1c47pc/7iMn39g0v/tr1.png,我真的没有成功地将图像集成到你到目前为止所做的代码中:S
  • @gn66 很高兴您找到了解决方案!
  • 在 chrome 中工作,但在 iceweasel(上一个 linux-ccrunchbang 版本中的标准浏览器)24.5.0 中不起作用...
  • @Jere 你让我注意到我为非 webkit 或 ms 浏览器写了一个错字,我修正了这个错字,希望它也能在 iceweasel 中修正它
【解决方案2】:

您应该能够只使用图像映射。只需通过将坐标设置为(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>

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

【讨论】:

  • 我已在此处修复了您的 JSFiddle:jsfiddle.net/QXv2c/2。您没有包含 MoverBehaviour,并且没有 ID 为“me”的元素。除此之外都很好。
【解决方案3】:

这应该可行: (基于Brian Nickel's answer 另一个问题)

$('#triangle').mousedown(function(e) {
    e.preventDefault();

    //create matching canvas representation for the image
    if(!this.canvas) {
        this.canvas = $('<canvas/>')[0];
        this.canvas.width = this.width;
        this.canvas.height = this.height;
        this.canvas.getContext('2d').drawImage(this, 0, 0, this.width, this.height);
    }
    var pixelData = this.canvas.getContext('2d').getImageData(e.offsetX, e.offsetY, 1, 1).data;

    //check that the pixel is not transparent
    if (pixelData[3] > 0) {
        //your code
    }
});

工作示例:http://jsfiddle.net/FCf9d/

此解决方案假定三角形内没有透明像素。
此示例使用 jsfiddle 徽标而不是三角形,因为您不能使用远程图像。 jsfiddle 徽标有效,因为它位于 jsFiddle 域上,但任何其他随机图像都不起作用。
但是,一旦您在自己的网站上实现代码,这应该不是问题。


我冒昧地为您将移动功能添加到小提琴中,这样您就可以看到所有的动作。如果您喜欢我的脚本并想为移动区域添加边界,请查看我的另一个内置这些的小提琴:http://jsfiddle.net/SN8Ys/

【讨论】:

    【解决方案4】:

    取自 CSS 技巧。这是一个很好的解决方案,但是我不确定点击部分。也许你可以用它来掩盖你所拥有的。

    HTML:

    <div class="arrow-up"></div>
    <div class="arrow-down"></div>
    <div class="arrow-left"></div>
    <div class="arrow-right"></div>
    

    CSS:

    .arrow-up {
        width: 0; 
        height: 0; 
        border-left: 5px solid transparent;
        border-right: 5px solid transparent;
    
        border-bottom: 5px solid black;
    }
    
    .arrow-down {
        width: 0; 
        height: 0; 
        border-left: 20px solid transparent;
        border-right: 20px solid transparent;
    
        border-top: 20px solid #f00;
    }
    
    .arrow-right {
        width: 0; 
        height: 0; 
        border-top: 60px solid transparent;
        border-bottom: 60px solid transparent;
    
        border-left: 60px solid green;
    }
    
    .arrow-left {
        width: 0; 
        height: 0; 
        border-top: 10px solid transparent;
        border-bottom: 10px solid transparent; 
    
        border-right:10px solid blue; 
    }
    

    来源:http://css-tricks.com/snippets/css/css-triangle/

    【讨论】:

    • 尽管标题如此,但似乎OP已经创建了三角形。问题是关于点击:“有没有办法阻止我的鼠标选择红色部分?”
    • @user0000000 问题的标题最初指定了一个 CSS 三角形。它已被编辑。
    猜你喜欢
    • 2015-01-23
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多