最近修改了个语言切换框的tooltip的切换动画,感觉比element-plus或者其他组件库的tooltip的切换动画好看一些,看起来比较灵动,下面将代码分享出来。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.changeLanguage {
box-sizing: border-box;
display: flex;
align-items: center;
position: relative;
min-width: 6rem;
justify-content: center;
cursor: pointer;
}
.lan {
font-size: 20px;
font-weight: 800;
}
.languageList {
list-style: none;
opacity: 0;
pointer-events: none;
/* 如果注释,那么opacity为0时,hover在languageList上也会显示,原因是鼠标事件未隐藏*/
z-index: 99;
position: absolute;
top: 270%;
left: 50%;
transform: translateX(-50%);
background: #fff;
border-radius: 12px;
text-align: center;
color: #fff;
transition: all 0.2s cubic-bezier(0.68, -0.55, 0.265, 1.55);
font-weight: 700;
min-width: 128px;
padding: 12px;
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.1),
0 2px 6px rgba(0, 0, 0, 0.08);
/* transform: translateY(8px);*/
/* hover的时候,这个覆盖了选择语言的按钮,这样会避免触碰到白色的部分的时候,语言选择的选项消失*/
}
.languageList li {
padding: 5px;
transition: all ease 0.5s;
color: #000;
font-weight: 500;
font-size: 14px;
cursor: pointer;
z-index: 99;
}
.languageList li:hover {
color: #747bfd;
border-radius: 0.3125rem;
transition: all ease 0.5s;
z-index: 99;
background-color: #f1f1f1;
}
.languageList li:last-child {
border: none;
}
.triangle {
position: absolute;
width: 2rem;
height: 2rem;
background-color: #fff !important;
border-radius: 2px;
transform: rotate(45deg) translateY(0);
background-color: transparent;
left: 38%;
top: -5%;
z-index: -1;
}
.languageList::before {
width: 100%;
height: 100%;
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
content: "";
}
.changeLanguage:hover .languageList {
top: 185%;
pointer-events: auto;
opacity: 1;
}
</style>
</head>
<body>
<!-- 以一个语言切换框为例 -->
<!-- 要换tooltip的内容的话,换掉下面的class="lan"的内容即可,具体样式自己调整 -->
<div class="changeLanguage">
<span class="lan"> Language </span>
<!-- 以下ul初始不显示的 -->
<ul class="languageList">
<!-- 这个是小箭头 -->
<div class="triangle"></div>
<li @click="changeLan('en')">English</li>
<li @click="changeLan('zh')">中文</li>
</ul>
</div>
</body>
</html>
代码就是上面这些,唯一需要注意的地方就是,初始情况下,.languageList的opacity为0,但是如果单单这样的话,你鼠标放上去还是能触发绑定在li上面的事件,最关键的一行代码就是:pointer-events:none;
这样的话,鼠标事件就不会触发。而且用opacity来做动画的好处是,只使用transition就已经可以看到过渡效果了,而且用了绝对定位也不会占用其他元素的空间。同样好用的还有visibility:hidden和visibility:visible这两个属性,也能出现过渡动效,但是往往让人最容易能想到的display:none和display:block就不能很好出现过过渡动效。
这里贴上github的链接,虽然东西很简单,但还是欢迎朋友们给我一个star: 我的Git链接https://github.com/KBKUN024/-tooltip-/tree/main
以后要是做出一些比较有意思的东西也会放到git上,敬请关注。。。