При наведении всплывающие окна рядом

329
09 июня 2017, 08:58

Есть идентичные элементы на странице. При наведении на любой из них должно появляться всплывающее окно рядом. Но проблема в том, что при наведении всплывают окна сразу рядом со всеми, при чем при наведении на некоторые вообще ничего не происходит. Как с этим быть, подскажите пожалуйста.(присвоить каждому id не годится).

$(function() { 
	$('#info').hover( 
		function($this){ 
			$('.modalInfo').toggleClass('active');} 
			); 
      });
.modalInfo { 
  display: none; 
} 
.info { 
  display: block 
  width: 50px; 
  height: 20px; 
  background: red; 
  margin-right: 40px; 
} 
 
.modalInfo.active { 
display: block; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
<i class = "info" id="info">INFO</i> 
 
<div class = "modalInfo"> 
<p>Давно выяснено, что при оценке дизайна и композиции читаемый текст мешает</p> 
</div> 
 
<i class = "info" id="info">INFO</i> 
 
<div class = "modalInfo"> 
<p>Давно выяснено, что при оценке дизайна и композиции читаемый текст мешает</p> 
</div> 
 
<i class = "info" id="info">INFO</i> 
 
<div class = "modalInfo"> 
<p>Давно выяснено, что при оценке дизайна и композиции читаемый текст мешает</p> 
</div> 
 
<i class = "info" id="info">INFO</i> 
 
<div class = "modalInfo"> 
<p>Давно выяснено, что при оценке дизайна и композиции читаемый текст мешает</p> 
</div>

Answer 1

Во-первых на одной страницы неправильно располагать несколько элементов с одинаковыми id. Во-вторых, почему бы не вынести HTML разметку в data для удобства и чтобы не плодить кучу "модальных окон"?

По решению: есть один элемент с id=modal - это модальное окно. При наведении на .info сетаем ему позицию top и left относительно элемента, на который мы навели мышь. Получаем данные из аттрибута data-modal-text, создаем #modal и вставляем в него данные. При выходе мыши с элемента - удаляем #modal.

$('.info').hover( 
  function() { 
    let top = $(this).offset().top + $(this).height(); 
    let left = $(this).offset().left; 
    let data = $(this).data('modal-text'); 
 
    let div = document.createElement('div'); 
    div.id = 'modal'; 
    $(div).css('top', top); 
    $(div).css('left', left); 
    $(div).html(data); 
    $('body').append(div); 
  }, 
  function() { 
    $('#modal').remove(); 
  });
.info { 
  display: block width: 50px; 
  height: 20px; 
  background: red; 
  margin-right: 40px; 
} 
 
#modal { 
  width: 200px; 
  border: solid 1px black; 
  position: absolute; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<i class="info" data-modal-text="<p>Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p>">INFO</i> 
 
<i class="info" data-modal-text="<p>Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p>">INFO</i> 
 
<i class="info" data-modal-text="<p>Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p>">INFO</i> 
 
<i class="info" data-modal-text="<p>Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p>">INFO</i>

Либо, если HTML в этих "модальных окнах" может быть большим, то будет красивее представить их в виде разметки и провайдить data-modal-id:

$('.info').hover( 
  function() { 
    let top = $(this).offset().top + $(this).height(); 
    let left = $(this).offset().left; 
    let modalId = '#' + $(this).data('modal-id'); 
    let data = $(modalId).html(); 
 
    let div = document.createElement('div'); 
    div.id = 'modal'; 
    $(div).css('top', top); 
    $(div).css('left', left); 
    $(div).html(data); 
    $('body').append(div); 
  }, 
  function() { 
    $('#modal').remove(); 
  });
.info { 
  display: block width: 50px; 
  height: 20px; 
  background: red; 
  margin-right: 40px; 
} 
 
#modal { 
  width: 200px; 
  border: solid 1px black; 
  position: absolute; 
} 
 
.modal-data { 
  display: none; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<i class="info" data-modal-id="info1data">INFO</i> 
 
<i class="info" data-modal-id="info2data">INFO</i> 
 
<i class="info" data-modal-id="info3data">INFO</i> 
 
<i class="info" data-modal-id="info4data">INFO</i> 
 
<div id="info1data" class="modal-data"> 
  <p>info1data: Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p> 
</div> 
 
<div id="info2data" class="modal-data"> 
  <p>info2data: Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p> 
</div> 
 
<div id="info3data" class="modal-data"> 
  <p>info3data: Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p> 
</div> 
 
<div id="info4data" class="modal-data"> 
  <p>info4data: Давно выяснено, что при оценке дизайна и композиции читаемый. текст мешает</p> 
</div>

Почитать:

  • .data()
  • .css()
  • .html()
  • .append()
  • .remove()
READ ALSO
Выполнение запроса с комментариями в firebird

Выполнение запроса с комментариями в firebird

Столкнулся с неожиданной проблемойВ запросе используются комментарии строк (--comment), ранее встречал только комментарии блоков (/comment/)

373
Отображение кнопки в RichTextBox

Отображение кнопки в RichTextBox

Как отобразить Button напротив строки на которую наведен курсор или же напротив строки на которую нажал пользователь? Пример на рисунке

270
Ошибка с базой данных, нет такой таблицы?

Ошибка с базой данных, нет такой таблицы?

Есть база данных в которую нужно записать значения из полей "регистрация в игре" при попытке записи выдает ошибку Unable to open Assets/youtubebytes

373
Выгрузка из MySql

Выгрузка из MySql

Как можно выполнить выгрузку из бд MySQL? Я пробовал в DataTable все выгружать, но есть ли более "гибкий" вариант? Например через linq? Если да, то каким...

240