Деление квадрата по диагоналям и превращение каждого результирующего треугольника в отдельную кнопку

#javascript #html #css #geometry

#javascript #HTML #css #геометрия

Вопрос:

Предположим, у меня есть квадрат, и я делю его на диагонали, в результате чего получается четыре одинаковых треугольника (не считая их поворота).

  • Используя CSS / HTML / Javascript, каков наилучший способ превратить каждый треугольник в область, доступную для просмотра, не разделяя при этом охватывающий квадрат?

Я изучал возможность создания треугольников с использованием карт изображений ( <map> ), но мне кажется, что это работает так, как ожидалось, только в Internet Explorer.

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

Комментарии:

1. Я еще не успел этого сделать, но для меня это было бы хорошей причиной заглянуть в html5 canvas.

2. Методы, описанные здесь: russellheimlich.com/blog / … может представлять для вас интерес.

3. Я бы счел карту изображений хорошим решением. Это проверенный и надежный метод, который будет работать даже в самых старых браузерах, практически не вызывая проблем с доступом. Можете ли вы показать код, который вы пробовали? Скорее всего, это просто ошибка.

4. @Alohci: Интересная идея. Однако страница, на которую вы ссылаетесь, выглядит неправильно в IE9 или Chrome 10. В FF4 это выглядит так, как задумал автор (я полагаю). Кроме того, я не совсем уверен, как сделать границы «хитзонами»?

5. @RoToRa: На самом деле, image maps нормально работает в разных браузерах, если я в <area> определениях использую href="javascript:Function()" вместо того, чтобы полагаться исключительно на рабочий javascript для классов, назначенных <area> определениям. Однако тогда у меня возникает новая проблема, о которой я не упоминал в первоначальном вопросе: мне нужно разместить видимый div поверх / под изображением с картой изображения. Я не могу заставить порядок z-индекса работать вне IE.

Ответ №1:

Я бы сделал это так:

  1. Создайте div и оформите его в виде квадрата. Используйте фоновое изображение для иллюстрации треугольников
  2. Создайте переменную square в javascript для хранения элемента square
  3. Получите положение, высоту и ширину квадрата в вашем js
  4. Выполните некоторые математические вычисления, чтобы определить координаты вершин каждого треугольника
  5. Напишите функцию getQuadrant(), которая определяет, в каком треугольнике находится любая данная точка внутри квадрата
  6. Добавьте прослушиватель событий, чтобы нажимать события на квадрате. Прослушиватель событий должен вызвать функцию getQuadrant
  7. Используйте переключатель / регистр для выполнения любого кода, который вам нужно вызвать, при условии, в каком квадранте выполняется щелчок

Комментарии:

1.Итак, предполагая, что у нас есть (0,0) в верхнем левом углу квадрата, и x растет вниз, а y растет вправо, код для getQuadrant() будет выглядеть примерно так: if(x < height/2 amp;amp; x < width-y amp;amp; x < y) then: top triangle; if(y > width/2 amp;amp; x > width-y amp;amp; x < y) then: right triangle; if(x > height/2 amp;amp; x > width-y amp;amp; x > y) then: bottom triangle; if(y < width/2 amp;amp; x < width-y amp;amp; x > y) then: left triangle; Мне нужно протестировать это, чтобы увидеть, допустил ли я какие-либо ошибки.

2. Проблема решена. 🙂 Спасибо, @Adam. Мой приведенный выше псевдокод должен быть правильным. Я использовал jQuery, чтобы получить положение щелчка, что-то вроде этого: $('#square').click(function (e) { var squareHeight = 100; var squareWidth = 100; var vertiPos = e.pageY - this.offsetTop; var horizPos = e.pageX - this.offsetLeft; getQuadrant(vertiPos, horizPos, squareHeight, squareWidth)); });

3. Круто! Теперь для вашей следующей задачи выясните, как заставить каждый квадрант показывать анимационные эффекты при наведении курсора мыши!

4. Вероятно, вы могли бы сделать это с помощью CSS-спрайтов

5. Ну, это должно быть в следующей версии 🙂