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 ...
随机推荐
- 在Django中查找重复项目
在Django中查找重复项目通常涉及使用查询集(QuerySet)和模型(Model).假设你有一个模型,比如Item,你想查找其中重复的项目,可以通过以下步骤来实现: 确定重复的标准: 首先需要确定 ...
- Netcode for Entities如何添加自定义序列化,让GhostField支持任意类型?以int3为例(1.2.3版本)
一句话省流:很麻烦也很抽象,能用内置支持的类型就尽量用. 首先看文档.官方文档里一开头就列出了所有内置的支持的类型:Ghost Type Templates 其中Entity类型需要特别注意一下:在同 ...
- WPF使用AppBar实现窗口停靠,适配缩放、全屏响应和多窗口并列(附封装好即开即用的附加属性)
在吕毅大佬的文章中已经详细介绍了什么是AppBar: WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性) - walterlv 即让窗口固定在屏幕某一边 ...
- Geostudio简单实现边坡安全系数的计算
Geostudio是加拿大团队开发的用于岩土工程稳定性分析的一款工程软件,里面的安全系数的计算基本都是基于极限平衡法原理进行求解的,SLOPE/W模块用于安全系数的求解.SEEP/W模块考虑渗水作用. ...
- 如何实现对ELK各组件的监控?试试Metricbeat
一.前言 开发排查系统问题用得最多的手段就是查看系统日志,ELK 是 Elastic 公司开源的实时日志处理与分析解决方案,已经为日志处理方案的主流选择. 而在生产环境中,如何针对 ELK 进行监控, ...
- SpringBoot整合Redis,并处理序列化反序列化问题
1.添加Redis依赖 在项目的pom.xml文件中添加Redis的依赖项.例如,可以使用spring-boot-starter-data-redis依赖项来引入Redis的支持. <depen ...
- 【MySQL】 线上补数据SQL
昨天一下午就为了补业务数据,写SQL快崩溃了得... 直接贴不解释了 -- 先拿到[销售变更id]拿到[变更信息] -- 通过[变更信息]的主表id拿到[主表信息] -- 条件可以是 MAX(cc.i ...
- 【GPU】如何两周内零经验手搓一个GPU | 美国工程师极限挑战 | 重写三次 | CUDA | SIMD | ISA指令集 | Verilog | OpenLane
地址: https://www.youtube.com/watch?v=FTh-c2ek6PU
- NVIDIA机器人仿真环境 —— NVIDIA Isaac Sim 的headless模式/无头模式 —— 非桌面模式、非可视化模式
相关: https://developer.nvidia.com/isaac-sim 可视化模式,也就是在桌面系统上直接安装软件,具体地址: https://developer.nvidia.com/ ...
- 在单机条件下,MPI4PY与纯Python多进程代码来比较是否有性能优势???
如题: 最近在看MPI4PY的代码,但是发现这东西除了编写简洁外(少量代码实现复杂的多进程通信,包括单机和多机),好像也没有别的太多功能,当然MPI本身在多机通信广播.规约上做的很成熟,但是假设我们只 ...