Skip to content

Instantly share code, notes, and snippets.

@ilyador
Last active August 29, 2015 14:23
Show Gist options
  • Save ilyador/405f0fb1a964edbd4bef to your computer and use it in GitHub Desktop.
Save ilyador/405f0fb1a964edbd4bef to your computer and use it in GitHub Desktop.
CSS-only animated tooltips
/* Originally by Chris Bracco with a few cleanups and fixes http://cbracco.me/a-simple-css-tooltip/ */
/* Base styles for the element that has a tooltip */
[tooltip],
.tooltip {
position: relative;
cursor: pointer;
}
/* Base styles for the entire tooltip */
[tooltip]::before,
[tooltip]::after,
.tooltip::before,
.tooltip::after {
position: absolute;
visibility: hidden;
opacity: 0;
transition:
opacity 0.2s ease-in-out,
visibility 0.2s ease-in-out,
transform 0.2s cubic-bezier(0.71, 1.7, 0.77, 1.24);
transform: translate3d(0, 0, 0);
pointer-events: none;
}
/* Show the entire tooltip on hover and focus */
[tooltip]:hover::before,
[tooltip]:hover::after,
[tooltip]:focus::before,
[tooltip]:focus::after,
.tooltip:hover::before,
.tooltip:hover::after,
.tooltip:focus::before,
.tooltip:focus::after {
visibility: visible;
opacity: 1;
}
/* Base styles for the tooltip's directional arrow */
.tooltip::before,
[tooltip]::before {
z-index: 1001;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Base styles for the tooltip's content area */
.tooltip::after,
[tooltip]::after {
z-index: 1000;
padding: 8px;
width: 160px;
background-color: #000;
background-color: hsla(0, 0%, 20%, 0.9);
color: #fff;
content: attr(tooltip);
font-size: 14px;
line-height: 1.2;
}
/* Directions */
/* Top (default) */
[tooltip]::before,
[tooltip]::after,
.tooltip::before,
.tooltip::after,
.tooltip-top::before,
.tooltip-top::after {
bottom: 100%;
left: 50%;
}
[tooltip]::before,
.tooltip::before,
.tooltip-top::before {
margin-left: -6px;
margin-bottom: -12px;
border-top-color: #000;
border-top-color: hsla(0, 0%, 20%, 0.9);
}
/* Horizontally align top/bottom tooltips */
[tooltip]::after,
.tooltip::after,
.tooltip-top::after {
margin-left: -80px;
}
[tooltip]:hover::before,
[tooltip]:hover::after,
[tooltip]:focus::before,
[tooltip]:focus::after,
.tooltip:hover::before,
.tooltip:hover::after,
.tooltip:focus::before,
.tooltip:focus::after,
.tooltip-top:hover::before,
.tooltip-top:hover::after,
.tooltip-top:focus::before,
.tooltip-top:focus::after {
transform: translateY(-12px);
}
/* Left */
.tooltip-left::before,
.tooltip-left::after {
right: 100%;
bottom: 50%;
left: auto;
}
.tooltip-left::before {
margin-left: 0;
margin-right: -12px;
margin-bottom: 0;
border-top-color: transparent;
border-left-color: #000;
border-left-color: hsla(0, 0%, 20%, 0.9);
}
.tooltip-left:hover::before,
.tooltip-left:hover::after,
.tooltip-left:focus::before,
.tooltip-left:focus::after {
transform: translateX(-12px);
}
/* Bottom */
.tooltip-bottom::before,
.tooltip-bottom::after {
top: 100%;
bottom: auto;
left: 50%;
}
.tooltip-bottom::before {
margin-top: -12px;
margin-bottom: 0;
border-top-color: transparent;
border-bottom-color: #000;
border-bottom-color: hsla(0, 0%, 20%, 0.9);
}
.tooltip-bottom:hover::before,
.tooltip-bottom:hover::after,
.tooltip-bottom:focus::before,
.tooltip-bottom:focus::after {
transform: translateY(12px);
}
/* Right */
.tooltip-right::before,
.tooltip-right::after {
bottom: 50%;
left: 100%;
}
.tooltip-right::before {
margin-bottom: 0;
margin-left: -12px;
border-top-color: transparent;
border-right-color: #000;
border-right-color: hsla(0, 0%, 20%, 0.9);
}
.tooltip-right:hover::before,
.tooltip-right:hover::after,
.tooltip-right:focus::before,
.tooltip-right:focus::after {
transform: translateX(12px);
}
/* Move directional arrows down a bit for left/right tooltips */
.tooltip-left::before,
.tooltip-right::before {
top: 3px;
}
/* Vertically center tooltip content for left/right tooltips */
.tooltip-left::after,
.tooltip-right::after {
margin-left: 0;
margin-bottom: -16px;
}
<p class="tooltip-bottom" tooltip="I’m the tooltip text.">Tooltip</p>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment