CSS & JS Effect – Tooltip
介绍
Tooltip 长这样

它用 popup 的方式来详细描述一个主体. 比如某个 icon 代表着什么.
参考
YouTube – How To Make Tooltips With Only CSS
思路和难点

1. hover 的时候出现
我的例子中它 hidden 使用 scale 0 来实现的. hover 的时候就变大, 就出现了.
2. 定位在主体上方 (或者其它 position)
如果我们不考虑主体在屏幕的位置, 我们可以简单粗暴的定位在上方. 但如果要考虑屏幕可见度的话, 那么还需要搞一个动态 position. 比如 sometime 出现在上方, sometime 下方. 这样难度会上一个量级哦 (这篇只是简单的定位上方, 有兴趣的可以参考 Angular CDK Overlay 的做法, 它里面有计算 popup 内容的大小, 然后再开每一个 position 哪一个可以尽可能展现完内容就用哪个 position)
3. 有一个小箭头指向主体
小箭头是用 border 做的哦.
4. 简单的 animation
scale + translateY 小移动
Step by Step
HTML & Simple Style
首先是 HTML 的部分
<div class="icon-wrapper">
<i class="fa-solid fa-envelope"></i>
<p class="tooltip">This is email icon</p>
</div>
有些人会比较 prefer 完全用 ::after ::before 来实现. 好处是 HTML 非常干净 (参考上面的 YouTube 视频). 但我个人觉得不利于理解. 如果做封装的话我会用 ::after ::before. 但学习的话. 用 HTML 会比较好理解.
CSS Style
.icon-wrapper {
i {
font-size: 96px;
color: pink;
}
.tooltip {
background-color: pink;
color: red;
padding: 1rem 2rem;
font-size: 1.5rem;
border-radius: 0.5rem;
}
}
给点简单的 Style 看看效果先

做小箭头
小箭头是用 border 做的
.tooltip {
position: relative;
&::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 16px solid transparent;
border-top-color: pink;
}
}
其原理是隐藏另外 3 边的 border, 它就变成三角形了.
效果

定位
.icon-wrapper {
position: relative;
.tooltip {
position: absolute;
bottom: calc(100% + 1rem);
left: 50%;
transform: translateX(-50%);
width: max-content;
max-width: 256px;
}
}
没什么难度, 只是调调角度而已
动画
最后加入动画. 它有 2 个动画, 一个是 scale 从 0 到 1, 另一个是 translateY 稍微往上滑动一点点.
.tooltip {
--scale: 0;
--gap: -0.5rem;
bottom: calc(100% + var(--gap));
left: 50%;
transform: translateX(-50%) scale(var(--scale));
transition-property: transform, bottom;
transition-duration: 0.4s;
transform-origin: bottom center;
}
&:hover .tooltip {
--scale: 1;
--gap: 1rem;
}
由于是动态控制 transform, 所以需要使用到 CSS Variable.
最终效果

最终 CSS Style

.icon-wrapper {
i {
font-size: 96px;
color: pink;
}
position: relative;
.tooltip {
--scale: 0;
--translateY: 2rem;
background-color: pink;
color: red;
padding: 1rem 2rem;
font-size: 1.5rem;
border-radius: 0.5rem;
position: absolute;
bottom: calc(100% + 0.75rem);
left: 50%;
transform: translateX(-50%) scale(var(--scale)) translateY(var(--translateY));
width: max-content;
max-width: 256px;
&::after {
content: '';
position: absolute;
left: 50%;
transform: translateX(-50%);
top: 100%;
border: 16px solid transparent;
border-top-color: pink;
}
transition: transform 0.4s;
transform-origin: bottom center;
}
&:hover {
.tooltip {
--scale: 1;
--translateY: 0;
}
}
}
只用 ::before 和 ::afterr 实现的版本
HTML
<span class="icon-wrapper tooltip" data-tooltip="This is email icon">
<i class="fa-solid fa-envelope"></i>
</span>
CSS Style

.icon-wrapper {
i {
font-size: 96px;
color: lightblue;
}
}
// 可以封装
.tooltip {
position: relative;
--scale: 0;
&::before,
&::after {
position: absolute;
bottom: calc(100% + 1rem);
left: 50%;
transform-origin: bottom center;
transition: transform 0.4s;
}
&::before {
content: attr(data-tooltip);
display: inline-block;
width: max-content;
max-width: 256px;
background-color: lightblue;
color: blue;
padding: 1rem 2rem;
font-size: 1.5rem;
border-radius: 0.5rem;
transform: translateX(-50%) scale(var(--scale));
}
&::after {
content: '';
border: 16px solid transparent;
border-top-color: lightblue;
transform: translateX(-50%) scale(var(--scale)) translateY(100%); // 定位方式和 ::before 一样, 只是多了一个 translateY(100%)
}
&:hover {
--scale: 1;
}
}
animation 和上面的有点不同, 这是因为 ::before ::after 是 sibling 不容易控制. by right 箭头应该是 tooltip message 的 child 才容易掌控.
CSS & JS Effect – Tooltip的更多相关文章
- CSS & JS 制作滚动幻灯片
==================纯CSS方式==================== <!DOCTYPE html> <html> <head> <met ...
- 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决
Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决: 1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty ...
- Css Js Loader For Zencart
Css Js Loader 描述:这个插件很早就出来了,可能知道人非常少 这个插件的功能是整合所有的网站的CSS和JS内容到一个文件里边. 因为CSS和JS文件到了一个文件,加快了程序的运行 在配合其 ...
- 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)
之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...
- vs合并压缩css,js插件——Bundler & Minifier
之前做了一个大转盘的抽奖活动,因为比较火,部分用户反馈看不到页面的情况,我怀疑js加载请求过慢导致,所以今天针对之前的一个页面进行调试优化. 首先想到的是对页面的js和css进行压缩优化,百度了下vs ...
- nginx资源定向 css js路径问题
今天玩玩项目,学学nginx发现还不错,速度还可以,但是CSS JS确无法使用,原来Iginx配置时需要对不同类型的文件配置规则,真是很郁闷,不过想想也还是很有道理.闲暇之际,把配置贴上来.#user ...
- IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求
今天将开发好的ASP.NET站点部署到客户的服务器上后,发现了一个非常头疼的问题,那么就是IIS7的应用程序池是集成模式的话,ASP.NET项目中自定义的HttpModule会处理静态文件(.html ...
- 网站加载css/js/img等静态文件失败
网站加载css/js/img等静态文件失败,报网站http服务器内部500错误.而服务器中静态文件存在且权限正常. 从浏览器中直接访问文件,出来乱码.这种问题原因在于iis中该网站mime配置报错,不 ...
- 【前端】Sublime text3 插件HTML/CSS/JS prettify 格式化代码
1.首先安装插件 菜单的preference->packages control,然后输入install .. 回车,再输入HTML/CSS/JS prettify 再回车,重启后就可以了. 2 ...
- CSS+JS实现兼容性很好的无限级下拉菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...
随机推荐
- centos下安装Docker容器
安装前的准备工作 1.列出docker安装过的相关包 sudo yum list installed | grep docker 2.删除相关安装包 #根据查找出来的进行删除,不同版本可能有不一样的情 ...
- Linux-makefile命令后面的-j4 -j8是什么意思?
其实是指在编译指定的文件时用多少个线程进行编程的意思~ 相关命令示例如下: make zImage -j8 make modules -j8 --------------------------- m ...
- MYSQL DQL in 到底会不会走索引&in 范围查询引发的思考。
前情引子 in 会不会走索引?很多人肯定会回答.废话.如果命中了索引.那肯定会走. 其实我和大多数人一样.一开始也是这么想的.直至有一个血淋淋的案子让我有所改观.有所思考. 背景介绍 业务的工单表.我 ...
- TypeScript 学习笔记 — 泛型的使用(七)
目录 一.指定函数参数类型 单个泛型 多个泛型 二.函数标注的方式 类型别名 type 接口 interface *案例分析: 三.默认泛型 四.泛型约束 五.泛型接口使用 六.类中的泛型 泛型(Ge ...
- webpack4.15.1 学习笔记(十) — 常见 loader 使用
目录 style -loader <= css-loader <= less-loader postcss-loader file-loader url-loader html-withi ...
- django python 获取当天日期
from datetime import date today = date.today() print(today) 在Python中,你可以使用datetime模块来获取当前日期.具体获取当前日期 ...
- 基于Java“镜头人生”约拍网站系统设计实现(源码+lw+部署文档+讲解等)
\n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件 ...
- AT_arc111_a 题解
洛谷连接&Atcoder 链接 题目简述 给定两个数 \(n\) 和 \(m\),输出 \(\left\lfloor\frac{10^n}{m}\right\rfloor \bmod m\) ...
- [rCore学习笔记 02]Ubuntu 22虚拟机安装
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 Ubu ...
- C# 泛型单例工厂
核心代码,线程安全 class SingletonFactory<T> where T : new() { private static T uniqueInstance; private ...