Всплывающие подсказки на jquery
Для всплывающих подсказок на jquery не обязательно устанавливать плагины. Можно воспользоваться заготовкой, а затем подстроить скрипты и стили под свои нужды. Изначально jquery скрипты настроены для всплытия подсказок при клике на определенный текст, но можно переделать показ при наведении курсора. Рассмотрим первый вариант.
Перейдём к реализации. Для этого потребуется проделать следующие шаги:
- подключить jquery библиотеку;
- подключить скрипты, отвечающие за всплытие;
- прописать оформительские стили;
- создать в коде страницы всплывающие окна;
- создать элементы, при клике по которым будут показываться подсказки.
Исходим из того, что jquery библиотека уже подключена. Переходим к подключению скриптов. Просто скопируйте их на страницу или вынесите в отдельный файл и подключите его.
<script type="text/javascript"> $(function () { $('.real-show-hint').on("click", function(e){ e = e || window.event; e.preventDefault(); var ypos = $(this).offset().top+24; var xpos = $(this).offset().left; var RealHint = $(this).data('hint'); $(RealHint).css('top',ypos); $(RealHint).css('left',xpos); $(RealHint).toggle('fast'); return; }); $('.prm-cross').on('click', function(){ $(this).parent().hide('fast'); return false; }); document.onclick = function(e){ if ($(e.target).hasClass('real-hint')==false) $('.real-hint').hide('fast'); return; } }); </script>
Обращу внимание на первую строку $('.real-show-hint').on("click", function(e){. Эта функция отвечает за событие, которое приведёт к всплытию подсказки. Если заменить "click" на "mouseover mouseout", то подсказки будут появляться при наведении мыши, а не клике.
Теперь подключаем оформительские стили. Изменяя их, можно добиться нужного внешнего вида окон.
<style type="text/css"> .real-hint { background-color: #fff; border: 1px solid #aaa; border-radius: 10px; display: none; padding: 5px 10px; position: absolute; width: 250px; z-index: 99; } .real-hint .hint-caption { font-weight: bold; text-transform: uppercase; } .real-hint .prm-cross { background: url("/images/cross.jpg") no-repeat scroll right top rgba(0, 0, 0, 0); cursor: pointer; float: right; height: 16px; margin-top: 3px; padding-left: 15px; right: 10px; width: 16px; } .real-show-hint { cursor: pointer; border-bottom: dashed 1px; color: #8c0000; } </style>
В строке background: url("/images/cross.jpg") указывается путь к изображению крестика, используемого для закрытия всплывающей подсказки. Не забудьте загрузить это изображение на сайт и указать правильный путь. Вот иконка:
Создаём окна с подсказками. По умолчанию они будут скрытыми (за это отвечают стили). Размещать их лучше после открывающегося тега «body» или перед закрывающимся. Если разместить где-то в другом месте, то координаты всплывающего окна могут рассчитаться неправильно. Это зависит от вёрстки. На некотрых сайтах может быть всё в порядке, а на некоторых — нет.
<div id="real-hint-1" class="real-hint"> <div class="prm-cross"></div> <span class="hint-caption">Подсказка 1.</span><br/> Вы нажали на первую ссылку </div> <div id="real-hint-2" class="real-hint"> <div class="prm-cross"></div> <span class="hint-caption">Подсказка 2.</span><br/> Вы нажали на вторую ссылку </div>
Вы нажали на первую ссылку
(help)
Подсказок может быть сколько угодно. Основные требования, это class="real-hint" и id="real-hint-2". Идентификатор у каждой подсказки должен быть уникальным, именно его мы будем указывать в аттрибутах элемента при клике на который будет осуществлено всплытие.
<span class="real-show-hint" data-hint="#real-hint-1" >Ссылка на подсказку 1</span> <span class="real-show-hint" data-hint="#real-hint-2" >Ссылка на подсказку 2</span>
А вот и сами элементы, при нажатии на которые будет показываться то или иное окно. Элементами могут выступать любые теги, главное прописать для них класс и аттрибут, указывающий на идентификатор подсказки, которую следует показать: class="real-show-hint" data-hint="#real-hint-1". Решётка перед идентификатором подсказки обязательна.
Jquery подсказка, появляющаяся при наведеннии мыши
Рассмотрим ещё одни способ создания всплывающих подсказок. по принципу действия он аналогичен первому, за некоторыми исключениями. Подсказки появляются при наведении курсора на какой-то эелемент и перемещаются вслед за мышью.
Наведи курсор 1 Наведи курсор 2
В код страницы добавляем пустой элемент:
<div id="tooltip"></div>
Для этого элемента прописываем стиль.
#tooltip { z-index: 9999; position: absolute; display: none; top:0px; left:0px; width: 250px; background-color: #fff; padding: 5px 10px 5px 10px; color: #000; border-radius: 5px; box-shadow: 0 1px 2px #555; }
Добавляем элементы, при наведении на которые будет появляться подсказка.
<p><span data-tooltip="Подсказка номер 1">Подсказка 1</span> | <span data-tooltip="Подсказка номер 2">Подсказка 2</span></p>
И остается jquery скрипт.
$(function(){ $("[data-tooltip]").mousemove(function (eventObject) { $data_tooltip = $(this).attr("data-tooltip"); $("#tooltip").html($data_tooltip) .css({ "top" : eventObject.pageY + 5, "left" : eventObject.pageX + 5 }) .show(); }).mouseout(function () { $("#tooltip").hide() .html("") .css({ "top" : 0, "left" : 0 }); }); });
Вы нажали на вторую ссылку
Я хочу сделать один сводный файл со всеми подсказками, а при необходимости использования на странице подсказки, просто указывать путь к нужному куску текста. Как на Яндекс.Маркет. На мой взгляд, это намного удобнее в плане правки исходного текста подсказок и их одинаковости на всех страницах.
Хранить как js в отдельном файле примерно так:
var hints = {«real-hint1»: «1», «real-hint2»: «2» ......};
Он будет отлично кешироваться браузером и Вашим веб-сервером. Доступаться в js-коде так:
hints[«real-hint1»]
где вместо «real-hint1» используйте id элемента (у вас — span с надписями «Ссылка»). Тогда Вам не понадобятся DIV-вы на каждый хинт — конструируйте их из одного, невидимого шаблона — совсем хорошо, если у Вас на странице 50 хинтов — реально сократится размер страницы.
Прикручиваю все это дело к WP
Что касается твоей проблемы — попробуй в функции заменить return; на return false;, а то что удалял — верни.
1. Зачем в коде присутствует этот элемент, после удаления этих строк ничего не изменилось, скрипт работает корректно?
$('.prm-cross').on('click', function(){
$(this).parent().hide('fast');
return false;
});
2. Как сделать так что бы при нажатии к примеру на 2 подсказку 1 подсказка сразу же автоматически закрывалась?
То что мне нужно было и с чем провозилась три дня!!!
Либо каким-то другим jquery плагином пробовать вывести подсказку, их много.
Подскажите пожалуйста:
Как сделать так что бы при нажатии к примеру на вторую подсказку первая подсказка сразу же автоматически закрывалась?
закрыватся будет только при нажатии на крестик, по другому никак
Но — хочу вникнуть в суть, что вот это за «штуки»:
$('#last-order') и ещё ' аМаИаН'
Гугл про #last-order' и про ' аМаИаН' выдаёт всякую постороннюю хрень :(
Подскажите, что это за выражения и зачем они нужны в данном случае?
Копировал скрипт из одного своего проекта, где требовалась подмена всплывающего текста в зависимости от другого элемента. аМаИаН — в правильной кодировке — минут. Соответственно шла подмена значения '0 минут' на значение из элемента #last-order, типа на 5 минут.
Я так понимаю в этом кусочке передается текст мне бы картинку img/****.png
Если же во всех подсказках будут именно картинки, то можно в data-tooltip передавать путь к изображению а в скрипте переделать блок на:
может что и выйдет.
черт с ним.
Может как то возможно в первом случае, там где по нажатию окно вылазит, оно всегда появляется в одном и том же месте,
а можно сделать так что бы по нажатию( допустим жму на картинку и в том месте где был курсор появилось это окошко или рядом с картинкой)
нужно отловить клик на элементе, принять положение курсора в этом месте и передать в эти переменные.
Ещё попробуй заменить на
Ну либо поищи jquery плагины с всплывающими подсказками. Наверняка полно разных.
Ну и в скриптах править, например сюда добавить:
И надо ещё продумывать, как убирать этот класс, если нажали на кнопку закрытия. Я пока не придумал, дописывать надо много.
Замечательно! Просто, изящно и работает. Правда у меня не работает одно, в вопросах не нашел братьев по несчастью: если в тексте подсказки ссылка, то она не кликабельна. ЧЯДНТ?
Правильно понимаю, что скрипт должен грузиться одновременно с отрисовкой целевых ? Просто я пытался сделать так — в Но на странице формируется html через ajax (корзина товаров), и вставленный туда real-show-hint не работает — я вывожу его вместе через переменную в PHP и заработало только когда в эту переменную пихнуть и Я тупенький, а нельзя ли основной скрипт запихнуть куда-нибудь типа
$(document).ajaxComplete(...)
Ну то есть добавить прослушку события — загрузка страницы ИЛИ обновление аяксом (ну типа чтобы работало везде — и на статических стр. тоже)? Я с при помощи stackoverflow и такой-то матери в одном месте у себя так за ставил работать калькулятор тарифов…
Но! Для счастья не хватает одного: у wz_tooltip окошко всплывающее не ездило за курсором, но при этом не выходило за вьюпорт — то есть на узких экранах оно упиралось в левый край и относительно курсора сдвигалось влево.
У этого скрипта окно выскакивает за край, если близко от края курсор… Нельзя это как-то реализовать как у wz_tooltip? Точнее — знаю, что можно. Вопрос как…
Если по горизонтали окно не влезает в расстояние до края, то оно упирается в край.
Если по вертикали окно не влезает в расстояние до низа браузера — оно перекидывается вверх. Если при этом вверху тоже мало места — то окно встает серединой к мыши.
Итог:
И окошко вылетает за край, при повторном тапе — все ОК, упирается в край как надо.
Я думаю, может поставить задержку в 10-20мс? Или как это решить? Чтобы пока не получены размеры окна — не выполнять if
ВЫХОД — сначала грузить в #tooltip содержимое и только потом получать document.getElementById('tooltip').offsetWidth;
Попробовал так:
разбил на
и
И первую строчку переместил сразу после получения содержимого из атрибута
Не помогло… Хотя — если ДОЛЖНО было помочь, может еще попробовать, может закешировалось что?
Ибо свойство наследуется от элемента, на котором кликнули — если там был болд, то внутри подсказки все, что вне стилей (просто текстом) будет тоже болд.