jQuery- 单击图像上的坐标并在那里画一个圆圈

jQuery- click at a co-ordinate on an image and draw a circle there

我有一个 div,即 image_preview,里面有一张图片。有一个输入框可以从用户那里获取圆的半径。当我点击图像上的一个点时,我需要一个以该点为中心并以输入的半径为半径的圆。圆圈应该用记号笔标记。 id为hotspot_displaydiv作为标记,divcircle作为要显示的圆圈。两者都是绝对定位的。该标记的背景是一张尺寸为 24X24 的图像。

每当我单击时,都会制作标记和圆的克隆并将其放置在我单击的点周围。单击鼠标可更改标记和圆圈位置(您会在本题末尾找到 fiddle link)。

我可以用offsetclientX等捕捉我点击的点的坐标,代码如下:

HTML: 图片:

<input type="text" value="0"  class="radius" name="radius"/>

<div id="image_preview">

    <img src="https://i.imgur.com/B7VsSq3.png" alt="background" />



    <div id="hotspot_display"></div>

    <div class="circle" style="background-color: #858585; position: absolute;"></div>

</div><!-- end of id image_preview-->

<div id="hotspot_answer_points">


</div><!-- end of id hotspot_answer_points-->

JS:

   $('#image_preview').bind('click', function (ev) {

                var $div = $(ev.target);
                var $div = $(this);
                var $display =  $('#image_preview').find('#hotspot_display');
                var offset_t = $(this).offset().top - $(window).scrollTop();
                var offset_l = $(this).offset().left - $(window).scrollLeft();

                var left = Math.round( (ev.clientX - offset_l) );
                var top = Math.round( (ev.clientY - offset_t) );

                if(window.console){

                    console.log("left = "+left+" top = "+top);

                }


                var display_clone=$display.clone().show();
                display_clone.css({'top':top+33,'left':left+10,'display':'block'});

});

display_clone.css 的代码在其参数中添加了一些值( 33 和 10 )到 lefttop 没有它们我无法获得图像标记的中心坐标.

问题1)我只是随机使用了33和10的值来相加。真正应该在这里进行什么计算,因为要添加的这些数字可能会有所不同如果我的 HTML 代码位于复杂的 HTML 页面中?

问题2: 我无法将圆心作为我点击的坐标。这里应该怎么走?

整个场景是 here fiddle。

编辑: 我的场景实际上有 2 个部分。上述情况发生在管理区域。在用户区,我再次显示 div 内的图像,即 hotspot_user_area。我从管理区域将点击的坐标保存在数据库中。在用户 I 区域,我有 HTML:

<div id="hotspot_user_area">

<img src="https://i.imgur.com/B7VsSq3.png" alt="background" />

</div>

我从数据库中获取坐标,并希望在图像的 hotspot_user_area 中用标记显示它们。假设我从数据库中得到的坐标在变量 x1y1 中;现在,如果我使用 Roko C. Buljan 的回答中的以下代码,它将不起作用:

 $("<div />", {
      "class": "circle",
      css: {
        top: y1,
        left: x1,
        width: r * 2,
        height: r * 2,
      },
      appendTo: $this // append to #image_preview!
    }).

这不起作用,因为在管理面板中 lefttop 属性分别具有值 xy,它们具有以下计算:

y = ev.pageY - o.top,
x = ev.pageX - o.left;

那么,无论 div 再次放置图像,如何将标记放置在图像的同一位置?

这里有一个更简单的方法:

  • 要获得中心,请使用 ev.pageX - el.offset().left
  • 不要克隆元素。即时创建它们。
  • 使用 CSS transform translate 使它们居中

var App = App || {};
App.points = []; // Use array to store objects like [{x,y,r}, {x,y,r} ...]


jQuery(function($) {

  const $radius = $(".radius");

  $('#image_preview').on('click', function(ev) {

    const $this = $(this),
       r = parseInt($radius.val().trim(), 10), // Parse as Integer radix 10
      o = $this.offset(),
      y = ev.pageY - o.top,
      x = ev.pageX - o.left;

    $("<div />", {
      "class": "circle",
      css: {
        top: y,
        left: x,
        width: r * 2,
        height: r * 2,
      },
      appendTo: $this // append to #image_preview!
    });

    // Append data to App.points
    App.points.push({x,y,r});
    // Test
    console.log( App.points )

  });

});
#image_preview {
  position: relative; /* Add this since child are absolute! */
  background: #eee;
  margin: 15px;
  cursor: crosshair;
}

#image_preview img {
  display: inline-block;
  vertical-align: top;
}

.circle {
  position: absolute;
  background: rgba(255, 0, 0, 0.2) url("https://i.imgur.com/qtpC8Rf.png") no-repeat 50% 50%;
  border-radius: 50%;
  transform: translate(-50%, -50%); /* use translate instead of JS calculations */
}

.radius {
  position: absolute;
}
Radius: <input type="text" value="20" class="radius" name="radius">

<div id="image_preview">
  <img src="https://i.imgur.com/B7VsSq3.png" alt="graph">
</div>

<script src="//code.jquery.com/jquery-3.1.0.js"></script>