【问题标题】:How to rotate elements either forward or back from current state如何从当前状态向前或向后旋转元素
【发布时间】:2016-07-15 22:10:58
【问题描述】:

假设我有三个元素。当用户单击任何元素时,该元素每次单击时都需要旋转 +120 度或 -120 度(方向随机选择,没有特定顺序)。所以如果它当前的旋转是 120 度,当它再次点击时,它会再旋转 120 度。我需要它在随机正负旋转之间交替。所以它可以向前或向后旋转...

这是我目前拥有的代码:

var aElement = $(".element").each(function(){});

aElement.on('click', function() {

    $(this).css("transform", "rotate(120deg");

})

非常感谢任何帮助。

【问题讨论】:

  • 默认状态是什么?您始终可以将 prev 角度乘以 -1,以使您的角度为正或负。
  • 当前状态只有 120 度。
  • 预期结果是从0deg 切换到120deg,然后从120deg 切换到0deg?或者120deg-120deg
  • "当用户单击任何元素时,该元素每次单击时都需要旋转 +120 度或 -120 度。因此,如果当前旋转为 120,则再次单击,它又旋转了 120 度" 元素是否从 0deg 开始?第一次点击设置为120deg,下次点击设置为-120deg?

标签: javascript jquery css transform


【解决方案1】:

我建议使用 data-* 属性来检查被点击的元素是否被旋转而不使用(1和0)然后进行反转,检查下面的示例。

希望这会有所帮助。

$('body').on('click', '.element', function() {
  if ( $(this).data("rotated")==='1' ) {
    $(this).css("transform", "rotate(0deg").data("rotated","0");
  } else {
    $(this).css("transform", "rotate(120deg").data("rotated","1");
  }    
})
.element{
  width: 100px;
  height: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<img  data-rotated='0' class="element" src='http://icons.iconarchive.com/icons/martz90/circle/512/camera-icon.png' />
<img  data-rotated='0' class="element" src='http://icons.iconarchive.com/icons/martz90/circle/512/camera-icon.png' />
<img  data-rotated='0' class="element" src='http://icons.iconarchive.com/icons/martz90/circle/512/camera-icon.png' />

更新

对于随机旋转,您可以生成一个随机布尔值并对其设置条件,请查看以下示例。

$('body').on('click', '.element', function() {
  var random_rotation_state = Math.random() >= 0.5;
  var rotation = parseInt($(this).data('rotation'));
  
  if ( random_rotation_state )
    rotation+= 120;
  else
    rotation-= 120;
  
  $(this).css("transform", "rotate("+rotation+"deg").data("rotation", rotation);
  console.log(rotation);
})
.element{
  width: 100px;
  height: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<img  data-rotation='0' class="element" src='http://haizdesign.com/wp-content/uploads/2012/05/css3-featured.png' />
<img  data-rotation='0' class="element" src='http://az676930.vo.msecnd.net/media/1328/3_html5___css3_integration.png' />

【讨论】:

  • 不清楚 OP 实际期望什么,但可以通过删除 .data()、检查当前 transform 属性中的 -120 来进一步缩短方法
  • 感谢@guest271314 的干预,OP 想要在旋转度数 0 和 120 之间切换。实际上变换属性返回一个 matrix 值(检查其他答案),因此避免转换为度数值我建议使用数据属性。
  • "OP 想要在旋转度数 0 和 120 之间切换" 不完全清楚,这里,预期的结果是什么。参见 OP “该元素每次单击时都需要旋转 +120 度或 -120 度”“我需要它在正负旋转之间交替。所以它可以旋转前进或后退..." Element.style.transform 在这里只返回rotate(Ndeg),如果那只是transform 属性集; jQuery 的 .css() 返回 matrix()
  • 感谢您的代码。这似乎用最少的代码完成了我所需要的,所以我认为这是最正确的答案。只有一个问题——我需要它随机向左或向右(负或正)旋转。目前它正在向右旋转,然后向左旋转。但需要随机选择左右旋转。如果我没有说清楚,我很抱歉。我将编辑我的问题。
【解决方案2】:

我的立场是正确的。 $(this).css('transform') 没有给我们数字角度。相反,它给了我们类似matrix(-0.5, 0.866025, -0.866025, -0.5, 0, 0) 的东西。请记住,您需要对其余的浏览器前缀执行此操作。

原文来源:https://css-tricks.com/get-value-of-css-rotation-through-javascript/

$('.element').click(function(elm){
	var tr = $(this).css("transform");

  
  var values = tr.split('(')[1];
    values = values.split(')')[0];
    values = values.split(',');
var a = values[0];
var b = values[1];
var c = values[2];
var d = values[3];
  
  var angle = Math.round(Math.atan2(b, a) * (180/Math.PI));
angle = angle * - 1; 
console.log(angle);
$(this).css({ transform: 'rotate(' + angle + 'deg)'});
  
});
li{
  width: 50px; 
  height: 50px; 
  background: tomato; 
  margin-bottom: 10px;
  transform: rotate(120deg);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li class="element"></li>
<li class="element"></li>
<li class="element"></li>
<li class="element"></li>
<li class="element"></li>
<li class="element"></li>
<li class="element"></li>
</ul>

【讨论】:

    【解决方案3】:
    var aElement = $(".element").each(function(){});
    
    aElement.on('click', function() {
    
        if ($(this).css("transform") == "rotate(120deg)") {
            $(this).css("transform", "rotate(-120deg");
        } else {
            $(this).css("transform", "rotate(120deg");
        }    
    })
    

    【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多