Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как создать <DIV> рядом с курсором? (https://javascript.ru/forum/dom-window/21263-kak-sozdat-div-ryadom-s-kursorom.html)

Kanzaki 02.09.2011 22:50

Как создать <DIV> рядом с курсором?
 
Необходимо с помощью javascript как можно проще создать <DIV>text</DIV> рядом с курсором, который следовал бы за ним.
Получить координаты курсора можно например через clientX/clientY или pageX/pageY.
Дам толчок... Допустим при наведении на ссылку (onmouseover) див появляется по координатам курсора:
x = clientX + 20;
y = clientY + 20;
и исчезает после убирания курсора с ссылки (onmouseout)
А как нарисовать сам див?

Magneto 02.09.2011 23:15

var div = document.createElement('div');

div.style.position = 'absolute';
div.style.left = x;   // Координаты дива X и Y не забываем указать еденицы измерения,
div.style.top = y;    // например 40px или 20%
div.style.background = 'red';   //  Див с красной заливкой ))
div.appendChild(document.createTextNode('Я обычный текст'));  //  Добавим текст в див

document.body.appendChild(div);   //  Добавим наш див на страницу


DOM: работа с HTML-страницей
Координаты элемента на странице
Основы javascript

Рекомендую изучить основы языка

Kanzaki 02.09.2011 23:18

Дружище, ты не представляешь, как выручаешь меня, я уже 2 ночи не сплю, а ты меня спас :thanks:

Kanzaki 03.09.2011 01:15

Появился другой вопрос. А как теперь удалить созданный див? А то я его создаю при наведении на ссылку, но нужно чтобы он еще и удалялся после отвода курсора со ссылки. Вот мой код:
<html>
<head>
<script type="text/javascript">
window.onload = function () {
  var arayLink = document.getElementsByTagName('a'),
      totalLink = arayLink.length;

  while (totalLink--) {
    arayLink[totalLink].addEventListener('mouseover', havejpg, false);
  }

  function havejpg (e) {
    var div = document.createElement('div'); 
    if (e.target.href.match(/jpg$/)) {	//Проверяем, что в имени файла по ссылке расширение .jpg 
    //  alert('Ссылка содержит буквы jpg'); 
	x = e.clientX;
    y = e.clientY;
	div.style.position = 'absolute';
	div.style.left = x + 20;   // Координаты дива X и Y не забываем указать еденицы измерения,
	div.style.top = y + 20;    // например 40px или 20%
	div.style.background = 'green';   //  Див с зеленой заливкой ))
	div.appendChild(document.createTextNode('Я обычный текст'));  //  Добавим текст в див
	document.body.appendChild(div);
    }
//    else {
//      alert('Ссылка не содержит буквы jpg'); 
//    }
  }
    
}
</script>
</head>
<body>
<a href="img.jpg"> Ссылка 1 </a><br />
<a href="my.txt"> Ссылка 2 </a><br />
<a href="here.mp3"> Ссылка 3 </a><br />
<a href="you.jpg"> Ссылка 4 </a><br />
<a href="i.png"> Ссылка 5 </a><br />
</body>
</html>

Magneto 03.09.2011 01:45

<html>
<head>
<script type="text/javascript">
window.onload = function () {
  var arayLink = document.getElementsByTagName('a'),
      totalLink = arayLink.length;

  while (totalLink--) {
    arayLink[totalLink].addEventListener('mouseover', havejpg, false);
  }

  function havejpg (e) {
    var div = document.createElement('div'); 
    if (e.target.href.match(/jpg$/)) {	//Проверяем, что в имени файла по ссылке расширение .jpg 
    //  alert('Ссылка содержит буквы jpg'); 
	x = e.clientX;
    y = e.clientY;
	div.style.position = 'absolute';
	div.style.left = x + 20;   // Координаты дива X и Y не забываем указать еденицы измерения,
	div.style.top = y + 20;    // например 40px или 20%
	div.style.background = 'green';   //  Див с зеленой заливкой ))
	div.appendChild(document.createTextNode('Я обычный текст'));  //  Добавим текст в див
	document.body.appendChild(div);

  //  Функция удаляет новый див
  function deleteDiv () {
    document.body.removeChild(div);   // Удаление дива
    //  Удаляем обработчик события "уход курсора с элемента" текущей ссылки
    e.target.removeEventListener('mouseout', deleteDiv, false);
  }
  //  Добавим обработчик события "уход курсора с элемента" текущей ссылки, будет вызвана функцыя deleteDiv 
  e.target.addEventListener('mouseout', deleteDiv, false);

    }
//    else {
//      alert('Ссылка не содержит буквы jpg'); 
//    }
  }
    
}
</script>
</head>
<body>
<a href="img.jpg"> Ссылка 1 </a><br />
<a href="my.txt"> Ссылка 2 </a><br />
<a href="here.mp3"> Ссылка 3 </a><br />
<a href="you.jpg"> Ссылка 4 </a><br />
<a href="i.png"> Ссылка 5 </a><br />
</body>
</html>

devote 03.09.2011 10:24

Magneto,
Любопытно одно, почему это еще и работает... ведь дивак ты создаешь внутри функции havejpg причем не в глобальном пространстве. И при этом функция deleteDiv где-то его находит... странно однако.

Magneto 03.09.2011 11:16

devote Может показаться что функции работают следующим образом, когда функции нужно сделать
чтото с переменной то она попробует найти эту переменную внутри себя, внутри своей области видимости
и если она не находит нужную переменную то она обращается к глобальной области видимости. Но это не так.

На самом деле функции при поиске нужных переменных просто поднимаются вверх по областям видимости
родительских функций (ох загнул :))

К примеру код:

var a = 'Я глобальная переменная A';
var b = 'Я глобальная переменная B';

function first () {
  var a = 'Я переменная A обьявленная в функции first';
  
  function second () {
	alert(a);
	alert(b);
  }
  second();
}
first();


При запуске функции second первому алерту нужна переменная А но ее нету внутри функции, поэтому функция
попробует найти эту переменную в родительской функции, тоесть в функции first. Здесь эта переменная есть.
А при запуске второго алерта функция попробует найти переменную B в родительской функции(first) но там ее нету,
поэтому нужно подниматься еще выше, а выше глобальная область видимости.

Поэтому сколько у функции есть родительских функций, столько она и будет подниматься в поисках нужно переменной.
Это очень похоже на всплытие событий.

devote 03.09.2011 11:30

Magneto,
Я вкурсе как работает scope речь не об этом... речь о том что я не обратил внимания на то что функция deleteDiv находиться внутри havejpg... Вот щас внимательнее посмотрел и увидел... Сорри, моя невнимательность породила мой вопрос.

Kanzaki 03.09.2011 14:23

А можно как-нибудь сделать, чтобы div еще и следовал за курсором? Навожу на ссылку, появляется, но если водить по ссылке, он остается на месте, а нужно сделать чтобы и двигался тоже.
В идеале будет даже сделать это условие опционально. Что-то вроде:
function check()
{
if checkbox.checked = true {следовать за курсором}
else {не следовать, но все равно появляться}
}


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