css tooltip (web.dev)

news2024/9/24 1:23:07

目录

  • 版权
  • 介绍
  • tool-tip
    • 在上居中
    • 动画效果
    • 宽度
    • 边界
  • tool-tip::after
    • 范围
    • 锥形渐变
    • -webkit-mask
    • 尖角怎么来的?
  • 附录
    • 完整代码

版权

本文为原创, 遵循 CC 4.0 BY-SA 版权协议, 转载需注明出处: https://blog.csdn.net/big_cheng/article/details/130262213.

介绍

https://web.dev/building-a-tooltip-component/ 介绍了一个tooltip 的实现. 本文将它简化并分析原理. 效果对比图如下:
在这里插入图片描述
鼠标hover 到父容器时, tooltip 浮现.

tool-tip

tooltip 实现为子元素:

    a<BR>b<BR>c<BR>

    preceding

    <div id="ct" style="display: inline-block; border: 1px solid;">
        div content div content div content
        <tool-tip>this is tip content</tool-tip>
    </div>

浏览器实际将这个不认识的"tool-tip" 元素视为"div".

在上居中

tooltip 绝对定位, 停靠在父容器上方:

tool-tip {
	--_triangle-size: 7px;
	
	position: absolute;
	bottom: calc(100% + 0.75ch + var(--_triangle-size));
	......

为实现水平居中, 首先将左边缘居中, 再往左偏移自身宽度的一半:

	left: 50%;
	transform: translateX(-50%) translateY(3px);

动画效果

通过修改"opacity" 来显示tooltip, 并且微调y 值实现微微地’跳动’:

tool-tip {
	......
	opacity: .2;
	transform: translateX(-50%) translateY(3px);
	transition: opacity .2s ease, transform .2s ease;
	......
}
#ct {
	position: relative;
}
#ct:hover > tool-tip {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
    transition-delay: 200ms;
}

“translateY” 正值是向下.

注: 为了方便调试, 初始"opacity" 改为了".2".

宽度

tool-tip {
	......
	width: max-content;
	max-width: 25ch;
	text-align: center;

按内容来定宽. 调试可发现屏宽压缩到tool-tip ‘内部’ 时, body 出现HScroll.

边界

tool-tip 没有边框线 - 通过filter 来实现类似效果:

	will-change: filter;
	filter: 
		drop-shadow(0 3px 3px hsl(0 0% 0% / 15%)) 
		drop-shadow(0 12px 12px hsl(0 0% 0% / 15%));
}

tool-tip::after

用::after 来实现tooltip 下边缘的尖角.

范围

::after 元素使用绝对定位, 占满tool-tip 的区域:

tool-tip::after {
	......
	background: white;
	position: absolute;
	z-index: -1;
	top: 0; right: 0; left: 0;
	bottom: -7px;
	border-bottom: 7px solid transparent;
	......

底部多延伸7px - 用于尖角.

调试:
a) 禁掉tool-tip 的"opacity|filter", 增加"border: 1px solid"
b) 修改::after: “background: red;”
在这里插入图片描述
可见::after 是在tool-tip (作为父容器) 的范围内, 并下延.

锥形渐变

例如横线<hr> 下方的小黑块:

<hr>
<style>
	#ct2 {width: 50px; height: 50px;
		background: white conic-gradient(
			from -30deg at bottom, #0000, #000 1deg 60deg, #0000 61deg);
		......
	}
</style>

<div id="ct2"></div>

a) 从原点竖直朝上为0度, -30度是再朝左偏(逆时针)
b) 原点"bottom" 即"bottom center" - 在所修饰容器的底部的中点
c) “#0000”: 左偏30度的这条线为黑色, 全透明(第4个零)
d) “#000 1deg 60deg”: 紧接着前一条线往右(顺时针)偏1到60度的范围为黑色(前一条透明线起消除锯齿的作用)
e) “#0000 61deg”: 最后再右偏1度黑色透明, 仍是消除锯齿
f) 360度范围内剩余的部分未定义 - 显示conic-gradient 前面定义的背景色(white)

-webkit-mask

将锥形渐变应用到::after 元素的下侧:

tool-tip::after {
	......
	-webkit-mask: conic-gradient(from -30deg at bottom, #0000, #000 1deg 60deg, #0000 61deg) bottom / 100% 50% no-repeat;
	mask: conic-gradient(from -30deg at bottom, #0000, #000 1deg 60deg, #0000 61deg) bottom / 100% 50% no-repeat;

a) “bottom”: 锥形渐变的mask 图的起始位置 是mask 区域的下方的中点. mask 区域 默认 是所修饰容器的border-box.
b) “100% 50%”: mask 图的大小. 这里是mask 区域横向的全部、纵向的一半.
c) “no-repeat”: 不重复, 即mask 图不会横向纵向绘制多张.

注: Chrome 浏览器使用"-webkit-mask" 而非"mask".

调试:
a) 修改::after: “background: red;”
在这里插入图片描述
可见mask 图从::after 元素底部的中点开始绘制.

因为::after “z-index” 为-1, ::after 的内容显示在tool-tip 内容的下方(不会’切掉’ 文字).

尖角怎么来的?

调试:
a) tool-tip: 禁掉"opacity", 增加"border: 1px solid"
b) ::after 修改: “background: red; border-bottom: 7px solid blue;”

::after 禁掉和启用"-webkit-mask" 的效果对比图:
在这里插入图片描述
::after 的颜色仅在锥形渐变的黑色区域范围内被保留(tool-tip border-bottom 重叠的部分也被’擦掉’ 了).

tool-tip “filter” 在尖角及两侧底边造成阴影效果. 如果禁掉"filter", 则尖角看不到, 仅底边中间有个小缺口.

附录

完整代码

<!DOCTYPE html>
<html>
<body>
    <style>
        tool-tip {
            --_triangle-size: 7px;

            pointer-events: none;
            user-select: none;

            position: absolute;
            left: 50%;
            bottom: calc(100% + 0.75ch + var(--_triangle-size));
            z-index: 1;
            opacity: .2;
            transform: translateX(-50%) translateY(3px);
            transition: opacity .2s ease, transform .2s ease;

            width: max-content;
            max-width: 25ch;
            text-align: center;
            padding: 0.75ch 1.5ch;
            margin: 0;
            border-radius: 5px;
            background: white;
            color: CanvasText;
            will-change: filter;
            filter: 
                drop-shadow(0 3px 3px hsl(0 0% 0% / 15%)) 
                drop-shadow(0 12px 12px hsl(0 0% 0% / 15%));
        }

        tool-tip::after {
            content: "";
            background: white;
            position: absolute;
            z-index: -1;
            top: 0; right: 0; left: 0;

            -webkit-mask: conic-gradient(from -30deg at bottom, #0000, #000 1deg 60deg, #0000 61deg) bottom / 100% 50% no-repeat;
            mask: conic-gradient(from -30deg at bottom, #0000, #000 1deg 60deg, #0000 61deg) bottom / 100% 50% no-repeat;
            bottom: -7px;
            border-bottom: 7px solid transparent;
        }

        #ct {
            position: relative;
        }
        #ct:hover > tool-tip {
            opacity: 1;
            transform: translateX(-50%) translateY(0);
            transition-delay: 200ms;
        }
    </style>

    a<BR>b<BR>c<BR>

    preceding

    <div id="ct" style="display: inline-block; border: 1px solid;">
        div content div content div content
        <tool-tip>this is tip content</tool-tip>
    </div>

    <hr>
    <style>
        #ct2 {width: 50px; height: 50px;
            background: white conic-gradient(
                from -30deg at bottom, #0000, #000 1deg 60deg, #0000 61deg);
            filter: 
                drop-shadow(0 3px 3px hsl(0 0% 0% / 15%)) 
                drop-shadow(0 12px 12px hsl(0 0% 0% / 15%));
        }
    </style>

    <div id="ct2"></div>

</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【周末闲谈】AI作图,你真的了解它吗?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言AI绘画&#x1f916;&#x1f916;&#x1f916;工作…

[C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)

文章目录 前言一、多态的定义及实现1.多态的构成条件2.c11的override和final3.重载&#xff0c;重写&#xff0c;重定义的比较4.抽象类5.多态的原理6.多继承中的虚函数表7.动态绑定和静态绑定总结 前言 多态的概念&#xff1a; 多态的概念&#xff1a;通俗来说&#xff0c;就是…

【Linux】使用systemd设置开机自启动命令

目录 1 使用使用systemd实现开机自动运行命令1.1 新建一个.service文件1.2 编写.service文件1.2.1 [Unit]1.2.2 [Service]1.2.3 [Install] 1.3 启动服务并设置自启动 2 编写Systemd服务文件的要点2.1 Systemd服务文件的位置2.2 Systemd服务文件的格式2.3 Systemd服务文件的基本…

【基础】Kafka -- 基础架构及核心概念

Kafka -- 基础架构及核心概念 初识 KafkaKafka 基本架构Kafka 主题与分区主题与分区分区副本机制 Replica高水位 HW 生产者生产者客户端必要的参数配置消息的发送序列化分区器生产者拦截器 原理分析重要的生产者参数 消费者消费者与消费者组消费者客户端必要的参数配置订阅主题…

MySQL 按关键字进行截取

一、问题背景 取MySQL数据表中某个字段中的IP信息。 如&#xff1a;t_log 表中的 user_ip 字段值为 {“username”:“miracle”,“ip”:“110.230.128.186”}&#xff0c;取出IP信息 110.230.128.186。 建表和初始化SQL语句&#xff0c;如下&#xff1a; SET NAMES utf8mb4…

GORM操作mysql数据库

对象就是程序的数据结构&#xff0c;关系是数据库。就是将程序的数据结构与数据库表对应起来。 在GORM是Go语言的ORM框架&#xff0c;将go的数据结构转化为数据库表&#xff0c;例如将结构体转化为数据库表。 引入gorm框架 远程下载gorm框架 go get -u gorm.io/driver/mysq…

HTTP中的Content-type详解

Content-Type Content-Type&#xff08;MediaType&#xff09;&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型。在互联网中有成百上千中不同的数据类型&#xff0c;HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#x…

关于java.io的学习记录(写入文本)

可以通过字节流&#xff08;FileOutputStream&#xff09;、字符流&#xff08;OutputStreamWriter&#xff09;、字符缓冲流&#xff08;BufferedWriter&#xff09;读取文本中的数据。 FileOutputStream写入文本 public void write(){String path "writeTest.txt"…

【是C++,不是C艹】 什么是C++ | C++从哪来 | 学习建议

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e; &#x1f449;专栏&#xff1a;《是C&#xff0c;不是C艹》&#x1f448; 前言&#xff1a; 我知道你急着学C&#xff0c;但你先别急&#xff0c;薛之谦认识认识C还是很有必要的。本期跟大家聊…

文件夹改名,如何在改名之后批量复制文件夹名称

在日常时候中会遇到给文件夹改名的时候&#xff0c;那么我们又如何在改名之后批量复制文件夹名称&#xff1f;今天就由小编来给大家分享一下操作办法。 首先第一步&#xff0c;我们要进入文件批量改名高手&#xff0c;并在板块栏里选择“文件夹批量改名”板块。 第二步&#xf…

SpringBoot 接入chatGPT API

SpringBoot 接入chatGPT API 一、准备工作二、补全接口示例三、申请API-KEY**四、JavaScript调用API**五、SpringBoot整合ChatGPT六、使用curl模拟请求ChatGPT平台已经为技术提供了一个入口了,作为一个Java程序员,我们第一时间想到的就是快速开发一个应用,接入ChatGPT的接口…

第十四天本地锁、Redis分布锁、Redisson锁三者的区别

一、为什么要有redis分布式锁&#xff0c;它解决了什么问题&#xff1f; 在传统单体架构的项目下&#xff0c;使用本地锁synchronized和lock锁就可以锁住当前进程&#xff0c;保证线程的安全性&#xff0c;但是本地锁解决不了分布式环境下多个服务资源共享的问题&#xff0c;而…

产品研发流程管理

先看一张图&#xff0c;该图适应绝大部分的产品的 研发流程 &#xff08;需要的可以去下 产品研发流程| ProcessOn免费在线作图,在线流程图,在线思维导图&#xff09; 该图详细描述了&#xff0c;不同阶段应该做什么&#xff0c;具体的来说&#xff0c;是确定了什么时候 “开会…

高精度人员定位系统源码,采用vue+spring boot框架,支持二次开发

智慧工厂人员定位系统源码&#xff0c;高精度人员定位系统源码&#xff0c;UWB定位技术 文末获取联系&#xff01; 在工厂日常生产活动中&#xff0c;企业很难精准地掌握访客和承包商等各类人员的实际位置&#xff0c;且无法实时监控巡检人员的巡检路线&#xff0c;当厂区发生灾…

【Python】实战:生成无关联单选问卷 csv《精神状态评估表》

目录 一、适用场景 二、业务需求 三、Python 文件 &#xff08;1&#xff09;创建文件 &#xff08;2&#xff09;代码示例 四、csv 文件 一、适用场景 实战场景&#xff1a; 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全部问…

使用pandas和seaborn绘图

使用pandas和seaborn绘图 matplotlib实际上是一种比较低级的工具。要绘制一张图表&#xff0c;你组装一些基本组件就行&#xff1a;数据展示 &#xff08;即图表类型&#xff1a;线型图、柱状图、盒形图、散布图、等值线图等&#xff09;、图例、标题、刻度标签以及其他注解型…

【远程开发】VSCode使用Remote SSH远程连接Linux服务器

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转发自CSD…

【Unity】创建一个自己的可交互AR安卓程序

目录 1 创建一个AR场景2 配置AR Camera为前置摄像头3 配置打包场景4 下载官方提供的InteractiveFaceFilterAssets资源5 配置AR Face Manager6 创建眼镜预制件7 设置AR面部追踪8 测试效果8.1 在Unity中测试8.2 在安卓设备上测试 9 在该AR场景的基础上添加自己的想法9.1 改变眼镜…

【Java|golang】1042. 不邻接植花---邻接表着色

有 n 个花园&#xff0c;按从 1 到 n 标记。另有数组 paths &#xff0c;其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中&#xff0c;你打算种下四种花之一。 另外&#xff0c;所有花园 最多 有 3 条路径可以进入或离开. 你需要为每个花园选择一…

C++用户信息管理服务 Thrift框架 Mysql数据落地 Redis数据缓存 Kafka 消息队列 总结 附主要源码

不知不觉入职已经一个月了&#xff0c;近期提交了考核2&#xff0c;要求如下&#xff1a; 1、编写一个管理用户信息的服务&#xff0c;通过thrift的远程过程调用实现用户信息管理功能 2、用户信息至少包括 唯一ID、用户名、性别、年龄、手机号、邮箱地址、个人描述 3、提供创建…