介绍

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的更多相关文章

  1. CSS & JS 制作滚动幻灯片

    ==================纯CSS方式==================== <!DOCTYPE html> <html> <head> <met ...

  2. 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决

    Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决:   1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty ...

  3. Css Js Loader For Zencart

    Css Js Loader 描述:这个插件很早就出来了,可能知道人非常少 这个插件的功能是整合所有的网站的CSS和JS内容到一个文件里边. 因为CSS和JS文件到了一个文件,加快了程序的运行 在配合其 ...

  4. 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)

    之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...

  5. vs合并压缩css,js插件——Bundler & Minifier

    之前做了一个大转盘的抽奖活动,因为比较火,部分用户反馈看不到页面的情况,我怀疑js加载请求过慢导致,所以今天针对之前的一个页面进行调试优化. 首先想到的是对页面的js和css进行压缩优化,百度了下vs ...

  6. nginx资源定向 css js路径问题

    今天玩玩项目,学学nginx发现还不错,速度还可以,但是CSS JS确无法使用,原来Iginx配置时需要对不同类型的文件配置规则,真是很郁闷,不过想想也还是很有道理.闲暇之际,把配置贴上来.#user ...

  7. IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求

    今天将开发好的ASP.NET站点部署到客户的服务器上后,发现了一个非常头疼的问题,那么就是IIS7的应用程序池是集成模式的话,ASP.NET项目中自定义的HttpModule会处理静态文件(.html ...

  8. 网站加载css/js/img等静态文件失败

    网站加载css/js/img等静态文件失败,报网站http服务器内部500错误.而服务器中静态文件存在且权限正常. 从浏览器中直接访问文件,出来乱码.这种问题原因在于iis中该网站mime配置报错,不 ...

  9. 【前端】Sublime text3 插件HTML/CSS/JS prettify 格式化代码

    1.首先安装插件 菜单的preference->packages control,然后输入install .. 回车,再输入HTML/CSS/JS prettify 再回车,重启后就可以了. 2 ...

  10. CSS+JS实现兼容性很好的无限级下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

随机推荐

  1. 存储器与CPU的连接

    存储器与CPU连接分主要看前五步 1.首先根据给出的地址范围写出二进制码 2.确定芯片的类型和数量 3.确定地址线 4.确定片选信号 要注意MREQ是低电平有效,要连到138译码器的低电平

  2. redis雪崩

    每个key(即数据)如果设置了失效时间的话,如果大量key同时过期的时候,或者说因为某种原因redis中的数据突然大批量丢失,这些key又大量地去请求这些key时,因为redis里面没有这些数据,就会 ...

  3. card 卡片 html

    {% extends 'base.html' %} {% block content %} <div class="container"> <h1>客户信息 ...

  4. 洛谷P10693

    洛谷P10693 好奇怪的题目编号 思路提取 input 11 2 13 4 5 3 7 9 9 11 11 12 output 9 以人造数据为例. 首先我们让\(i\)\(\to\)\(a_i\) ...

  5. LOTO示波器功率分析功能

    LOTO示波器软件在非标功能中增加了功率分析功能,对当前屏幕的电压波形和电流波形进行了瞬时功率,视在功率以及有功功率/平均功率的分析计算. 有功功率是指电器所消耗的电能,用于产生热能.机械能或光能等, ...

  6. 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

    引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具.在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实 ...

  7. 使用Nginx Proxy Manager配置Halo的反向代理和申请 SSL 证书

    本文介绍Nginx Proxy Manager配置Halo的反向代理和申请 SSL 证书,如需要了解Halo 2的安装,参考如何在Linux云服务器上通过Docker Compose部署安装Halo, ...

  8. 我用Awesome-Graphs看论文:解读Naiad

    Naiad论文:<Naiad: A Timely Dataflow System> 前面通过文章<论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样>向大家 ...

  9. 【CentOS】rpm包安装Jdk

    1.系统环境检查 前提情要:[如果是使用虚拟机的Linux系统,强烈建议先打个快照备份一下,以免操作失误无法重来] 首先查看系统是否存在java环境 java -version 因为点选了环境工具,这 ...

  10. 【Vue】Re19 Promise

    一.概述 Promise是异步编程的解决方案 异步事件的处理: 封装的异步请求函数不能立即获取结果, 通常会传入另外一个函数,在请求成功的时候将数据通过传入的函数回调出去 如果只是一个简单的请求,那么 ...