【问题标题】:css 3d transform rotate (x + y) using mouse drag使用鼠标拖动css 3d变换旋转(x + y)
【发布时间】:2021-11-24 05:19:51
【问题描述】:

我最近潜入了 css 变换的世界并想旋转一个 div(x 和 y 轴),我能够使用 2 个 0 到 360 度范围的滑块来完成它,但现在期待通过拖动来完成鼠标,我在寻找修复它的建议上做了一个非常草率的努力:

jsfiddle link to test

"use strict";

let elContainer = $('#container');
let elBox = $('#box');

$(document).ready(function() {
  $('.slider-rotate').on('input', function() {
    sliderRotate();
  });

  elContainer.mousedown(function(e) {
    initDragRotate(e);
  });

  elContainer.mousemove(function(e) {
    dragRotate(e);
  });

  elContainer.mouseup(function(e) {
    endDragRotate();
  });

});

let dragging = false;
let delta = {};

function initDragRotate(e) {
  dragging = true;
  delta = {
    x: e.pageX,
    y: e.pageY,
  };
}

function dragRotate(e) {
  if (!dragging) {
    return;
  }

  delta.x = e.pageX - delta.x;
  delta.y = e.pageY - delta.y;

  let rotateParam = '';
  rotateParam += ' rotate' + 'Y' + '(' + delta.x + 'deg)';
  rotateParam += ' rotate' + 'X' + '(' + delta.y + 'deg)';
  elBox.css('transform', rotateParam);
}

function endDragRotate() {
  if (!dragging) {
    return;
  }

  dragging = false;
}


function sliderRotate() {
  let rotateParam = '';
  $('.slider-rotate').each(function() {
    rotateParam += ' ' + getRotateParamString($(this));
  });
  elBox.css('transform', rotateParam);
}

function getRotateParamString(elClass) {
  let val = elClass.val();
  let rotateType = elClass.data('rotateType');
  let rotateParam = 'rotate' + rotateType + '(' + val + 'deg)';

  return rotateParam;
}
#container {
  background: #ccc;
  padding: 10vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

#box {
  width: 30vh;
  height: 30vh;
  border: 5px solid #000;
  position: relative;
  transform-style: preserve-3d;
}

#box>div {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="container">
  <div id="box">
    <div style="background: #f00;"></div>
    <div style="background: #0f0;"></div>
  </div>
</div>

<div id="control">
  <br>
  <label>
    x
    <input type="range" class="slider-rotate" data-rotate-type="X" min="0" max="360" value="0">
  </label>
  <br>
  <label>
    y
    <input type="range" class="slider-rotate" data-rotate-type="Y" min="0" max="360" value="0">
  </label>
</div>

另外,顶部和底部有 2 个 div(绿色和红色),带有 transform-style preserve-3d 属性,希望它在翻转时显示另一种颜色,但没有运气!请推荐,谢谢!

【问题讨论】:

  • 请您描述一下什么不起作用。
  • @A Haworth 我想提问者想问一下如何通过鼠标拖动使盒子旋转
  • @AHaworth,嗨,谢谢,是的,Garv Puri 是正确的,请查看小提琴链接以了解我到目前为止的想法,谢谢!
  • 好的,我会试着反过来问!拖动鼠标时应该发生什么?旋转如何计算?
  • @AHaworth 我对此不太有经验,因此问题,请查看底部的滑块,我只是期待通过相应拖动来移动 360 度 x 和 y 轴,也许如果超过 360 度,则再次旋转,当然可能还有另一个强度滑块,例如拖动运动将以慢或快的百分比旋转,或者如果拖动太快,可能会保持旋转一段时间,但我不是确定在拖动时成功旋转它的逻辑,谢谢!

标签: javascript jquery css transform


【解决方案1】:

旋转多少的计算有点奇怪。

我相信您需要的是让旋转量取决于鼠标在屏幕上和向下放置的量。要使其与屏幕尺寸成比例,您需要将其除以屏幕尺寸,然后将其乘以 360,以获得从 pageX/Y 为 0 到屏幕右侧/底部的完整范围。

"use strict";

let elContainer = $('#container');
let elBox = $('#box');

$(document).ready(function() {
  $('.slider-rotate').on('input', function() {
    sliderRotate();
  });

  elContainer.mousedown(function(e) {
    initDragRotate(e);
  });

  elContainer.mousemove(function(e) {
    dragRotate(e);
  });

  elContainer.mouseup(function(e) {
    endDragRotate();
  });

});

let dragging = false;
let delta = {};

function initDragRotate(e) {
  dragging = true;
  delta = {
    x: e.pageX,
    y: e.pageY,
  };
}

function dragRotate(e) {
  if (!dragging) {
    return;
  }
  // THIS IS THE CALCULATION THAT HAS CHANGED
  delta.x = e.pageX / window.innerWidth * 360; //- delta.x;
  delta.y = e.pageY / window.innerHeight * 360; // - delta.y;

  let rotateParam = '';
  rotateParam += ' rotate' + 'Y' + '(' + delta.x + 'deg)';
  rotateParam += ' rotate' + 'X' + '(' + delta.y + 'deg)';
  elBox.css('transform', rotateParam);
}

function endDragRotate() {
  if (!dragging) {
    return;
  }

  dragging = false;
}


function sliderRotate() {
  let rotateParam = '';
  $('.slider-rotate').each(function() {
    rotateParam += ' ' + getRotateParamString($(this));
  });
  elBox.css('transform', rotateParam);
}

function getRotateParamString(elClass) {
  let val = elClass.val();
  let rotateType = elClass.data('rotateType');
  let rotateParam = 'rotate' + rotateType + '(' + val + 'deg)';

  return rotateParam;
}
#container {
  background: #ccc;
  padding: 10vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

#box {
  width: 30vh;
  height: 30vh;
  border: 5px solid #000;
  position: relative;
  transform-style: preserve-3d;
}

#box>div {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="container">
  <div id="box">
    <div style="background: #f00;"></div>
    <div style="background: #0f0;"></div>
  </div>
</div>

<div id="control">
  <br>
  <label>
    x
    <input type="range" class="slider-rotate" data-rotate-type="X" min="0" max="360" value="0">
  </label>
  <br>
  <label>
    y
    <input type="range" class="slider-rotate" data-rotate-type="Y" min="0" max="360" value="0">
  </label>
</div>

【讨论】:

  • 关于为什么红色(后面的 div)没有在旋转时显示的任何建议,或者我应该为此创建一个不同的问题?
  • 实际上创建一个新问题可能会更好,因为它是一个不同的问题。
猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 2010-09-11
  • 2011-03-27
  • 2014-03-17
  • 1970-01-01
  • 2010-12-18
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多