最后编辑: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. GIT版本管理工具教程

    目录 GIT版本管理工具教程 一 Git初始化 二 简单指令使用 基本操作 简单总结 三 Git进阶 Git三大区域 Git回滚 Git分支 Git工作流 四 Github代码管理仓库 第一步:注册G ...

  2. 关于git回退版本的一点心得

    我由于开发中不小心在master分支上开发,忘记了切换分支,最后我直接在master分支上提交,push,在开发分支上merge了master分支. 然后,同事告诉我他的代码要准备上线了,然而我的代码 ...

  3. vue中nextTick的理解

    A. vue 中的 nextTick 是什么? 1.首先需要清楚,nextTick是一个函数:这个函数的作用,简单理解就是下一次渲染后才执行 nextTick 函数中的操作: 2.在下一次 DOM 更 ...

  4. 新手入门必看:VectorDraw 常见问题整理大全(二)

    VectorDraw Developer Framework(VDF)是一个用于应用程序可视化的图形引擎库.有了VDF提供的功能,您可以轻松地创建.编辑.管理.输出.输入和打印2D和3D图形文件.该库 ...

  5. Gson+GsonFormat+Postman简单粗暴解析json

    现在有时候之前的项目需要返回来修改bug看到以下这段代码 if (test != null) { JSONTokener jsonParser = new JSONTokener(test); JSO ...

  6. vlan技术简单了解

    VLAN(虚拟局域网)是对连接到的第二层交换机端口的网络用户的逻辑分段,不受网络用户的物理位置限制而根据用户需求进行网络分段.一个VLAN可以在一个交换机或者跨交换机实现.VLAN可以根据网络用户的位 ...

  7. 获取mac地址和扫描端口

    获取IP mac地址 arp -a 10.0.0.34 扫描指定IP 1到30000端口 nmap -p1-30000 10.0.0.36

  8. 2-3 arrary数组的数值的计算

    In [2]: import numpy as np tang_array=np.array([[1,2,3],[4,5,6]]) tang_array Out[2]: array([[1, 2, 3 ...

  9. 【洛谷P3749】[六省联考2017]寿司餐厅(网络流)

    洛谷 题意: 给出\(n\)份寿司,现可以选取任意多次连续区间内的寿司,对于区间\([l,r]\),那么贡献为\(\sum_{i=l}^r \sum_{j=i}^rd_{i,j}\)(对于相同的\(d ...

  10. 201871010133 赵永军《面向对象程序设计(java)》第六、七周学习总结

    201871010133 赵永军<面向对象程序设计(java)>第六.七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...