最后编辑:2020/03/24

无意间在寻找资料时候,发现一个不错的小提示,查看源码竟然是纯手工 css 编写(文章底部参考链接)。

效果

使用的特性

  • css2 中的 attr 函数,所以现在(2019/11/26)主流浏览器基本都兼容

  • 为了更加精准定位使用了 css3 中的 calc 函数,如果被要求的浏览器不支持,那么降级处理的最好方式就是手动计算定位

Code

<element data-title="回到顶部"></element>
// 背景色
$tooltip-fill-color: rgba(#000, .8) !default;
// 垂直方向的内边距
$tooltip-y-padding: 3px !default;
// 水平方向的内边距(采用 1:2 方式拉伸)
$tooltip-x-padding: 2 * $tooltip-y-padding !default;
// 小箭头的宽度
$tooltip-arrow-width: 5px !default;
// 字体的准线高度(为了垂直居中)
$tooltip-line-height: 1.5 !default; // 指定的包含 data-title 的元素
*[data-title] {
overflow: hidden; &:before,
&:after {
position: absolute;
z-index: 10;
opacity: 0;
// 小偏移可去除(采用了 css3,低版本浏览器可移除)
transform: translate3d(-50%, 0, 0);
transition: 300ms ease;
} &:before {
// 获取 data-title 的值
content: attr(data-title);
// 开始计算上浮偏移量,相加之后采用负数向上偏移)
// 首先是字体的高度 1em * $tooltip-line-height
// 然后是垂直方向上的内边距,注意分上下,所以是 $tooltip-y-padding * 2
// 最后是小箭头的宽度(其实也是高度)
top: calc(#{-1em * $tooltip-line-height} - #{$tooltip-y-padding * 2} - #{$tooltip-arrow-width});
left: 50%;
padding: $tooltip-y-padding $tooltip-x-padding;
line-height: $tooltip-line-height;
border-radius: 4px;
background-color: $tooltip-fill-color;
color: #fff;
// 字体不给换行,字多的提示可能需要换个表现方式
white-space: nowrap;
// 重点:我们使用内容填充,因为我们不知道字体大小
box-sizing: content-box;
} // 小箭头
&:after {
content: "\20";
top: -1 * $tooltip-arrow-width;
left: 50%;
border: $tooltip-arrow-width solid transparent;
border-top-color: $tooltip-fill-color;
} &:hover {
overflow: visible; &:before,
&:after {
opacity: 1;
// 偏移,低版本可移除
transform: translate3d(-50%, -3px, 0);
}
}
}

最终编译出来结果:

*[data-title] {
overflow: hidden;
}
*[data-title]:before, *[data-title]:after {
position: absolute;
z-index: 10;
opacity: 0;
transform: translate3d(-50%, 0, 0);
transition: 300ms ease;
}
*[data-title]:before {
content: attr(data-title);
top: calc(-1.5em - 6px - 5px);
left: 50%;
padding: 3px 6px;
line-height: 1.5;
border-radius: 4px;
background-color: rgba(0, 0, 0, 0.8);
color: #fff;
white-space: nowrap;
box-sizing: content-box;
}
*[data-title]:after {
content: "\20";
top: -5px;
left: 50%;
border: 5px solid transparent;
border-top-color: rgba(0, 0, 0, 0.8);
}
*[data-title]:hover {
overflow: visible;
}
*[data-title]:hover:before, *[data-title]:hover:after {
opacity: 1;
transform: translate3d(-50%, -3px, 0);
}

这就是全部的实现代码,仅仅实现基本功能,如果是要更加健壮,那么还需要考虑更多情况。

比如我考虑的一点就是我仅仅需要在 pc 上展示,所以可以做一个小自适应,即使用下面的代码包裹住:

@media screen and (min-width: 992px) {
/* 上面的编译后 css 代码 */
}

需求太多,自求多福

纯 css 打造一个小提示 tooltip的更多相关文章

  1. 贴心小技能——纯CSS实现的帮助提示

    1. 新技能传授---哒哒哒哒 我们经常会接到这样的小需求,鼠标放在某个位置实现一段小提示. 你还在用js实现这样一个小功能,你就太out了,来看看我们用纯CSS打造的帮助提示. 2. html &l ...

  2. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  3. easyui toopTip,鼠标划过悬浮,显示一个小提示框的方法

    easyui toopTip,鼠标划过悬浮,显示一个小提示框的方法 /*easyui,鼠标划过悬浮,显示一个小提示框的方法*/ function toopTip(idOrClass,showText) ...

  4. 【CSS Demo】纯 CSS 打造 Flow-Steps 导航

    low-Steps 导航效果常用于需要表示执行步骤的交互页面,效果如下: 步骤一 步骤二 步骤三   通常使用图片来实现 Flow-Steps 效果,但此方法的灵活性不足,当内容变化较大时就可能需要重 ...

  5. 纯CSS实现一个微信logo,需要几个标签?

    博客已迁移至http://lwzhang.github.io. 纯CSS实现一个微信logo并不难,难的是怎样用最少的html标签实现.我一直在想怎样用一个标签就能实现,最后还是没想出来,就只好用两个 ...

  6. 纯css写带小三角对话框

    在实际样式中经常会遇到要写类似对话框的样式,而这种样式往往会有一个小三角,如下所示: 那么如何用css写出来呢,其实很简单,先让父元素相对定位,然后运用css的伪类before或after.就可以写个 ...

  7. 纯 CSS 创建一个三角形

    [要求]:用纯CSS创建一个三角形的原理是什么? ♪ 答: 把上.左.右三条边隐藏掉(颜色设为 transparent) [实现]: #demo { width: 0; height: 0; bord ...

  8. 3.纯 CSS 创作一个容器厚条纹边框特效

    原文地址:3.纯 CSS 创作一个容器厚条纹边框特效 没有啥好点子呀,不爽 HTML代码: <div class="box"> <div class=" ...

  9. 2.纯 CSS 创作一个矩形旋转 loader 特效

    原文地址:2.纯 CSS 创作一个矩形旋转 loader 特效 扩展后地址:https://scrimba.com/c/cNJVWUR  扩展地址:https://codepen.io/pen/ HT ...

随机推荐

  1. Winform的控件以及DataGridView的一般使用

    先上学习测试的一些截图 1:获取多个控件上面的值(checkbox,combobox,textbox,radiobutton) 2:获取到选择行的主键ID的value,方便我们进一步CURD 3:获取 ...

  2. PyTestReport 自动化报告

    安装 pip install PyTestReport pytest框架执行命令 pytest.main(["-s", "test_login.py", &qu ...

  3. java斐波那契数列的顺序输出

    斐波那契数列,即1.1.2.3.5......,从第三个数开始包括第三个数,都为这个数的前两个数之和,而第一第二个数都为1. 下面是java输出斐波那契数列的代码: import java.util. ...

  4. 智能社javascript

    http://www.chuanke.com/?mod=student&act=study&courseid=91706

  5. 2.监控软件zabbix-服务端安装

    环境准备 Zabbix服务端环境要求: Red Hat Enterprise Linux CentOS Oracle Linux Debian Ubuntu 注意,要安装的Zabbix服务器需要联网, ...

  6. 编译一个支持django及mysqlclient连接的alpine镜像

    一切都不难,难的就是在alpine镜像里. 最后,使用了网上编译好mysqlclient的镜像,才搞定. 记录一下. 一,基础镜像Dockerfile https://github.com/tnir/ ...

  7. Rust中的控制结构

    fn main() { let number = ; { println!("condition was true"); } else { println!("condi ...

  8. nth-child,nth-of-type

    首先,这两个选择器是用来干什么的? 举例子 p:nth-child(1);这个选择器选择的是p所有父辈元素中第一个子元素,且这个子元素为p,此时就生效. p:nth-of-type(1);这个选择器选 ...

  9. mac下命令行安装node.js及切换不同版本nodejs

    摘自: http://www.cnblogs.com/ikuyka/p/5825762.html 前提是你电脑里已经装了node.js然后才能采用以下命令(以下代码最好不要同时运行) sudo n - ...

  10. 201871010107-公海瑜《面向对象程序设计(java)》第6-7周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第6-7周学习总结                项目                                内容 ...