最后编辑: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. MVC三层架构搭建

    MVC三层架构搭建 项目主要是用三层来搭建项目,三层分为表现层,数据层和业务层.项目用了目前比较流行的IOC架构.目前流行的IoC 框架有AutoFac,Unity,Spring.NET等,项目中选用 ...

  2. python网络编程-1

    1.网络基础 回顾计算IP所处网段方式 #128 64 32 16 8 4 2 1 #IP1 = 192.168.9.1/24 # 11000000 10101000 00001001 0000000 ...

  3. Javascript 关于基本类型和引用类型的个人理解

    一.基础类型 A. 基础类型有5种,Number,String,Boolean,Null,Undefined B. 基础类型没有堆的概念,堆只针对引用类型. 所有基础类型都是以key-value形式存 ...

  4. vue中利用Promise封装jsonp并调取数据

    Promise就是一个给一步操作提供的容器,在这个容器里,有两个阶段无法改变的阶段,第一个阶段就是Pending(进行),第二个阶段就是结果阶段,包含Fulfilled(成功).Rejected(失败 ...

  5. 使用Composer安装阿里云短信失败

    安装步骤 请参考以下步骤,使用Composer安装依赖. 如果在您的系统上全局安装Composer,您可以在项目目录中运行以下内容,将 Alibaba Cloud Client for PHP 添加为 ...

  6. openssl生成随机数

    #include <stdio.h> #include <openssl/bn.h> int main() { BIGNUM *bn; bn = BN_new(); //生成一 ...

  7. Odoo 启动选项总结

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189209.html 一:启动选项用在哪里 如果你是用Pycharm进行odoo二次开发的话,可以通过 R ...

  8. 为何JAVAWEB绝对路径访问不了图片

    为何JAVAWEB绝对路径访问不了图片?其实这涉及到两个原因 1:浏览器类型不同: 五大主流浏览器内核有所不同,能够支持的功能不一样:如谷歌浏览器就不能查看绝对路径 2:涉及到保护隐私安全: (谷歌浏 ...

  9. RNN循环神经网络学习——概述

    循环神经网络(Recurrent Neural NetWork,RNN)是一种将节点定向连接成环的人工神经网络,其内部状态可以展示动态时序行为. 循环神经网络的主要用途是处理和预测序列数据.循环神经网 ...

  10. Arbitrage POJ - 2240

    题目链接:https://vjudge.net/problem/POJ-2240 思路:判正环,Bellman-ford和SPFA,floyd都可以,有正环就可以套利. 这里用SPFA,就是个板子题吧 ...