在全球范围内,媒体控制图标是任何界面中最普遍理解的视觉语言之一。 设计师可以简单地假设每个用户不仅知道 ▶️ = 播放,而且用户会寻找该图标以观看任何视频或动画。
据报道,该播放箭头是由瑞典工程师菲利普·奥尔森在 1960 年代推出的,最初设计用于指示磁带在卷盘式磁带机上播放时的前进方向。 从那时起,我们从盒式磁带转向 CD,从 iPod 转向 Spotify,但媒体控制图标保持不变。
播放 ▶️ 图标是标准符号(有自己的 unicode),用于启动音频/视频媒体,以及其他符号,如停止、暂停、快进、倒带等。
有播放按钮图标的 unicode 和表情符号选项,但如果你想要自定义内容,你可能会使用图标字体或自定义资源。 但是,如果你想在图标之间切换呢? 这变化可以平滑吗? 一种解决方案可能是使用 SVG。 但是,如果它可以在 10 行 CSS 中完成呢? 真是太酷了!
在本文中,我们将用 CSS 构建播放按钮和暂停按钮,然后探索如何使用 CSS 过渡在它们之间进行动画。
播放按钮
第一步
我们想要实现一个指向右边的三角形。 让我们从创建一个具有粗边框的框开始。 目前,框是制作三角形的首选基础方法。 我们将从粗边框和亮色开始,以帮助我们看到我们的更改。
<button class='button play'></button>
.button.play {
width: 74px;
height: 74px;
border-style: solid;
border-width: 37px;
border-color: #202020;
}

第二步
渲染纯色边框会产生上述结果。 在边框颜色后面隐藏着一个巧妙的小技巧。 边框究竟是如何渲染的? 让我们改变边框颜色,每边一种颜色,这将帮助我们看到边框是如何渲染的。
.button.play {
...
border-width: 37px 37px 37px 37px;
border-color: red blue green yellow;
}

第三步
在每个边框的交点处,你会注意到形成了一个 45 度角。 这是浏览器渲染边框的一种有趣方式,因此,它为不同的形状(如三角形)打开了可能性。 正如我们在下面将看到的,如果我们将 border-left
设置得足够宽,看起来我们可能可以实现一个三角形!
.button.play {
...
border-width: 37px 0px 37px 74px;
border-color: red blue green yellow;
}

第四步
好吧,这与预期结果不符。 似乎内部框(实际的 div)坚持保留其宽度。 原因与 box-sizing
属性 有关,该属性默认值为 content-box
。 值 content-box
指示 div 将任何边框放在外部,从而增加宽度或高度。
如果我们将此值更改为 border-box
,则边框将添加到框的内部。
.button.play {
...
box-sizing: border-box;
width: 74px;
height: 74px;
border-width: 37px 0px 37px 74px;
}

最后一步
现在我们得到了一个合适的三角形。 接下来,我们需要去除顶部和底部部分(红色和绿色)。 我们通过将这些边的 border-color
设置为 transparent
来实现。 宽度还可以控制三角形的形状和大小。
.button.play {
...
border-color: transparent transparent transparent #202020;
}

这是一个解释该动画的动画,如果它有帮助的话。
暂停按钮
第一步
我们将从另一个具有粗边框的框开始继续制作暂停符号,因为前一个框效果很好。
<button class='button pause'></button>
.button.pause {
width: 74px;
height: 74px;
border-style: solid;
border-width: 37px;
border-color: #202020;
}

第二步
这次我们将使用另一个 CSS 属性来实现两条平行线的预期结果。 我们将 border-style
更改为 double
。 border-style
中的 double
属性非常简单,它通过在两条边框之间添加透明笔划来使边框加倍。 笔划或空隙将占给定边框宽度的 33%。
.button.pause {
...
border-style: double;
border-width: 0px 37px 0px 37px;
}

最后一步
border-width
属性。 使用 border-width
将使过渡在下一步中平滑地工作。
.button.pause{
...
border-width: 0px 0px 0px 37px;
border-color: #202020;
}

动画过渡
在我们上面创建的两个按钮中,请注意它们有很多相似之处,但有两个区别:border-width
和 border-style
。 如果我们使用 CSS 过渡,我们可以在这两个符号之间切换。 border-style
没有过渡效果,但 border-width
效果很好。
现在,pause
类切换将在播放和暂停状态之间进行动画。
以下是 SCSS 中的最终样式
.button {
box-sizing: border-box;
height: 74px;
border-color: transparent transparent transparent #202020;
transition: 100ms all ease;
will-change: border-width;
cursor: pointer;
// play state
border-style: solid;
border-width: 37px 0 37px 60px;
// paused state
&.pause {
border-style: double;
border-width: 0px 0 0px 60px;
}
}
演示
查看 CodePen 上 Chris Coyier (@chriscoyier) 的 带有边框的按钮过渡。
无需 JavaScript 切换
对于实际的播放/暂停按钮,你几乎肯定会在使用 JavaScript 来切换按钮的状态。 但是,了解用 CSS 来实现这一点很有趣,它利用了输入和标签:复选框技巧。
<div class="play-pause">
<input type="checkbox" value="" id="playPauseCheckbox" name="playPauseCheckbox" />
<label for="playPauseCheckbox"></label>
</div>
.playpause {
label {
display: block;
box-sizing: border-box;
width: 0;
height: 74px;
cursor: pointer;
border-color: transparent transparent transparent #202020;
transition: 100ms all ease;
will-change: border-width;
// paused state
border-style: double;
border-width: 0px 0 0px 60px;
}
input[type='checkbox'] {
visibility: hidden;
&:checked + label {
// play state
border-style: solid;
border-width: 37px 0 37px 60px;
}
}
}
演示
查看 CodePen 上 Chris Coyier (@chriscoyier) 的 带有复选框的切换按钮。
我非常希望听到你的想法和反馈。 请在下面的评论中添加它们。
使用 U+25B6 有什么问题?
此外,请不要试图认为没有 JavaScript 的控件是一件好事。 JavaScript 提高了可访问性。 例如,如果没有 JavaScript,你无法分配访问键(键盘快捷键),这些快捷键可以让键盘用户在播放(或任何按钮)获得焦点时控制播放器的其他方面。 如果播放按钮没有附加 keyup 事件处理程序来执行其他按钮的任务,那么这些用户将被迫按顺序使用 Tab 键导航到所需的按钮。
你没有读这篇文章吗?
实际上,HTML5 中的任何元素都可以使用 accesskey 属性。 所以它仍然对用户可用。
没什么!尽管许多 Unicode 符号在不同的浏览器中显示不同,所以我个人不太使用它们。我知道网站不必在每个浏览器中看起来都一样,但对于 Unicode 符号,浏览器 A 和浏览器 B 之间经常出现对齐差异,有时甚至在浏览器 C 中也会出现,这可能会弄乱你的 UI。
这篇文章实际上让我想起了 CSS Tricks 的早期。克里斯本人那时写了许多这类帖子。毕竟它被称为 CSS Tricks。这些技巧有用吗?也许!它们实用吗?有时!
这只是用 CSS 玩得开心!
它不可动画。
作为一名 JavaScript 开发人员,我主张尽可能少写 JavaScript 代码。
这并不是针对 JavaScript 本身,而是代码本身可能是错误的来源。这当然适用于所有语言,甚至包括 CSS,但仅使用 CSS,你的应用程序就不会有崩溃的风险。
为此,有一个
accesskey
全局属性。我并不是说你不应该使用 JavaScript,而是说应该把它用于真正有用的事情。例如,如果你想让空格键切换播放状态,那很好 - 任何事情都应该有合理的理由。
嗨!感谢你的评论。
使用 Unicode 字符或不使用 JavaScript 来执行上面的代码都没有错。有些情况需要使用它们。
为什么我不使用 Unicode?形状与设计师的要求有点不同。你无法(据我所知)在其他字符(例如暂停字符)之间进行过渡。
为什么不使用 JavaScript?当然可以!状态(播放/暂停)可以绑定到复选框,绑定访问键(如你所说),但是,你不用担心按钮的外观,因为 CSS 会检查选中属性并完成它的工作,而不用 JavaScript 切换任何 CSS 类。
这篇文章试图展示 CSS 的强大功能。
Daniel
相反,如果你依赖 JavaScript,而它没有加载(或不允许加载),则功能会丢失。你可以继续关注复选框技巧,因为它是在 DOM 中的输入。记住,曾经有一段时间,表单需要在没有 JavaScript 的情况下运行,并且可访问性那时相当好地融入其中。
“...没有 JavaScript,你无法分配访问键...”
从未听说过 HTML accesskey 属性吗?
当你需要动画时,这并不是一个坏主意,否则 Unicode 就足够了。
这是我的版本
我也同意 **Alice Wonder Miscreations** 的观点,使用 CSS 进行状态更改并不总是好的。
我对这个做了一些修改,使用伪元素(相同的边框技巧),以便播放图标在动画时分成两半。
好文章......我真的很感谢你详细讲解如何制作一个三角形......我喜欢那个演示动画,你巧妙地将它用于制作播放演示的语音气泡。自从我开始学习 CSS 以来,我一直是你的粉丝。
我可能仍然更愿意使用 SVG 而不是边框形状,因为 play.svg 比较容易理解和修改,而不是 border-color: transparent transparent transparent #202020;。
撇开 CSS 与 JavaScript 之间的争论不谈,这篇文章写得很好,代码的解释也很出色。你分解 CSS 的方式很容易理解,而且不傲慢。更多人需要了解这些东西。我会直接使用 SVG 或图标字体。谢谢。
看到边框技巧和纯 CSS 解决方案比好的可访问性界面更重要,我感到很伤心。这个“按钮”在两种情况下都无法从键盘访问。此外,想象一下用一个没有应用 CSS 的复选框来切换播放/暂停。听起来很荒谬,对吧?为什么你要给屏幕阅读器用户提供这个令人困惑的复选框隐喻?好吧,我知道为什么:为了让它成为纯 CSS。但是,谁在乎你的 JS 播放器是否由纯 CSS 按钮切换呢?
在 YouTube 将其按钮改为带动画后,我用伪元素做了这个。这个会在悬停时进行动画,但可以很容易地用复选框技巧完成。
https://codepen.io/fauxserious/details/XbvMrM/
不错。
这是一个巧妙而简单的视觉 CSS 技巧。我喜欢它。最终,我们都可以为此使用可动画的 clip-path,或者将来可能会使用一个处理状态和动画本身的 SVG,但这现在有效,而且非常简单。
为了提高可访问性,你可以在标签中添加
role=button
、aria-label=“play/pause”
和tabindex=0
,也许还可以添加一个按键处理程序,这样就差不多了。你给出的所有建议(除了
aria-label
)都可以用适当的<button>
元素代替<div>
:按钮会自动将按键事件转换为点击,默认情况下具有适当的角色并且可以聚焦。干得好。但是,你能添加一首与你的按钮一起播放的歌曲吗?
感谢你的鼓舞人心的文章。我已经在这里探索了一些播放器按钮的边框样式属性:https://codepen.io/o-k-s-a-n-a/pen/YraoJV。
我喜欢它 - 当我想象人们如何在 css 中创建所有这些很棒的形状时,我的脑子就炸了,而且过渡非常棒 - 这确实是 CSS 技巧
使用感叹号真不错!很少看到它们。
现在试试用键盘激活它:)。
不错
我之前做过类似的事情
箭头分成两半,重新塑造为暂停的条形,就像 YouTube 按钮一样
请告诉我你的想法
Philip 使用 CSS 自定义属性写了一个版本,这样就可以调整大小