Поворот HTML-элемента с помощью мыши (или mouseevent) с применением масштабирования CSS

#javascript #jquery #html #css #css-transforms

#javascript #jquery #HTML #css #css-преобразования

Вопрос:

Я нашел пример поворота HTML-элемента в старом вопросе SO:

http://jsfiddle.net/superasn/w48rsvp2/

К сожалению, как только я применяю любое масштабирование (style =»zoom: 0.5″) к родительскому элементу, вращение становится шатким.

http://jsfiddle.net/superasn/mv2oqL36/2 / (с масштабированием 0,5 и смещением 500 пикселей по родительскому элементу)

Код для поворота выглядит следующим образом

 $(document).ready(function() {
  // the same as yours.
  function rotateOnMouse(e, pw) {
      var offset = pw.offset();
      var center_x = (offset.left)   ($(pw).width() / 2);
      var center_y = (offset.top)   ($(pw).height() / 2);
      var mouse_x = e.pageX;
      var mouse_y = e.pageY;
      var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
      var degree = (radians * (180 / Math.PI) * -1)   100;
      //            window.console.log("de=" degree "," radians);
      $(pw).css('-moz-transform', 'rotate('   degree   'deg)');
      $(pw).css('-webkit-transform', 'rotate('   degree   'deg)');
      $(pw).css('-o-transform', 'rotate('   degree   'deg)');
      $(pw).css('-ms-transform', 'rotate('   degree   'deg)');
  }

  $('.drop div img').mousedown(function(e) {
    e.preventDefault(); // prevents the dragging of the image.
    $(document).bind('mousemove.rotateImg', function(e2) {
      rotateOnMouse(e2, $('.drop div img'));
    });
  });

  $(document).mouseup(function(e) {
    $(document).unbind('mousemove.rotateImg');
  });
});
  

Я думаю, что rotateOnMouse функция должна каким-то образом учитывать масштабирование CSS родительского элемента, но я не могу понять это.

Мои вопросы в том, какие изменения мне нужно внести в rotateOnMouse функцию для вычисления degree переменной после масштабирования?

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

1. P.S. Я пробовал погружение center_x и center_y с помощью zoom (поэтому center_x/2 для zoom 0.5), и это немного помогает, но вращение получается не очень плавным.

2. Обновление центра во время поворота сделало его шатким при наведении курсора на изображение даже без масштабирования. Кажется, что работает лучше, если определить его заранее, учет уровня масштабирования довольно прост — используйте его в качестве дополнительного фактора при расчете центра. Вот демонстрационный вариант.

3. спасибо, похоже, это работает с внесенными вами изменениями!

4. Нет проблем, я заметил, zoom что на самом деле это не работает в Firefox, но я также не вижу никакого реального негативного эффекта. Хотя, возможно, стоит проверить, возможно, использовать scale вместо этого.

5. По-видимому, мой предыдущий подход казался рабочим (и логичным), но, скорее всего, это была случайность. На самом деле ключ к разгадке находится в pageX и pageY событиях, я думаю. Демонстрация здесь . Хотя сейчас в Firefox это довольно ужасно.