Предположим, что мы не хотим устанавливать bootstrap ради одного лишь компонента подсказок, ибо привитая жадность к любым ресурсам, когда устройства были слабыми, а интернет со скоростью 5 кб в секунду, сделали с нашей психикой непоправимое на всю жизнь. Хотя… я и до сих пор считаю, что ни одной не используемой функции, ни одной строки любого кода, не должно быть лишней и все эти «комбайны», «движки» и библиотеки — от лукавого. Либо, у нас есть сайт, где мы хотим реализовать не стандартные и красивые всплывающие подсказки, подогнав их css под свой дизайн, а стандартные подсказки из атрибута title нас не устраивают, тем более, что появляются они не сразу при наведении на элемент. Тогда подгружаем на странице такой код и радуемся:
HTMLElement.prototype.tooltip = function () { this.onmouseover = function (e) { document.querySelectorAll(".tooltip").forEach(element => { element.parentNode.removeChild(element); }); if (e.target.hasAttribute("data-title")) { e.target.setAttribute("title", e.target.getAttribute("data-title")); e.target.removeAttribute("data-title"); } if (e.target.hasAttribute("title")) { var s = document.createElement("span"); s.innerHTML = e.target.getAttribute("title"); s.setAttribute("class", "tooltip"); s.style.cssText = "position:absolute;background:rgb(0, 0, 0, 0.7);border-radius:3px;font-size:9px;padding:4px;top:" + (e.pageY - 20) + "px;z-index:1;transition: all 600ms ease-out;z-index:9999999999999;color:#fff;white-space: nowrap;display:inline-block;max-width:400px;overflow:hidden;"; document.body.appendChild(s); var x = (document.body.clientWidth / 2) > e.pageX ? (e.pageX + 15) : (e.pageX - s.clientWidth - 15); s.style.left = x + "px"; e.target.setAttribute("data-title", s.innerHTML); e.target.removeAttribute("title"); } } this.onmousemove = this.onmouseover; } document.body.tooltip();