首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不影响同类图片的情况下,每次右键旋转图片10度

如何在不影响同类图片的情况下,每次右键旋转图片10度
EN

Stack Overflow用户
提问于 2020-12-23 00:21:04
回答 2查看 56关注 0票数 0

我希望每次右键单击都可以将图像旋转10度,而不会影响其他具有相同类别的图像。我只在定义的区域中使用右键单击,因为左键单击和双击用于其他操作。

js

代码语言:javascript
复制
document.getElementById('dropzone').addEventListener('contextmenu',(e)=>{
  e.preventDefault();

    document.addEventListener('click', function(e)
    {
        let degrees = 0;
        let targetElement = e.target || e.srcElement;
        // draggable
        if (targetElement.classList.contains('draggable')) {
            targetElement.classList.add("elementRotate");
            degrees += 10;
            $(".elementRotate").click(function () {
                degrees += 10;
                $(this).css("transform", "rotate(" + degrees + "deg)");  
                targetElement.classList.remove( "elementRotate" );           
            });
        }
    })              
})

html

代码语言:javascript
复制
<div id="dropzone">
    <img id="paper1" class="draggable resizable TrgtPaper" src="{{ asset('images/IPSC_Mini_Target.png') }}" title="target" alt="minitarget">
    <img id="paper1" class="draggable resizable TrgtPaper" src="https://zupimages.net/up/20/50/z9va.png" title="target" alt="minitarget">
    <img id="decor1" class="draggable elementRotate resizable" src="https://www.tsvstagemaker.fr/images/Panneau_tsv1.svg" width="83" alt="images/svg/panneau.svg">

    <svg id="decorsvg" class="draggable elementRotate resizable" width="91" height="64" viewBox="0 0 91 64" fill="none" xmlns="http://www.w3.org/2000/svg">
    <rect x="6.20657" y="42" width="1.42056" height="21" transform="rotate(14.3552 6.20657 42)" fill="#5779B6" />
    <rect x="6.02635" y="41.6958" width="1.92056" height="21.5" transform="rotate(14.3552 6.02635 41.6958)" stroke="black" stroke-opacity="0.6" stroke-width="0.5" />
    <rect x="82.9484" y="42.3693" width="1.42056" height="21" transform="rotate(-14.6511 82.9484 42.3693)" fill="#5779B6" />
    <rect x="82.6433" y="42.1907" width="1.92056" height="21.5" transform="rotate(-14.6511 82.6433 42.1907)" stroke="black" stroke-opacity="0.6" stroke-width="0.5" />
    <rect class="panneau1" x="3.50002" y="0.5" width="83" height="52" fill="#CD7330" fill-opacity="0.58" stroke="#5779B6" />
    </svg>
</div>

谢谢

EN

回答 2

Stack Overflow用户

发布于 2020-12-23 01:01:54

使用jQuery获得所需的输出。

代码片段:

代码语言:javascript
复制
// function for calculating current angle of images
function calculateAngle(elementId) {
    var element = document.getElementById(elementId);
    var tr = (window.getComputedStyle(element, null)).getPropertyValue("transform"),
        values = tr.split('(')[1],
        values = values.split(')')[0],
        values = values.split(','),
        a = values[0],
        b = values[1],
        c = values[2],
        d = values[3],
        radians = Math.atan2(b, a);
    if (radians < 0) {
        radians += (2 * Math.PI);
    }
    return Math.round(radians * (180 / Math.PI));
}

$(document).ready(function() {
  // disable right click browser context menu
  document.oncontextmenu = function() {return false;};
  
  $('.draggable').mousedown(function(e){ 
    if( e.button == 2 ) { 
      var selectedId = $(this).attr('id');
      var currentDegree = calculateAngle(selectedId);
      var newDegree = parseInt(currentDegree) + parseInt(10);
      $(this).css({"transform":"rotate(" + newDegree + "deg)"});
    } 
    return true; 
  });
});
代码语言:javascript
复制
/* set rotate 0 by default */
.draggable {
  transform: rotate(0deg);
}
代码语言:javascript
复制
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<div id="dropzone">
  <img id="paper1" class="draggable resizable TrgtPaper" src="https://zupimages.net/up/20/50/z9va.png" title="target" alt="minitarget">
  <img id="decor1" class="draggable elementRotate resizable" src="https://www.tsvstagemaker.fr/images/Panneau_tsv1.svg" width="83" alt="images/svg/panneau.svg">
  <svg id="decorsvg" class="draggable elementRotate resizable" width="91" height="64" viewBox="0 0 91 64" fill="none" xmlns="http://www.w3.org/2000/svg">
    <rect x="6.20657" y="42" width="1.42056" height="21" transform="rotate(14.3552 6.20657 42)" fill="#5779B6" />
    <rect x="6.02635" y="41.6958" width="1.92056" height="21.5" transform="rotate(14.3552 6.02635 41.6958)" stroke="black" stroke-opacity="0.6" stroke-width="0.5" />
    <rect x="82.9484" y="42.3693" width="1.42056" height="21" transform="rotate(-14.6511 82.9484 42.3693)" fill="#5779B6" />
    <rect x="82.6433" y="42.1907" width="1.92056" height="21.5" transform="rotate(-14.6511 82.6433 42.1907)" stroke="black" stroke-opacity="0.6" stroke-width="0.5" />
    <rect class="panneau1" x="3.50002" y="0.5" width="83" height="52" fill="#CD7330" fill-opacity="0.58" stroke="#5779B6" />
  </svg>
</div>

票数 0
EN

Stack Overflow用户

发布于 2020-12-23 01:02:04

您可以只检查this是否具有degrees属性,而不是将转换存储为全局变量。如果不是,则将其指定为rotate(10deg),否则可以通过执行parseInt(this.style.transform.split("(")[1])来访问当前旋转度数。一旦你有了这个值,再加上10,并将它指定为新的度数值。

代码语言:javascript
复制
document.getElementById('dropzone').addEventListener('contextmenu', (e) => {
  e.preventDefault();

  document.addEventListener('click', function(e) {
    let degrees = 0;
    let targetElement = e.target || e.srcElement;
    // draggable
    if (targetElement.classList.contains('draggable')) {
      targetElement.classList.add("elementRotate");
      degrees += 10;
      $(".elementRotate").click(function() {
        degrees += 10;
        $(this).css("transform", "rotate(" + degrees + "deg)");
        targetElement.classList.remove("elementRotate");
      });

    }

  })
})


// rotation elements      
//change out contextmenu with click if you want it onclick
 $(".elementRotate").contextmenu(function (e) {
   if (this.style.transform.length){
     var num = parseInt(this.style.transform.split("(")[1])
     num += 10
     $(this).css("transform", "rotate(" + num + "deg)");  
   } else {
     $(this).css("transform", "rotate(" + 10 + "deg)"); 
   }
});
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dropzone">

<!--  <img id="paper1" class="draggable resizable TrgtPaper" src="{{ asset('images/IPSC_Mini_Target.png') }}" title="target" alt="minitarget">
-->
  <img id="paper1" class="draggable resizable TrgtPaper" src="https://zupimages.net/up/20/50/z9va.png" title="target" alt="minitarget">

  <img id="decor1" class="draggable elementRotate resizable" src="https://www.tsvstagemaker.fr/images/Panneau_tsv1.svg" width="83" alt="images/svg/panneau.svg">

  <svg id="decorsvg" class="draggable elementRotate resizable" width="91" height="64" viewBox="0 0 91 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="6.20657" y="42" width="1.42056" height="21" transform="rotate(14.3552 6.20657 42)" fill="#5779B6" />
<rect x="6.02635" y="41.6958" width="1.92056" height="21.5" transform="rotate(14.3552 6.02635 41.6958)" stroke="black" stroke-opacity="0.6" stroke-width="0.5" />
<rect x="82.9484" y="42.3693" width="1.42056" height="21" transform="rotate(-14.6511 82.9484 42.3693)" fill="#5779B6" />
<rect x="82.6433" y="42.1907" width="1.92056" height="21.5" transform="rotate(-14.6511 82.6433 42.1907)" stroke="black" stroke-opacity="0.6" stroke-width="0.5" />
<rect class="panneau1" x="3.50002" y="0.5" width="83" height="52" fill="#CD7330" fill-opacity="0.58" stroke="#5779B6" />
</svg>

</div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65412199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档