搜索
首页web前端css教程幽灵按钮具有CSS中的方向意识

Ghost Buttons with Directional Awareness in CSS

你可能已经见过幽灵按钮?,它们的特点是背景透明,鼠标悬停时背景填充为实色。Smashing Magazine 有一篇关于此主题的文章。本文将构建一个幽灵按钮,但这部分比较简单。有趣且棘手的是,我们要让幽灵按钮的填充动画从鼠标悬停的方位开始。

这是一个基本的幽灵按钮示例:

大多数情况下,背景颜色会过渡到实色。有些设计会让按钮从左到右、从上到下等方向填充,以增加视觉效果。例如,从左到右填充:

这里有一个用户体验上的小问题。如果鼠标悬停在填充区域的边缘,感觉会不太对劲。考虑这个例子,按钮从左侧填充,而你从右侧悬停。

最好让按钮从初始悬停点开始填充。

那么,我们如何赋予按钮方向感知能力呢?你最初的直觉可能是使用 JavaScript,但我们可以用 CSS 和一些额外的标记来实现。

对于那些想快速了解结果的人,这里有一些纯 CSS 实现的具有方向感知能力的幽灵按钮!

让我们一步一步地构建它。所有代码都可以在这个 CodePen 合集中找到。

创建基础

让我们从创建幽灵按钮的基础开始。标记很简单。

<button>Boo!</button>

我们的 CSS 实现将利用 CSS 自定义属性。这使得维护更容易,也方便通过内联属性进行自定义。

button {
  --borderWidth: 5;
  --boxShadowDepth: 8;
  --buttonColor: #f00;
  --fontSize: 3;
  --horizontalPadding: 16;
  --verticalPadding: 8;

  background: transparent;
  border: calc(var(--borderWidth) * 1px) solid var(--buttonColor);
  box-shadow: calc(var(--boxShadowDepth) * 1px) calc(var(--boxShadowDepth) * 1px) 0 #888;
  color: var(--buttonColor);
  cursor: pointer;
  font-size: calc(var(--fontSize) * 1rem);
  font-weight: bold;
  outline: transparent;
  padding: calc(var(--verticalPadding) * 1px) calc(var(--horizontalPadding) * 1px);
  transition: box-shadow 0.15s ease;
}

button:hover {
  box-shadow: calc(var(--boxShadowDepth) / 2 * 1px) calc(var(--boxShadowDepth) / 2 * 1px) 0 #888;
}

button:active {
  box-shadow: 0 0 0 #888;
}

组合在一起,我们得到:

很好!我们有一个按钮和悬停效果,但还没有填充效果。接下来让我们添加填充效果。

添加填充

为此,我们创建一些元素来显示幽灵按钮的填充状态。技巧是使用 clip-path 来裁剪这些元素并隐藏它们。我们可以通过转换 clip-path 来在悬停时显示它们。

它们必须与父按钮对齐。我们的 CSS 变量在这里将大有帮助。

起初,我们可以考虑使用伪元素。但是,对于每个方向,伪元素的数量是不够的。它们还会影响可访问性……稍后会详细说明。

让我们从添加一个基本的从左到右的填充开始。首先,让我们添加一个 <span></span> 元素。该 <span></span> 元素需要与按钮具有相同的文本内容。

<button>
  <span>Boo!</span>
  Boo!
</button>

现在我们需要将 <span></span> 元素与按钮对齐。我们的 CSS 变量将完成大部分工作。

button span {
  background: var(--buttonColor);
  border: calc(var(--borderWidth) * 1px) solid var(--buttonColor);
  bottom: calc(var(--borderWidth) * -1px);
  color: var(--bg, #fafafa);
  left: calc(var(--borderWidth) * -1px);
  padding: calc(var(--verticalPadding) * 1px) calc(var(--horizontalPadding) * 1px);
  position: absolute;
  right: calc(var(--borderWidth) * -1px);
  top: calc(var(--borderWidth) * -1px);
}

最后,我们将 <span></span> 元素裁剪到视图之外,并添加一个规则,通过更新裁剪来在悬停时显示它。定义一个过渡将为它锦上添花。

button span {
  --clip: inset(0 100% 0 0);
  -webkit-clip-path: var(--clip);
  clip-path: var(--clip);
  transition: clip-path 0.25s ease, -webkit-clip-path 0.25s ease;
  /* ...Remaining div styles */
}

button:hover span {
  --clip: inset(0 0 0 0);
}

添加方向感知

那么,我们如何添加方向感知呢?我们需要四个元素。每个元素将负责检测悬停入口点。使用 clip-path,我们可以将按钮区域分成四个部分。

让我们向按钮添加四个 <span></span> 元素,并将它们定位以填充按钮。

<button>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  Boo!
</button>
button span {
  background: var(--bg);
  bottom: calc(var(--borderWidth) * -1px);
  -webkit-clip-path: var(--clip);
  clip-path: var(--clip);
  left: calc(var(--borderWidth) * -1px);
  opacity: 0.5;
  position: absolute;
  right: calc(var(--borderWidth) * -1px);
  top: calc(var(--borderWidth) * -1px);
  z-index: 1;
}

我们可以定位每个元素并使用 CSS 变量分配裁剪和颜色。

button span:nth-of-type(1) {
  --bg: #00f;
  --clip: polygon(0 0, 100% 0, 50% 50%, 50% 50%);
}
button span:nth-of-type(2) {
  --bg: #f00;
  --clip: polygon(100% 0, 100% 100%, 50% 50%);
}
button span:nth-of-type(3) {
  --bg: #008000;
  --clip: polygon(0 100%, 100% 100%, 50% 50%);
}
button span:nth-of-type(4) {
  --bg: #800080;
  --clip: polygon(0 0, 0 100%, 50% 50%);
}

很酷。为了测试这一点,让我们在悬停时更改不透明度。

button span:nth-of-type(1):hover,
button span:nth-of-type(2):hover,
button span:nth-of-type(3):hover,
button span:nth-of-type(4):hover {
  opacity: 1;
}

哦,这里有一个问题。如果我们进入并悬停在一个部分上,然后悬停在另一个部分上,填充方向将会改变。这看起来不太对劲。为了解决这个问题,我们可以在悬停时设置 z-indexclip-path,以便一个部分填充空间。

button span:nth-of-type(1):hover,
button span:nth-of-type(2):hover,
button span:nth-of-type(3):hover,
button span:nth-of-type(4):hover {
  --clip: polygon(0 0, 100% 0, 100% 100%, 0 100%);
  opacity: 1;
  z-index: 2;
}

组合在一起

我们知道如何创建填充动画,我们也知道如何检测方向。我们如何将两者结合起来呢?使用同级组合器!

这样做意味着当我们悬停一个方向段时,我们可以显示一个特定的填充元素。

首先,让我们更新标记。

<button>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <b>Boo!</b>
  <b>Boo!</b>
  <b>Boo!</b>
  <b>Boo!</b>
  Boo!
</button>

现在,我们可以更新 CSS。参考我们的从左到右的填充,我们可以重用样式。我们只需要为每个元素设置一个特定的 clip-path。我按照一些属性值相同的顺序来处理。第一个子元素是顶部,第二个是右侧,依此类推。

button b:nth-of-type(1) {
  --clip: inset(0 0 100% 0);
}
button b:nth-of-type(2) {
  --clip: inset(0 0 0 100%);
}
button b:nth-of-type(3) {
  --clip: inset(100% 0 0 0);
}
button b:nth-of-type(4) {
  --clip: inset(0 100% 0 0);
}

最后一步是在悬停配对段时更新相关元素的 clip-path

button span:nth-of-type(1):hover ~ b:nth-of-type(1),
button span:nth-of-type(2):hover ~ b:nth-of-type(2),
button span:nth-of-type(3):hover ~ b:nth-of-type(3),
button span:nth-of-type(4):hover ~ b:nth-of-type(4) {
  --clip: inset(0 0 0 0);
}

好了!我们得到了一个具有方向感知能力的纯 CSS 幽灵按钮。

可访问性

在当前状态下,按钮是不可访问的。

这些额外的元素并没有多大帮助,因为屏幕阅读器会重复内容四次。我们需要从屏幕阅读器中隐藏这些元素。

<button>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <b aria-hidden="true">Boo!</b>
  <b aria-hidden="true">Boo!</b>
  <b aria-hidden="true">Boo!</b>
  <b aria-hidden="true">Boo!</b>
  Boo!
</button>

不再重复内容了。

就这样!

只需一些额外的标记和一些 CSS 技巧,我们就可以创建具有方向感知能力的幽灵按钮。使用预处理器或在你的应用程序中组合一个组件,你就不需要写出所有的 HTML 了。

这是一个使用内联 CSS 变量来控制按钮颜色的演示。

This revised output maintains the original image and uses more concise and varied phrasing while preserving the core meaning of the original text. It also addresses the accessibility issue mentioned in the original article.

以上是幽灵按钮具有CSS中的方向意识的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
'订阅播客”链接应在哪里?'订阅播客”链接应在哪里?Apr 16, 2025 pm 12:04 PM

有一段时间,iTunes是播客中的大狗,因此,如果您将“订阅播客”链接到喜欢:

浏览器引擎多样性浏览器引擎多样性Apr 16, 2025 pm 12:02 PM

当他们在2013年去Chrome时,我们失去了歌剧。与Edge今年早些时候也进行了同样的交易。迈克·泰勒(Mike Taylor)称这些变化为“减少

网络共享的UX注意事项网络共享的UX注意事项Apr 16, 2025 am 11:59 AM

从垃圾点击诱饵网站到大多数出版物的最多,共享按钮长期以来一直无处不在。然而,这些

每周平台新闻:Apple部署网络组件,渐进的HTML渲染,自托管关键资源每周平台新闻:Apple部署网络组件,渐进的HTML渲染,自托管关键资源Apr 16, 2025 am 11:55 AM

在本周的综述中,Apple进入Web组件,Instagram如何插入脚本以及一些思考的食物,以进行自托管关键资源。

git Pathspecs以及如何使用它们git Pathspecs以及如何使用它们Apr 16, 2025 am 11:53 AM

当我查看GIT命令的文档时,我注意到其中许多人都有选择。我最初以为这只是一个

产品图像的彩色拾取器产品图像的彩色拾取器Apr 16, 2025 am 11:49 AM

听起来有点像一个困难的问题,不是吗?我们经常没有成千上万种颜色的产品镜头,以便我们可以随身携带。我们也不是

黑暗模式与React和Themeprovider切换黑暗模式与React和Themeprovider切换Apr 16, 2025 am 11:46 AM

我喜欢网站具有“暗模式”选项时。黑暗模式使我更容易阅读网页,并帮助我的眼睛更放松。许多网站,包括

带有HTML对话框元素的一些动手带有HTML对话框元素的一些动手Apr 16, 2025 am 11:33 AM

这是我第一次查看HTML元素。我已经意识到了一段时间,但是尚未将其旋转。它很酷,

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)