Template:Tt/sandbox: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| (34 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
<includeonly>{{ | <includeonly><span class="ttt-target">{{{1}}}<span class="ttt-container ttt-container-above" style="display: none;"><span class="ttt-tooltip">{{{2}}}<span class="ttt-chevron"></span></span></span></span>{{code | ||
|css= | |css= | ||
/* Target word for the tooltip to focus on */ | /* Target word for the tooltip to focus on */ | ||
. | .ttt-target { | ||
position: relative; | |||
display: inline-block; | |||
border-bottom: 0.0625em dotted; | |||
cursor: help; | |||
} | } | ||
/* CONTAINER CLASSES */ | |||
/* A so-called 'container' for the tooltip to work around in */ | |||
.ttt-container { | |||
/* CONTAINER CLASSES */ | position: absolute; | ||
/* A so-called 'container' for the tooltip to work around in */ | left: 50%; | ||
. | min-height: 1em; | ||
width: 170px; | |||
padding: 10px 0 8px; | |||
display: flex; | |||
justify-content: center; | |||
opacity: 0; | |||
pointer-events: none; | |||
user-select: none; | |||
-webkit-user-select: none; | |||
-ms-user-select: none; | |||
transition: 0.3s ease 0.1s; /* This is used for the hover animations */ | |||
} | |||
/* Container appear above target */ | |||
.ttt-container-above { | |||
bottom: 90%; | |||
} | transform: translate(-50%, 3px); | ||
} | |||
/* Container appear above target */ | |||
. | /* Container appear below target */ | ||
.ttt-container-below { | |||
top: 90%; | |||
} | transform: translate(-50%, -3px); | ||
} | |||
/* END OF CONTAINER CLASSES */ | |||
/* The TOOLTIP itself */ | |||
.ttt-tooltip { | |||
background: #fff; | |||
border-radius: 4px; | |||
filter: drop-shadow(0 1px 4px rgba(0,0,0,0.6)); | |||
padding: 6px 9px; | |||
max-width: 100%; | |||
height: min-content; | |||
word-wrap: break-word; | |||
z-index: 999; | |||
text-align: center; | |||
} | |||
/* CHEVRON CLASSES */ | |||
/* Shared class */ | |||
.ttt-chevron { | |||
position: absolute; | |||
left: 50%; | |||
transform: translateX(-50%); | |||
width: 0; | |||
height: 0; | |||
border-style: solid; | |||
z-index: 998; | |||
} | |||
/* When tooltip is above */ | |||
.ttt-container-above .ttt-chevron { | |||
top: calc(100% - 2px); | |||
border-width: 9px 9px 0 9px; | |||
border-color: #fff transparent transparent transparent; | |||
} | |||
/* When tooltip is below */ | |||
.ttt-container-below .ttt-chevron { | |||
bottom: calc(100% - 2px); | |||
border-width: 0 9px 9px 9px; | |||
border-color: transparent transparent #fff transparent; | |||
} | |||
/* END OF CHEVRON CLASSES */ | |||
/* | /* HOVER ANIMATION CLASSES */ | ||
. | /* Tooltip fade-in */ | ||
.ttt-target:hover .ttt-container { | |||
opacity: 1; | |||
} | transform: translate(-50%, 0); | ||
pointer-events: auto; | |||
user-select: auto; | |||
-webkit-user-select: auto; | |||
-ms-user-select: auto; | |||
} | |||
/* Text bold on hover */ | |||
.ttt-target:hover { | |||
border-bottom: 0.0625em dashed; | |||
} | |||
/* END OF HOVER ANIMATION CLASSES */ | |||
}}</includeonly><noinclude> | |||
<code>tt/sandbox </code> We love {{tt/sandbox|DC|Detective Conan<ref>wjdid</ref>}}<ref>qwoidjqwoi</ref><ref>e9qjr</ref> | |||
/ | <code>tt/sandbox </code> We love {{tt/sandbox|DC|Detective Conan<ref>wjdid</ref>}}<ref>qwoidjqwoi</ref><ref>e9qjr</ref> | ||
} | |||
<code>tt/sandbox </code> We love {{tt/sandbox|DC|Detective Conan<ref>wjdid</ref>}}<ref>qwoidjqwoi</ref><ref>e9qjr</ref> | |||
/ | <code>tt</code> {{tt|DC|Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan <ref>wjdid</ref>}}<ref>qwoidjqwoi</ref><ref>e9qjr</ref> | ||
/ | |||
/ | <code>tt</code> {{tt|DC|Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan <ref>wjdid</ref>}}<ref>qwoidjqwoi</ref><ref>e9qjr</ref> | ||
} | |||
/ | <code>tt</code> {{tt|DC|Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan Detective Conan <ref>wjdid</ref>}}<ref>qwoidjqwoi</ref><ref>e9qjr</ref> | ||
} | |||
/ | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
/ | <pre> | ||
// IMPORTANT: When testing using the browser console, remove the DOMContentLoaded event listener | |||
document.addEventListener("DOMContentLoaded", function () { | |||
var tooltips = document.querySelectorAll(".ttt-container"); | |||
function adjustTooltipPositions() { | |||
Array.prototype.forEach.call(tooltips, function (tooltipContainer) { | |||
var tooltip = tooltipContainer.querySelector(".ttt-tooltip"); | |||
var chevron = tooltip.querySelector(".ttt-chevron"); | |||
} | // 1. Temporarily show tooltip to measure size | ||
/ | tooltipContainer.style.opacity = "0"; | ||
tooltipContainer.style.display = "flex"; | |||
}} | tooltip.style.transform = ""; | ||
var tooltipRect = tooltip.getBoundingClientRect(); | |||
var targetRect = tooltipContainer.parentElement.getBoundingClientRect(); | |||
// 2. Measure how much the tooltip is outside the viewport | |||
var overflowTop = tooltipRect.top < 1; | |||
var spaceTop = targetRect.top > tooltipRect.height + 10; | |||
var overflowLeft = Math.min(Math.max(0, -tooltipRect.left), 0.5 * tooltipRect.width - 15); | |||
var overflowRight = Math.min(Math.max(0, tooltipRect.right - document.documentElement.clientWidth), 0.5 * tooltipRect.width - 15); | |||
// 3. Shift tooltip into view if needed and move chevron accordingly | |||
if (overflowTop) { | |||
tooltipContainer.classList.remove("ttt-container-above"); | |||
tooltipContainer.classList.add("ttt-container-below"); | |||
} else if (spaceTop) { | |||
tooltipContainer.classList.add("ttt-container-above"); | |||
tooltipContainer.classList.remove("ttt-container-below"); | |||
} | |||
if (overflowLeft > 0) { | |||
tooltip.style.transform = "translateX(calc(" + overflowLeft + "px + 4px))"; | |||
chevron.style.transform = "translateX(calc(-50% - " + overflowLeft + "px - 4px))"; | |||
} else if (overflowRight > 0) { | |||
tooltip.style.transform = "translateX(calc(-" + overflowRight + "px - 4px))"; | |||
chevron.style.transform = "translateX(calc(-50% + " + overflowRight + "px + 4px))"; | |||
} else { | |||
tooltip.style.transform = ""; | |||
chevron.style.transform = ""; | |||
} | |||
// 4. Hide it again until hover | |||
tooltipContainer.style.opacity = ""; | |||
tooltipContainer.style.display = ""; | |||
}); | |||
} | |||
// Run on page load, resize, and scroll | |||
adjustTooltipPositions(); | |||
window.addEventListener("resize", adjustTooltipPositions); | |||
window.addEventListener("scroll", adjustTooltipPositions, true); | |||
}); | |||
</pre> | |||
</noinclude> | |||
Latest revision as of 12:50, 11 June 2025
// IMPORTANT: When testing using the browser console, remove the DOMContentLoaded event listener
document.addEventListener("DOMContentLoaded", function () {
var tooltips = document.querySelectorAll(".ttt-container");
function adjustTooltipPositions() {
Array.prototype.forEach.call(tooltips, function (tooltipContainer) {
var tooltip = tooltipContainer.querySelector(".ttt-tooltip");
var chevron = tooltip.querySelector(".ttt-chevron");
// 1. Temporarily show tooltip to measure size
tooltipContainer.style.opacity = "0";
tooltipContainer.style.display = "flex";
tooltip.style.transform = "";
var tooltipRect = tooltip.getBoundingClientRect();
var targetRect = tooltipContainer.parentElement.getBoundingClientRect();
// 2. Measure how much the tooltip is outside the viewport
var overflowTop = tooltipRect.top < 1;
var spaceTop = targetRect.top > tooltipRect.height + 10;
var overflowLeft = Math.min(Math.max(0, -tooltipRect.left), 0.5 * tooltipRect.width - 15);
var overflowRight = Math.min(Math.max(0, tooltipRect.right - document.documentElement.clientWidth), 0.5 * tooltipRect.width - 15);
// 3. Shift tooltip into view if needed and move chevron accordingly
if (overflowTop) {
tooltipContainer.classList.remove("ttt-container-above");
tooltipContainer.classList.add("ttt-container-below");
} else if (spaceTop) {
tooltipContainer.classList.add("ttt-container-above");
tooltipContainer.classList.remove("ttt-container-below");
}
if (overflowLeft > 0) {
tooltip.style.transform = "translateX(calc(" + overflowLeft + "px + 4px))";
chevron.style.transform = "translateX(calc(-50% - " + overflowLeft + "px - 4px))";
} else if (overflowRight > 0) {
tooltip.style.transform = "translateX(calc(-" + overflowRight + "px - 4px))";
chevron.style.transform = "translateX(calc(-50% + " + overflowRight + "px + 4px))";
} else {
tooltip.style.transform = "";
chevron.style.transform = "";
}
// 4. Hide it again until hover
tooltipContainer.style.opacity = "";
tooltipContainer.style.display = "";
});
}
// Run on page load, resize, and scroll
adjustTooltipPositions();
window.addEventListener("resize", adjustTooltipPositions);
window.addEventListener("scroll", adjustTooltipPositions, true);
});