Как добавить всплывающую подсказку в div - PullRequest
515 голосов
/ 19 августа 2011

У меня есть тег div следующим образом:

<html>
    <head></head>
    <body>
        <div>
            <label>Name</label>
            <input type="text"/>
        </div>
    </body>
</html>

Теперь я хочу простой JavaScript для отображения всплывающей подсказки на :hover div. Всплывающая подсказка также должна иметь эффект постепенного исчезновения.

Ответы [ 26 ]

807 голосов
/ 19 августа 2011

Для основной всплывающей подсказки вы хотите:

<div title="This is my tooltip">

Для более интересной версии JavaScript вы можете посмотреть:

https://jqueryhouse.com/best-jquery-tooltip-plugins/

Приведенная выше ссылка даетвам 25 вариантов подсказок.

256 голосов
/ 12 сентября 2014

Это можно сделать только с CSS , без JavaScript вообще : запущенная демонстрация

  1. Применить пользовательский атрибут HTML, например.tooltip="bla bla" к вашему объекту (div или какому-либо другому):

    <div tooltip="bla bla">
        something here
    </div>
    
  2. Определите псевдоэлемент :before каждого объекта [tooltip], чтобы он был прозрачным, абсолютно позиционированным и с tooltip=""значение как содержимое:

    [tooltip]:before {            
        position : absolute;
         content : attr(tooltip);
         opacity : 0;
    }
    
  3. Определите :hover:before состояние зависания каждого [tooltip], чтобы сделать его видимым:

    [tooltip]:hover:before {        
        opacity : 1;
    }
    
  4. Примените ваши стили (цвет, размер, положение и т. Д.) К объекту подсказки;конец истории.

В демоверсии я определил другое правило, чтобы указать, должна ли подсказка исчезать при наведении на нее, но вне родителя, с другим настраиваемым атрибутом, tooltip-persistentи простое правило:

[tooltip]:not([tooltip-persistent]):before {
    pointer-events: none;
}

Примечание 1: Охват браузером для этого очень широк, но рассмотрите возможность использования отступления JavaScript (если необходимо) для старого IE.

Примечание 2: может быть добавлено немного javascript для вычисления положения мыши и добавления его к псевдоэлементам путем изменения применяемого к нему класса.

76 голосов
/ 19 августа 2011

Вам не нужен JavaScript для этого вообще; просто установите атрибут title:

<html><head></head>
<body>
<div title="Hello, World!">
<label>Name</label>
<input type="text"/>
</div>
</body>
</html>

Обратите внимание, что визуальное представление всплывающей подсказки зависит от браузера / ОС, поэтому оно может исчезнуть, а может и нет. Тем не менее, это семантический способ создания всплывающих подсказок, и он будет корректно работать с такими программами, как программы для чтения с экрана.

См:

<div title="Hello, World!">
<label>Name</label>
<input type="text"/>
</div>
17 голосов
/ 19 августа 2011

Вот хорошая подсказка jQuery:

https://jqueryui.com/tooltip/

Чтобы реализовать это, просто выполните следующие действия:

  1. Добавьте этот код в свой<head></head> теги:

    <script type="text/javascript" src="http://cdn.jquerytools.org/1.2.5/full/jquery.tools.min.js"></script>    
    <script type="text/javascript">
    $("[title]").tooltip();
    </script> 
    <style type="text/css"> 
    
    /* tooltip styling. by default the element to be styled is .tooltip  */
    .tooltip {
        display:none;
        background:transparent url(https://dl.dropboxusercontent.com/u/25819920/tooltip/black_arrow.png);
        font-size:12px;
        height:70px;
        width:160px;
        padding:25px;
        color:#fff;
    }
    </style> 
    
  2. В элементах HTML, для которых вы хотите иметь всплывающую подсказку, просто добавьте к ней атрибут title.Какой бы текст ни был в атрибуте заголовка, он будет отображаться во всплывающей подсказке.

Примечание: Когда JavaScript отключен, он возвращается к всплывающей подсказке браузера / операционной системы по умолчанию.

16 голосов
/ 06 октября 2011

Я сделал кое-что, что также должно быть адаптировано к div.

HTML

<td>
    <%# (Eval("Name").ToString().Length > 65) ? Eval("Name").ToString().Substring(0, 60) + "..." : Eval("Name")%>
    <span class="showonhover">
        <a href="#"><%# (Eval("Name").ToString().Length > 65) ? "More" : "" %></a>
        <span class="hovertext">
            <%# Eval("Name") %>
        </span>
    </span>
</td>

CSS

.showonhover .hovertext { display: none;}
.showonhover:hover .hovertext {display: inline;}
a.viewdescription {color:#999;}
a.viewdescription:hover {background-color:#999; color: White;}
.hovertext {position:absolute;z-index:1000;border:1px solid #ffd971;background-color:#fffdce;padding:11px;width:150px;font-size: 0.75em;}

Более подробное обсуждение см. В моем сообщении:

Простой отформатированный текст всплывающей подсказки при наведении курсора

14 голосов
/ 12 сентября 2014

Вот реализация чистого CSS 3 (с дополнительным JS)

Единственное, что вам нужно сделать, это установить атрибут для любого элемента div, называемого «data-tooltip», и этот текст будет отображаться рядом с ним, когда вы наводите курсор на него.

Я включил дополнительный JavaScript, который будет вызывать всплывающую подсказку рядом с курсором. Если вам не нужна эта функция, вы можете спокойно игнорировать часть JavaScript этой скрипки.

Если вы не хотите постепенного появления состояния при наведении, просто удалите свойства перехода .

Он похож на подсказку свойства title. Вот JSFiddle: http://jsfiddle.net/toe0hcyn/1/

HTML Пример:

<div data-tooltip="your tooltip message"></div>

CSS:

*[data-tooltip] {
    position: relative;
}

*[data-tooltip]::after {
    content: attr(data-tooltip);

    position: absolute;
    top: -20px;
    right: -20px;
    width: 150px;

    pointer-events: none;
    opacity: 0;
    -webkit-transition: opacity .15s ease-in-out;
    -moz-transition: opacity .15s ease-in-out;
    -ms-transition: opacity .15s ease-in-out;
    -o-transition: opacity .15s ease-in-out;
    transition: opacity .15s ease-in-out;

    display: block;
    font-size: 12px;
    line-height: 16px;
    background: #fefdcd;
    padding: 2px 2px;
    border: 1px solid #c0c0c0;
    box-shadow: 2px 4px 5px rgba(0, 0, 0, 0.4);
}

*[data-tooltip]:hover::after {
    opacity: 1;
}

Необязательный JavaScript для изменения местоположения всплывающей подсказки мыши:

var style = document.createElement('style');
document.head.appendChild(style);

var matchingElements = [];
var allElements = document.getElementsByTagName('*');
for (var i = 0, n = allElements.length; i < n; i++) {
    var attr = allElements[i].getAttribute('data-tooltip');
    if (attr) {
        allElements[i].addEventListener('mouseover', hoverEvent);
    }
}

function hoverEvent(event) {
    event.preventDefault();
    x = event.x - this.offsetLeft;
    y = event.y - this.offsetTop;

    // Make it hang below the cursor a bit.
    y += 10;

    style.innerHTML = '*[data-tooltip]::after { left: ' + x + 'px; top: ' + y + 'px  }'

}
11 голосов
/ 12 сентября 2014

Хорошо, вот все ваши требования к награде:

  • Нет jQuery
  • Мгновенное появление
  • Не исчезает, пока мышь не покинет область
  • Включен эффект постепенного исчезновения
  • И наконец .. простое решение

Вот демонстрация и ссылка на мой код (JSFiddle)

Вот функции, которые я включил в эту скрипту JS, CSS и HTML5:

  • Вы можете установить скорость замирания.
  • Вы можете установить текст всплывающей подсказки с помощью простой переменной.

HTML:

<div id="wrapper">
    <div id="a">Hover over this div to see a cool tool tip!</div>
</div>

CSS:

#a{
    background-color:yellow;
    padding:10px;
    border:2px solid red;    
}

.tooltip{
    background:black;
    color:white;
    padding:5px;
    box-shadow:0 0 10px 0 rgba(0, 0, 0, 1);
    border-radius:10px;
    opacity:0;
}

JavaScript:

var div = document.getElementById('wrapper');
var a = document.getElementById("a");
var fadeSpeed = 25; // a value between 1 and 1000 where 1000 will take 10
                    // seconds to fade in and out and 1 will take 0.01 sec.
var tipMessage = "The content of the tooltip...";

var showTip = function(){    
    var tip = document.createElement("span");
    tip.className = "tooltip";
    tip.id = "tip";
    tip.innerHTML = tipMessage;
    div.appendChild(tip);
    tip.style.opacity="0"; // to start with...
    var intId = setInterval(function(){
        newOpacity = parseFloat(tip.style.opacity)+0.1;
        tip.style.opacity = newOpacity.toString();
        if(tip.style.opacity == "1"){
            clearInterval(intId);
        }
    }, fadeSpeed);
};
var hideTip = function(){
    var tip = document.getElementById("tip");
    var intId = setInterval(function(){
        newOpacity = parseFloat(tip.style.opacity)-0.1;
        tip.style.opacity = newOpacity.toString();
        if(tip.style.opacity == "0"){
            clearInterval(intId);
            tip.remove();
        }
    }, fadeSpeed);
    tip.remove();
};

a.addEventListener("mouseover", showTip, false);
a.addEventListener("mouseout", hideTip, false);
4 голосов
/ 11 сентября 2014

Простейшим способом было бы установить position: relative для содержащего элемента и position: absolute для элемента всплывающей подсказки внутри контейнера, чтобы он плавал относительно родительского (содержащего элемента). Например:

<div style="background: yellow;">
    <div style="display: inline-block; position: relative; background: pink;">
        <label>Name</label>
        <input type="text" />

        <div style="background: #e5e5e5; position: absolute; top: -10px; left: 0; right: 0;">
            Tooltip text
        </div>
    </div>
</div>
4 голосов
/ 11 сентября 2014

Как насчет этого, извините, код не оптимизирован, потому что я спешу, но я думаю, вы поймете:

http://jsfiddle.net/prollygeek/1b0Lrr8d/

//Auxiliary functions
function createToolTip(divName,tips)
{
 document.getElementById(divName).innerHTML+='<div class="tooltip">'+tips+'</div>' 
}
function removeToolTip(divName)
{
document.getElementById(divName).removeChild( document.getElementById(divName).getElementsByClassName("tooltip")[0])
}
function Tooltip(divName,tips)
{
document.getElementById(divName).onmouseover=function(){createToolTip(divName,tips)}

document.getElementById(divName).onmouseout=function(){removeToolTip(divName)}
}

//Sample Usage
Tooltip("mydiv","hello im a tip div")
4 голосов
/ 11 сентября 2014

Вы можете создавать собственные подсказки CSS, используя атрибут данных, псевдоэлементы и content: attr() например.

http://jsfiddle.net/clintioo/gLeydk0k/11/

<div data-tooltip="This is my tooltip">
    <label>Name</label>
    <input type="text" />
</div>

.

div:hover:before {
    content: attr(data-tooltip);
    position: absolute;
    padding: 5px 10px;
    margin: -3px 0 0 180px;
    background: orange;
    color: white;
    border-radius: 3px;
}

div:hover:after {
    content: '';
    position: absolute;
    margin: 6px 0 0 3px;
    width: 0;
    height: 0;
    border-top: 5px solid transparent;
    border-right: 10px solid orange;
    border-bottom: 5px solid transparent;
}

input[type="text"] {
    width: 125px;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
...