【发布时间】:2021-11-24 05:19:51
【问题描述】:
我最近潜入了 css 变换的世界并想旋转一个 div(x 和 y 轴),我能够使用 2 个 0 到 360 度范围的滑块来完成它,但现在期待通过拖动来完成鼠标,我在寻找修复它的建议上做了一个非常草率的努力:
"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