介绍

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. SQL Thinking

    s2下半年我在内部有一次部门级别的技术分享会,以本文内容分享为主. 其实有很多人问过我相同的问题,遇到需要改写的慢sql,不知道怎么改,改好了以后也不知道等不等价?不等价了也不知道错在哪?这个要怎么破 ...

  2. Web1.0、Web2.0 和 Web3.0 的区别

    Web1.0.Web2.0 和 Web3.0 的区别主要体现在以下几个关键方面: 内容创作与交互: Web1.0:内容主要由网站所有者或少数专业人员创建,用户大多只是被动接收信息.例如,早期的雅虎.新 ...

  3. .NET开源、简单、实用的数据库文档生成工具

    前言 今天大姚给大家分享一款.NET开源(MIT License).免费.简单.实用的数据库文档(字典)生成工具,该工具支持CHM.Word.Excel.PDF.Html.XML.Markdown等多 ...

  4. 如何在 Vue 和 JavaScript 中截取视频任意帧图片

    如何在 Vue 和 JavaScript 中截取视频任意帧图片 大家好!今天我们来聊聊如何在 Vue 和 JavaScript 中截取视频的任意一帧图片.这个功能在很多场景下都非常有用,比如视频编辑. ...

  5. 关于导入react native项目导致运行异常的那些事

    从git上导入公司的项目,在本地运行的时候,项目无法运行.sdk,jdk,node都是使用公司规定的版本,项目中的local.properties文件sdk.dir路径也换成了自己本地的目录,结果就在 ...

  6. 滑块解锁-scratch编程作品

    程序说明: <滑块解锁>是一款基于Scratch平台制作的益智类小游戏.游戏中存在多个黄色滑块阻挡红色滑块通往出口的路径.玩家需要通过逻辑思考和精确操作,滑动黄色滑块以开辟道路,使红色滑块 ...

  7. C#/.NET/.NET Core优秀项目和框架2024年7月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...

  8. 对比python学julia(第一章)--(第四节)冰雹猜想

    4.1 依葫芦画瓢 冰雹猜想是一种非常有趣的数字黑洞,曾让无数的数学爱好者为之痴迷.它有一个非常简单的变换规则,具体来说就是:任意取一个正整数n,如果n是偶数,就把n变成n/2;如果n是奇数,就把n变 ...

  9. 【JavaWeb】封装一个MVC框架

    框架参考自: https://www.bilibili.com/video/BV1gV411r7ct 在老师的基础上添加了 1.POST参数处理 2.Tomcat8版本下中文乱码处理 3.可声明请求方 ...

  10. MyBatis-Plus文件上传方法

    网站的文件上传方法 本地存储上传 // 本地存储方式 MultipartFile接受文件 @PostMapping("/save") public Result save(Stri ...