Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Блок следует за мышкой и получение координат (https://javascript.ru/forum/dom-window/76117-blok-sleduet-za-myshkojj-i-poluchenie-koordinat.html)

Bastonsv 06.12.2018 16:15

Блок следует за мышкой и получение координат
 
Всем добрый день. Начну с описания задачи которая передомной стоит.
Есть картинка, на эту картинку необходимо наносить надпись и отдавать пользователю в виде конечного файла в PDF.
Надписи каждый раз разные, но однотипные (имя + небольшой код состоящий из 3-6 символов)
Картинка может быть произвольной, пользователь должен указать на шаблоне в каком месте будет ставиться надпись. Далее координаты записываються в базу и вопросы нанесения надписи и выталкивания клиенту ложатся на php

Как видится решение.
Получение координат на картинке решаю следующим образом.
Стиль
<style type="text/css">

#el{

   position:relative;
   width: 100%; 

  background:#555;
  z-index: 2;
}
</style>

HTML:
<img id="el" src='1.png'>

JS скрпит
<script type="text/javascript">
	
var el = document.getElementById('el');

    el.addEventListener('mouseup', getClickXY, false);

function getClickXY(event)

  {

    var clickX = (event.layerX == undefined ? event.offsetX : event.layerX) + 1;

    var clickY = (event.layerY == undefined ? event.offsetY : event.layerY) + 1;
 	

    alert('Координаты отпускания: X= '+ clickX +' Y= '+ clickY);

  }

</script>


Это я на просторах интернета нарыл.
В принципе плюс/минус понимаю скрипт. Таким образом я получаю координаты где пользователь отпустит кнопку(можно поставить клик)
Вопрос вот в чем... Как прикрепить к курсору прямоугольник не большой, который будет символизировать надпись? Просто для наглядности пользователю, что б он понимал где будет расположена надпись.
По отпусканию, что бы этот прямоугольник закрепился на этом месте.

По сути мне нужно что б прямоугольник можно было перетянуть на картинке и получить координаты левого нижнего угла этого прямоугольника относительно картинки(она большая в несколько тыс пискелей по ширине и высоте). В идеале эти координаты заносятся в аттрибуты value hidden-полей(x,y) формы и отправляется из нее в скрипт, который эти координаты запишет в базу.
Помогите пожалуйста реализовать это.

Bastonsv 06.12.2018 18:15

Форму уже сделал - получаю координаты - проблем нет. Теперь мне бы тягать за мышкой прямоугольник (какой нибудь DIV) и по клику его фиксировать на изображении

рони 06.12.2018 18:53

Bastonsv,
https://javascript.ru/forum/misc/397...tml#post261336

Bastonsv 06.12.2018 19:03

Спасибо за ответ...
Вобщем включился в основы JS и CSS - сделал так
<html lang="en">
<head>

<style type="text/css">

#el{
  position:relative;
  width: 100%; 
  background:#555}


 .stamp{
	width:200px;
	height:50px;
	background:#555;
	position: absolute;
	opacity:0.6;
	/*z-index: 2*/
	
}
</style>

</head>
<body>
<img id="el" src='1.png'>
<script type="text/javascript">	
var el = document.getElementById('el');
    el.addEventListener('mouseup', getClickXY, false);

function getClickXY(event)
  {
    var clickX = (event.layerX == undefined ? event.offsetX : event.layerX) + 1;
    var clickY = (event.layerY == undefined ? event.offsetY : event.layerY) + 1;
 	document.getElementById('X').value = clickX;
 	document.getElementById('Y').value = clickY;
	document.getElementById('st').style.top = clickY+'px';
 	document.getElementById('st').style.left = clickX+'px';
    //alert('Координаты отпускания: X= '+ clickX +' Y= '+ clickY);

  }

</script>
<form method="POST" action="">
<input type='hidden' id="X">
<input type='hidden' id="Y">
<div class="stamp" id="st"><center>AA1BB<br />Name Sirname</center></div>
</form>
</body>
</html>

Если есть ошибки критические - поправляйте. Но вроде мои задачи выполняет

Нет ошибся я. Позиционирование блока div абсолютное, отсюда ошибка возникает, если сверху над картинкой что-то выводится дополнительно. Как привязать координаты позиционирования к картинке?

Bastonsv 08.12.2018 22:36

Продолжая тему)) Вдруг кому нибудь понадобится. Такое решение - полностью выполняет задачу. Конечно можно совершенствовать. Но это уже для профи в JS
Может кому-то понадобится такое решение
<!doctype html>
<html lang="en">
<head>

<style type="text/css">

#el{
  position:relative;
  width: 100%; 
 /* z-index: 2*/
  /*background:#555*/
}


 .stamp{
	width:200px;
	height:40px;
	background:#ddd;
	position: absolute;
	opacity:0.9;
	/*z-index: 2*/
	
}
.stamp2{
	width:200px;
	height:40px;
	background:#ddd;
	position: absolute;
	opacity:0.6;
	/*z-index: 2*/
	
}
 .description{
	width:100%;
	height: 100px;
	border:2px;
}
</style>

</head>
<body>
<div class="description"><form method="POST" action="">
<form action="" method="POST">

<input type='hidden' id="X">
<input type='hidden' id="Y">
<button type="submit"> Указал</button>
</form>
</div>
<img id="el" src='1.png'>
<script type="text/javascript">	
var el = document.getElementById('el');
    el.addEventListener('click', getClickXY, false);
    el.addEventListener('mousemove', moveClickXY, false);
//mouseup

function getClickXY(event)
  {
    var clickX = (event.layerX == undefined ? event.offsetX : event.layerX) + 1;
    var clickY = (event.layerY == undefined ? event.offsetY : event.layerY) + 1;
	document.getElementById('stmove').style.zindex=-1;
 	document.getElementById('X').value = clickX+12;
 	document.getElementById('Y').value = clickY;
	divkoordinateY=clickY+108;
	document.getElementById('st').style.top = divkoordinateY+'px';
 	document.getElementById('st').style.left = clickX+12+'px';
    alert('Координаты установлены' );

  }
function moveClickXY(event)
{
	//document.getElementById('st').style.top = divkoordinateY+'px';
    var clickX = (event.layerX == undefined ? event.offsetX : event.layerX) + 1;
    var clickY = (event.layerY == undefined ? event.offsetY : event.layerY) + 1;
 	divkoordinateY=clickY+108;
	document.getElementById('st').style.zindex =-1;
	document.getElementById('stmove').style.top = divkoordinateY+'px';
 	document.getElementById('stmove').style.left = clickX+12+'px';
}

</script>

<div class="stamp" id="st"><center>AA1BB<br />Name Sirname</center></div>
<div class="stamp2" id="stmove"><center>AA1BB<br />Name Sirname</center></div>

</body>
</html>


Часовой пояс GMT +3, время: 03:19.