CSS文本阴影 text-shadow 悬停效果详解


Posted in HTML / CSS onMay 25, 2022

本文将专注于使用 CSS text-shadow 属性来实现有趣的鼠标悬停效果,但是实际上并不会为这些文本制作任何文本阴影效果。

text-shadow 没有文字阴影

通过以下的gif图中的鼠标悬停效果,相信你能理解使用 text-shadow 却为什么没有阴影。

CSS文本阴影 text-shadow 悬停效果详解

看到此图你的第一感觉是不是复制了一份文本,比如创建伪元素,设置 content: 'text',然后为其设置单独的动画。但是本文完全使用text-shadow 实现,接下来将为大家展开说明四种悬停动画的实现方式。

text-shadow 语法

text-shadow为文字添加阴影,可以为文字添加多个阴影,添加多个时阴影值之间用逗号隔开。每个阴影值由元素在X和Y方向的偏移量、模糊半径和颜色值组成。

text-shadow: h-shadow v-shadow blur color;
参数 描述
h-shadow 必需。水平阴影的位置。允许负值。
v-shadow 必需。垂直阴影的位置。允许负值。
blur 可选。模糊的距离。
color 可选。阴影的颜色。

悬停效果#1

CSS文本阴影 text-shadow 悬停效果详解

CSS代码如下,我们将文本实际的颜色设置透明(color: #0000);然后通过text-shadow创建两个阴影,可选参数blur不设置,这样我们就得到了一份清晰的阴影,通过设置不同的颜色和垂直的数值即可产生炫酷的效果。

.hover-1 {
  line-height: 1.2em;
  color: #0000;
  text-shadow: 
    0 0 #000, 
    0 1.2em #1095c1;
  overflow: hidden;
  transition: .3s;
}
.hover-1:hover {
  text-shadow: 
    0 -1.2em #000, 
    0 0 #1095c1;
}

如下图所示,红色虚线区域是我们页面可视区。通过设置overflow: hidden,重复的文本也就看不见了,在悬停过程中增加transition过渡时间,看起来就像是两个文本在交替显示,这就是本文示例中的主要技巧。

CSS文本阴影 text-shadow 悬停效果详解

接下来可以继续优化我们的CSS代码,如上面代码所示,我们多次使用了1.2em来定义了阴影的高度及移动的偏移量,通过CSS var() 自定义属性值优化后的代码如下:

.hover-1 {
  --h: 1.2em;
 
  line-height: var(--h);
  color: #0000;
  text-shadow: 
    0 0 #000, 
    0 var(--h) #1095c1;
  overflow: hidden;
  transition: .3s;
}
.hover-1:hover {
  text-shadow: 
    0 calc(-1 * var(--h)) #000, 
    0 0 #1095c1;
}

这样还是不够简洁,还可以通过calc()继续优化:

.hover-1 {
  --h: 1.2em;   
 
  line-height: var(--h);
  color: #0000;
  text-shadow: 
    0 calc(-1*var(--_t, 0em)) #000, 
    0 calc(var(--h) - var(--_t, 0em)) #1095c1;
  overflow: hidden;
  transition: .3s;
}
.hover-1:hover {
  --_t: var(--h);
}

悬停效果#2

CSS文本阴影 text-shadow 悬停效果详解

这个动画主要用到了两个属性,text-shadow和background,text-shadow仍然是设置两个图层,但是这次只需要移动下面的一个,在移动的过程中将上面的颜色设置为透明。同时增加一个background-size修改背景色。

.hover-2 {
  /* the height */
  --h: 1.2em;
 
  line-height: var(--h);
  color: #0000;
  text-shadow: 
    0 var(--_t,var(--h)) #fff,
    0 0 var(--_c, #000);
  background: 
    linear-gradient(#1095c1 0 0) 
    bottom/100% var(--_d, 0) no-repeat;
  overflow: hidden;
  transition: 0.3s;
}
.hover-2:hover {
  --_d: 100%;
  --_t: 0;
  --_c: #0000;
}

以上我们通过结合CSStext-shadow和background属性创建了悬停效果,但是我们还能继续使用CSS变量来优化代码,最终只需要一个CSS自定义属性变量即可。

.hover-2 {
  /* the height */
  --h: 1.2em;
 
  line-height: var(--h);
  color: #0000;
  text-shadow: 
    0 var(--_i, var(--h)) #fff,
    0 0 rgb(0 0 0 / calc(var(--_i, 1) * 100%) );
  background: 
    linear-gradient(#1095c1 0 0) 
    bottom/100% calc(100% - var(--_i, 1) * 100%) no-repeat;
  overflow: hidden;
  transition: 0.3s;
}
.hover-2:hover {
  --_i: 0;
}

悬停效果#3

CSS文本阴影 text-shadow 悬停效果详解

这个效果是基于本文第一个动画效果增加了一个前置动画效果。经过最终优化后也只需控制一个CSS自定义变量即可。

.hover-3 {
  /* the color  */
  --c: #1095c1;
  /* the height */
  --h: 1.2em;
 
  line-height: var(--h);  
  color: #0000;
  overflow: hidden;
  text-shadow: 
    0 calc(-1 * var(--h) * var(--_i, 0)) var(--c), 
    0 calc(var(--h) * (1 - var(--_i, 0))) #fff;
  background: 
    linear-gradient(var(--c) 0 0) no-repeat
    calc(200% - var(--_i, 0) * 100%) 100% / 200% calc(100% * var(--_i, 0) + .08em);
  transition: .3s calc(var(--_i, 0) * .3s), background-position .3s calc(.3s - calc(var(--_i, 0) * .3s));
}
.hover-3:hover {
  --_i: 1;
}

悬停效果#4

CSS文本阴影 text-shadow 悬停效果详解

这个悬停效果是基于第二种效果的改进版本,这里新用到了clip-path,我们使用inset(0 0 0 0)类似于overflow: hidden我们所看到的只是实际文本。在悬停时,我们使用等于高度的负值更新第三个值(表示底部偏移)以显示放置在底部的文本层。因为我们需要先运行clip-path动画,然后再运行其他所有内容,所以我们在悬停时为所有属性添加延迟,除了clip-path

transition: 0.4s 0.4s, clip-path 0.4s;

在鼠标移出时,我们做相反的事情:

transition: 0.4s, clip-path 0.4s 0.4s;

最后的完整代码

.hover-4 {
  /* the color  */
  --c: #1095c1;
  /* the height */
  --h: 1.2em;
  
  line-height: var(--h);
  color: #0000;
  text-shadow: 
    0 var(--_t, var(--h)) #fff,
    0 0 var(--_c, #000);
  box-shadow: 0 var(--_t, var(--h)) var(--c);
  clip-path: inset(0 0 0 0);
  background: linear-gradient(var(--c) 0 0) 0 var(--_t, var(--h)) no-repeat;
  transition: 0.4s, clip-path 0.4s 0.4s;
}
.hover-4:hover {
  --_t: 0;
  --_c: #0000;
  clip-path: inset(0 0 calc(-1 * var(--h)) 0);
  transition: 0.4s 0.4s, clip-path 0.4s;
}

最后

如上的几个例子都只用到了一个元素和CSS实现了几种复杂的悬停效果,不需要用到其他的元素及伪元素。基于以上的动画可以发现我们可以结合不同的动画组成更复杂的动画效果,且相对不需要很大的成本。

到此这篇关于CSS文本阴影 text-shadow 悬停效果详解的文章就介绍到这了!

 

Tags in this post...

HTML / CSS 相关文章推荐
用CSS禁用输入法(CSS3 UI规范)实例解析
Dec 04 HTML / CSS
实列教程 一款基于jquery和css3的响应式二级导航菜单
Nov 13 HTML / CSS
一款纯css3实现的漂亮的404页面的实例教程
Nov 27 HTML / CSS
使用css3实现的tab选项卡代码分享
Dec 09 HTML / CSS
解决CSS3的opacity属性带来的层叠顺序问题
May 09 HTML / CSS
详解Sticky Footer 绝对底部的两种套路
Nov 03 HTML / CSS
css3实现背景动态渐变效果
Dec 10 HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
Mar 14 HTML / CSS
针对HTML5的Web Worker使用攻略
Jul 12 HTML / CSS
html5 http的轮询和Websocket原理
Oct 19 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
Feb 24 HTML / CSS
纯 CSS 自定义多行省略的问题(从原理到实现)
Nov 11 HTML / CSS
HTML页面中使两个div并排显示的实现
May 15 #HTML / CSS
html中相对位置与绝对位置的具体使用
CSS 左边固定宽右边自适应的6种方法
May 15 #HTML / CSS
解决flex布局中子项目尺寸不受flex-shrink限制
May 11 #HTML / CSS
css3 选择器
May 11 #HTML / CSS
六个好看实用的 HTML + CSS 后台登录入口页面
HTML CSS 一个标签实现带动画的抖音LOGO
You might like
多数据表共用一个页的新闻发布
2006/10/09 PHP
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
javascript数组组合成字符串的脚本
2021/01/06 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
Python open()文件处理使用介绍
2014/11/30 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
python实现简单图书管理系统
2019/11/22 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
python如何安装下载后的模块
2020/07/03 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
环保倡议书300字
2014/05/15 职场文书
目标责任书格式
2014/07/28 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
文艺演出主持词
2015/07/01 职场文书
趣味运动会口号
2015/12/24 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书