Наведите и щелкните треугольник CSS

У меня есть треугольник с функцией javascript, которая перемещает это изображение.

Проблема в том, что элемент имеет квадратную форму, поэтому состояние клика и наведения запускается вне треугольника (см. красную часть на следующем изображении):

Треугольник CSS с неправильной зоной наведения и щелчка

Как предотвратить наведение курсора и нажатие за пределами треугольника и разрешить состояние щелчка/наведения только внутри треугольника?


person gn66    schedule 06.06.2014    source источник


Ответы (4)


Чтобы предотвратить наведение и щелчок за пределами треугольника 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);
}
<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>

person web-tiki    schedule 09.06.2014
comment
Хорошо, спасибо за ответ, я обновил здесь: jsfiddle.net/EdB27/2 для вас тоже вижу, что все работает нормально, мне нужна только одна вещь, если вы не возражаете, можете ли вы интегрировать это изображение в код? static.tumblr.com/g1c47pc/7iMn39g0v/tr1.png , я Мне действительно не удалось интегрировать изображение в код, который вы сделали до сих пор: S - person gn66; 09.06.2014
comment
@ gn66 рад, что ты нашел решение! - person web-tiki; 10.06.2014
comment
работает в chrome, но не работает в iceweasel (стандартный браузер в последней версии linux-ccrunchbang) 24.5.0... - person Jere; 10.06.2014
comment
@ Вы заставили меня заметить, что я сделал опечатку для браузеров, отличных от webkit или ms, я исправил эту опечатку и надеюсь, что она также исправит ее в iceweasel. - person web-tiki; 10.06.2014

Вы должны иметь возможность просто использовать карту изображений. Просто создайте один полигон, который покрывает треугольник, установив координаты (w/2, 0), (w, h), (0, h), где w и h — ширина и высота. (Предположим, что это равносторонний треугольник, как в вашем примере. В противном случае просто найдите точки с помощью редактора изображений.)

<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/

person freshtop    schedule 09.06.2014
comment
Я исправил ваш JSFiddle здесь: jsfiddle.net/QXv2c/2. Вы не включили MoverBehaviour и не было элемента с идентификатором me. В остальном все было в порядке. - person freshtop; 09.06.2014

Это должно работать: (на основе ответа Брайана Никеля на другой вопрос)

$('#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/

person myfunkyside    schedule 09.06.2014

Взято из 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/

person TheBokiya    schedule 06.06.2014
comment
Несмотря на название, кажется, что ОП уже создал треугольник. Вопрос о щелчке: есть ли способ запретить моей мыши выбирать красную часть? - person showdev; 07.06.2014
comment
@user0000000 user0000000 В заголовке вопроса изначально указывался треугольник CSS. С тех пор он был отредактирован. - person showdev; 11.06.2014