Tooltip 為實務上常見效果,可完全使用 CSS 實現。
Version
CSS 3
Page
當 hover 過 Hover over me!
時,會在右側顯示紅色 I'm tooltip
。
Template
<template>
<div class="title">
Hover over me!
</div>
</template>
<style scoped>
.title {
position: relative;
top: 20px;
border-bottom: 1px solid #f00;
display: inline-block;
}
.title:before {
content: "I'm tooltip";
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 100%;
margin-left: 18px;
width: 100px;
padding: 10px;
border-radius: 10px;
background: #f00;
color: #fff;
text-align: center;
opacity: 0;
transition: opacity 1s;
}
.title:hover:before {
opacity: 1;
}
.title:after {
content: '';
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 100%;
margin-left: -2px;
border: 10px solid;
border-color: transparent #f00 transparent transparent;
opacity: 0;
transition: opacity 1s;
}
.title:hover:after {
opacity: 1;
}
</style>
第 2 行
<div class="title">
Hover over me!
</div>
HTML 部分並沒有 tooltip,完全由 CSS 產生。
第 8 行
.title {
position: relative;
top: 20px;
border-bottom: 1px solid #f00;
display: inline-block;
}
設定 title style:
position: relative
:before
與after
即將使用 absolute position,因此在父層使用 relative position 定位top: 20px
:設定 title 上緣與 browser 距離border-bottom: 1px solid #f00
:設定 title 下方紅線 underlinedisplay: inline-block
:使<div>
與 content 同寬,否則 underline 寬度會一整列,且 tooltip 也會顯示在 browser 之外
15 行
.title:before {
content: "I'm tooltip";
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 100%;
margin-left: 18px;
width: 100px;
padding: 10px;
border-radius: 10px;
background: #f00;
color: #fff;
text-align: center;
opacity: 0;
transition: opacity 1s;
}
使用 before
設定 tooltip style:
content: "I'm tooltip"
:設定 tooltip 內容position: absolute
:設定使用 absolute postiontop: 50%
:設定 tooltip 的top
為父層title
高度的一半transform: translateY(-50%)
:設定 tooltip 向上移動本身高度的一半,此為垂直置中
慣用 patternleft: 100%
:設定 tooltip 的left
為父層title
的寬度margin-left: 18px
:設定 tooltip 的 left margin 放置三角形width: 100px
:設定 tooltip 的 widthpadding: 10px
:設定 tooltip 的 paddingborder-radius: 10px
:設定 tooltip 的四角為弧形background: #f00
:設定 tooltip 背景為紅色color: #fff
:設定 tooltip 的文字為白色text-align: center
:設定 tooltip 文字水平置中opacity: 0
:設定 tooltip 一開始不顯示transition: opacity 1s
:設定 tooltip 改變 opacity 時,使用1s
漸漸改變
32 行
.title:hover:before {
opacity: 1;
}
當 hover 過 title 時,設定 tooltip style:
opacity: 1
:設定 tooltip 顯示
title:hover:before
相當於 CSS 的hover
event handler
36 行
.title:after {
content: '';
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 100%;
margin-left: -2px;
border: 10px solid;
border-color: transparent #f00 transparent transparent;
opacity: 0;
transition: opacity 1s;
}
使用 after
設定 triangle style:
content: ''
:將content
設定為 empty string,避免 triangle 不顯示position: absolute
:設定使用 absolute postiontop: 50%
:設定 triangle 的top
為父層title
高度的一半transform: translateY(-50%)
:設定 triangle 向上移動本身高度的一半,此為垂直置中
慣用 patternleft: 100%
:設定 triangle 的left
為父層title
的寬度margin-left: -2px
:設定 triangle 與title
間距離border: 10px solid
:因為 triangle 主要是由 border 實現,統一設定 border 為10px
與solid
border-color: transparent #f00 transparent transparent
:設定四個 border 顏色opacity: 0
:設定 triangle 一開始不顯示transition: opacity 1s
:設定 tooltip 改變 opacity 時,使用1s
漸漸改變
49 行
.title:hover:after {
opacity: 1;
}
當 hover 過 title 時,設定 triangle style:
opacity: 1
:設定 triangle 顯示
title:hover:after
相當於 CSS 的hover
event handler
Conclusion
- 實現 tooltip 需包括相當多 CSS 技巧:
- 使用
before
顯示 tooltip - 使用
after
顯示 triangle - 使用
relative/absolute
定位 tooltip 與 triangle - 使用
transform
垂直置中 - 使用
transform
實現 fade-in / fade-out - 使用
border
畫 triangle
- 使用