Как по диагонали разделить квадратный div на 4 части, доступные для нажатия?

Вот как по диагонали «поделить» квадрат на 4 части:

div {
  width: 0;
  height: 0;
  border-top: 50px solid red;
  border-right: 50px solid blue;
  border-bottom: 50px solid green;
  border-left: 50px solid yellow;
}
<div>
</div>

(результат)

Как по диагонали разделить квадратный div на 4 части, доступные для нажатия?

Я хочу прикрепить событие к каждой цветной области, но, конечно, вы не можете прикрепить событие к границе. Как мне поступить?

проверьте положение мыши, когда произошел щелчок, и перейдите оттуда (лучше было бы использовать 4 разных div ofc)

Adelin 14.06.2018 15:11

Использование 4 div может быть оптимальным решением, как предложил @Adelin. Проверить этот вопрос в stackoverflow

samuellawrentz 14.06.2018 15:13

Можно ли в эту форму поместить 4 div? Я имею в виду, можно ли сделать настоящий (не только визуально) треугольник div?

akai 14.06.2018 15:16

Вы могли бы вложить четыре div в одну оболочку. Поверните эту обертку на 45 градусов. Затем вы могли бы вставить эту оболочку в другой div и обрезать переполнение?

TheCrzyMan 14.06.2018 15:18

@samuellawrentz Я проверил ссылку, но не думаю, что ответ применим в моем случае.

akai 14.06.2018 15:19

Вы можете использовать холст или карту

Sheki 14.06.2018 15:23

@TheCrzyMan Звучит неплохо, но я обнаружил, что вам нужно создать (настоящий) наклонный контур исходной оболочки, что, как мне кажется, невозможно (хотя обтравочный контур может помочь).

akai 14.06.2018 15:28

@akai Выбрав направление движения, отметьте один из ответов как «ответ». Мне лично нравится ответ Аделин. Но мне нравится JS больше, чем HTML / CSS. Личное предпочтение.

TheCrzyMan 14.06.2018 16:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
8
284
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы хотите использовать один div / другую логику в зависимости от местоположения, это может помочь.

Я просто написал это в консоли этой страницы:

document.body.addEventListener("click",(e)=>console.info(e))

И щелкнул в этом порядке по этим частям: "yellow", "red", "blue", "green" вашего образа. (Я держал ctrl при нажатии, чтобы он открывал изображение в новой вкладке, и эта страница сохранялась)

Результирующие события (4 зарегистрированные, ofc) имели атрибут path, который указывал, на каком элементе я щелкнул (в данном случае основным был img), и смещение X и смещение Y относительно этого элемента.

Отношение было:

{
  "yellow": {offsetX: 18, offsetY: 59},
  "red": {offsetX: 59, offsetY: 25},
  "blue": {offsetX: 85, offsetY 46},
  "green": {offsetX: 61, offsetY: 78},
}

Так что да, вы можете использовать из MouseEvent:

  • offsetX

    The offsetX read-only property of the MouseEvent interface provides the offset in the X coordinate of the mouse pointer between that event and the padding edge of the target node.

  • offsetY

    The offsetY read-only property of the MouseEvent interface provides the offset in the Y coordinate of the mouse pointer between that event and the padding edge of the target node.

И определите, где щелкнул пользователь.

Буду читать, спасибо. Совершенно нормально использовать 4 блока, но, комментируя исходный пост, я считаю, что заполнение блока четырьмя блоками в этой форме, возможно, довольно сложно.

akai 14.06.2018 15:33

Вот один из способов сделать это. Вложенные DIV. Я использовал обертку с сеткой, чтобы выложить их по шаблону 2x2, затем перевел и повернул обертку. Обрезано с использованием самого внешнего div. Для каждого из них легко использовать onclick, и вам не нужно выполнять дополнительную логику. Просто гораздо больше усилий для настройки.

У меня также есть эта настройка, чтобы вы могли легко изменять размер квадратов. Однако это определенно не будет работать в IE, но я не думаю, что нам действительно нужно об этом беспокоиться.

Рабочий код

document.querySelector(".red").onclick = () => alert("red");

document.querySelector(".blue").onclick = () => alert("blue");

document.querySelector(".yellow").onclick = () => alert("yellow");

document.querySelector(".green").onclick = () => alert("green");
.clip {
  --size: 200px;
  height: var(--size);
  width: var(--size);
  overflow-x: hidden;
  overflow-y: hidden;
}

.rotate {
  height: calc(var(--size) * 1.5);
  width: calc(var(--size) * 1.5);
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr;
  transform: translate(-50%, -50%) translate(calc(var(--size) * 0.5), calc(var(--size) * 0.5)) rotate(45deg) ;
}

.red {
  background: red;
}
.blue {
  background: blue;
}
.yellow {
  background: yellow;
}
.green {
  background: green;
}
<div class = "clip">
  <div class = "rotate">
    <div class = "red">&nbsp;</div>
    <div class = "blue">&nbsp;</div>
    <div class = "yellow">&nbsp;</div>
    <div class = "green">&nbsp;</div>
  </div>
</div>

Вы можете использовать путь клипа для создания треугольников и использовать некоторое позиционирование, чтобы поместить их в правильные места.

document.querySelector('.sq-tri').addEventListener("click", (evt) => {
  console.info(evt.target.getAttribute('data-location'))
})
.sq-tri {
  display: relative;
  width: 5em;
  height: 5em;
}

.tri {
  position: absolute;
}

.tri-up,
.tri-down {
  width: 5em;
  height: 2.5em;
}

.tri-left,
.tri-right {
  width: 2.5em;
  height: 5em;
}

.tri:hover {
  background-color: lime;
  cursor: pointer;
}

.tri-up {
  margin-top: 2.5em;
  background-color: yellow;
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
}

.tri-down {
  background-color: red;
  clip-path: polygon(50% 100%, 0% 0%, 100% 0%);
}

.tri-left {
  background-color: green;
  margin-left: 2.5em;
  clip-path: polygon(100% 100%, 100% 0, 0 50%);
}

.tri-right {
  background-color: blue;
  clip-path: polygon(0 100%, 0 0, 100% 50%);
}
<div class = "sq-tri">
  <div class = "tri tri-down" data-location = "top"></div>
  <div class = "tri tri-right" data-location = "left"></div>
  <div class = "tri tri-left" data-location = "right"></div>
  <div class = "tri tri-up" data-location = "bottom"></div>
</div>

Используйте SVG, как описано в этот ответ

Примечание: поскольку каждый из элементов внутри SVG имеет идентификатор, вы можете настроить таргетинг на них с помощью JS / JQuery.

svg {
  display: block;
  width: 200px;
  height: 200px;
  margin: 25px auto;
  border: 1px solid grey;
  stroke: #006600;
}

#buttons polygon:hover {
  fill: orange;
}


#top {
  fill: #cc3333;
}

#right {
  fill: #663399;
}

#left {
  fill: #bada55;
}
<svg viewbox = "0 0 100 100">
  <g id = "buttons">
    <polygon id = "top" points = "0,0 100,0 50,50" />
    <polygon id = "right" points = "100,0 50,50 75,75 100,100" />
    <polygon id = "bottom" points = "0,100 50,50 75,75 100,100" />
    <polygon id = "left" points = "0,0 25,25 50,50 0,100" />
  </g>
</svg>

Другие вопросы по теме