Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.04.2021, 20:21
Аватар для LADYX
Профессор
Отправить личное сообщение для LADYX Посмотреть профиль Найти все сообщения от LADYX
 
Регистрация: 19.02.2015
Сообщений: 219

Повернуть элемент мышкой
У меня есть такой скрипт:

<style>
#rotate {
  width: 200px;
  height: 200px;
  margin: 50px auto;
  background: linear-gradient(0deg, red, green);
}
.active {
border-radius: 100%;
}
</style>

<div id="rotate"></div>

<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>

<script>
(function() {
  var init, rotate, start, stop,
    active = false,
    angle = 0,
    rotation = 0,
    startAngle = 0,
    center = {
      x: 0,
      y: 0
    },
    R2D = 180 / Math.PI,
    rot = document.getElementById('rotate');

  init = function() {
    rot.addEventListener("mousedown", start, false);
    $(document).bind('mousemove', function(event) {
      if (active === true) {
        event.preventDefault();
        rotate(event);
      }
    });
    $(document).bind('mouseup', function(event) {
      event.preventDefault();
      stop(event);
    });
  };

  start = function(e) {
    e.preventDefault();
    var bb = this.getBoundingClientRect(),
      t = bb.top,
      l = bb.left,
      h = bb.height,
      w = bb.width,
      x, y;
    center = {
      x: l + (w / 2),
      y: t + (h / 2)
    };
    x = e.clientX - center.x;
    y = e.clientY - center.y;
    startAngle = R2D * Math.atan2(y, x);
    return active = true;
  };

  rotate = function(e) {
    e.preventDefault();
    var x = e.clientX - center.x,
      y = e.clientY - center.y,
      d = R2D * Math.atan2(y, x);
    rotation = d - startAngle;
    return rot.style.webkitTransform = "rotate(" + (angle + rotation) + "deg)";
  };

  stop = function() {
    angle += rotation;
    alert(angle);
    return active = false;
  };

  init();

}).call(this);
</script>


С помощью него я мышкой поворачиваю элемент.

Помогите, пожалуйста, сделать следующее. Мне нужно, чтобы я мог повернуть элемент только на 180deg. При этом:

- Если начинаешь поворачивать, и если повернул меньше, чем на 90deg и отпустил элемент, то он возвращается на место;

- Если начинаешь поворачивать, и если повернул больше, чем на 90deg и отпустил элемент, то он поворачивается до конца (до 180deg). В этом случае элементу добавляется дополнительный класс (.active). И сразу после этого ближайшие, скажем 60сек, элемент поворачивать мы не можем. А спустя 60сек этот дополнительный класс удаляется, и мы снова можем поворачивать элемент.

Как можно такое сделать, прошу помощи. Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 26.04.2021, 21:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

LADYX,
<!DOCTYPE html>

<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">

</head>

<body>
<style>
#rotate {
    width: 200px;
    height: 200px;
    margin: 50px auto;
    background: linear-gradient(0deg, red, green);
}
.active {
border-radius: 100%;
}
.animate{
   transition: transform 1s;
   border: 5px solid #0000FF;
}

</style>

<div id="rotate"></div>

<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>

<script>
(function() {
    var init, rotate, start, stop,
        active = false,
        angle = 0,
        rotation = 0,
        startAngle = 0,
        center = {
            x: 0,
            y: 0
        },
        R2D = 180 / Math.PI,
        rot = document.getElementById('rotate');

    init = function() {
        rot.addEventListener("mousedown", start, false);
        $(document).bind('mousemove', function(event) {
            if (active === true) {
                event.preventDefault();
                rotate(event);
            }
        });
        $(document).bind('mouseup', function(event) {
            event.preventDefault();
            stop(event);
        });
    };

    start = function(e) {
        e.preventDefault();
        var bb = this.getBoundingClientRect(),
            t = bb.top,
            l = bb.left,
            h = bb.height,
            w = bb.width,
            x, y;
        center = {
            x: l + (w / 2),
            y: t + (h / 2)
        };
        x = e.clientX - center.x;
        y = e.clientY - center.y;
        startAngle = R2D * Math.atan2(y, x);
        return active = true;
    };

    rotate = function(e) {
        if(rot.classList.contains("animate")) return;
        e.preventDefault();
        var x = e.clientX - center.x,
            y = e.clientY - center.y,
            d = R2D * Math.atan2(y, x);
        rotation = d - startAngle;
        return rot.style.webkitTransform = "rotate(" + (angle + rotation) + "deg)";
    };



    stop = function() {
        if(rot.classList.contains("animate")) return;
        var max = Math.abs(rotation) > 90;
        rotation =  (max ? 180 : 0) * (rotation > 0 ? 1 : -1);
        rot.classList.add("animate");
        window.setTimeout(_ => {
        rot.classList.remove("animate");
        active = false;
        }, max ? 10000 : 1000)
        angle += rotation;
        rot.style.webkitTransform = "rotate(" + angle + "deg)";
    };

    init();

}).call(this);
</script>

</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 26.04.2021, 21:33
Аватар для LADYX
Профессор
Отправить личное сообщение для LADYX Посмотреть профиль Найти все сообщения от LADYX
 
Регистрация: 19.02.2015
Сообщений: 219

рони,
приветствую вас! Да, супер, то что нужно. Большое спасибо!! Буду с ним дальше работать, хочу уйти от jQuery полностью. Постараюсь самостоятельно переписать его на чистый JS.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать родительский элемент меню активным, дочерний элемент которого был нажат Jimmi Элементы интерфейса 6 04.06.2020 12:06
Как добавить только один элемент? Артур Кудашев Events/DOM/Window 0 19.05.2019 11:38
определить элемент под перетаскиваемым элементом slavaspirit Элементы интерфейса 3 26.07.2015 01:49
Выбрать элемент у родителя которого сын это элемент по которому кликнули MalikSPB Events/DOM/Window 8 30.12.2012 12:22
Drag-n-Drop - перетянуть элемент Jugo ExtJS 1 10.08.2011 19:10