简体   繁体   English

css 3d 变换旋转 (x + y) 使用鼠标拖动

[英]css 3d transform rotate (x + y) using mouse drag

i was recently diving into the world of css transform and wanted to rotate a div (x and y axis), i was able to do it with 2 sliders with 0 to 360 degree range but now looking forward to do it with dragging the mouse, i have made a very sloppy effort on that looking for suggestion to fix it:我最近潜入 css 变换的世界,想旋转一个 div(x 和 y 轴),我可以用 2 个 0 到 360 度范围的滑块来完成,但现在期待通过拖动鼠标来完成,我在寻找修复它的建议上做了一个非常草率的努力:

jsfiddle link to test jsfiddle 链接进行测试

 "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>

also, there's 2 div on top and bottom (green and red) with transform-style preserve-3d property, hoping that it's show the other color when flipped but no luck, please suggest, thanks!另外,顶部和底部有2个div(绿色和红色),带有transform-style preserve-3d属性,希望翻转时显示另一种颜色但没有运气,请建议,谢谢!

The calulation for how much to rotate is a little odd.旋转多少的计算有点奇怪。

I believe what you need is to have the amount of rotation dependent on the amount the mouse is placed across and down the screen.我相信您需要的是使旋转量取决于鼠标在屏幕上上下放置的量。 To make this proportional to the screen size you need to divide it by the screen size and then multiply it by 360 to get the full range from pageX/Y being 0 to being at the right/bottom of the screen.要使其与屏幕尺寸成比例,您需要将其除以屏幕尺寸,然后将其乘以 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM