Web编程技术营地
研究、演示、创新

CSS Buttons

撰写时间:2025-11-14

修订时间:2025-12-22

浏览器的默认设置

:root { color-scheme: light dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); }

默认情况下,按钮有一个圆角(Safari的圆角值较大);没有鼠标悬停的效果,但按下按钮,会自动加亮。

设置padding

:root { color-scheme: light dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; }

Safari中,当padding始超0.7em时,过大的圆角才会自动消失,从而变成一个扁平的按钮。

设置边框

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 1px solid gray; }

Safari中,当设置边框后,会有一个副作用:该按钮的背景颜色会自动变亮一些,而Chrome不会。为避免此不一致性,需自行指定一个背景颜色。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 1px solid gray; background-color: #444; }

当按钮设置了类型为solid的边框后,按下按钮时,按钮不再自动加亮。我们需显式地为其进行:active伪类的设置。

buttonborder-width默认值为outset,我们可以依此显式地定制一个外凸型的按钮。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 12px outset buttonborder; background-color: #444; }

border-width的值设得较大,是为了更好地看到产生外凸效果的原因。实际应用中可适当缩小此值。例如,当此值为5px,外凸效果就较为明显了。

设置:active

当按下按钮时,我们可以通过设置其边框线条的类型来模拟出3D效果。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 1px solid gray; background-color: #444; &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); } }

边框线的3D效果有了,但还不够真实:按钮的文本也应随之而动。使用transform来达到目的。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 1px solid gray; background-color: #444; &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); } }

设置:hover

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 1px solid gray; background-color: #444; &:hover { color: yellow; background-color: #555; } &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); } }

需注意的是,若同时设置:active:hover,则须先指定:hover再指定:active

当鼠标悬停时,通常作法是稍微提高一点按钮的背景色,以及选用一个高亮颜色作为其文本颜色。

按下按钮时,可通过opacity来同时降低一点按钮背景色及文本颜色,以营造真实的光影效果。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 1px solid gray; background-color: #444; &:hover { color: yellow; background-color: #555; } &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); opacity: 0.75; } }

按钮的悬停及加亮颜色也可通过使用filter值的brightness函数来完成。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em; border: 1px solid gray; background-color: #444; &:hover { color: yellow; filter: brightness(1.3); } &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); filter: brightness(0.9); } }

完成按钮的基本设置

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 0.7em 1em; border: 1px solid gray; border-radius: 0.1em; background-color: #444; cursor: pointer; &:hover { color: yellow; filter: brightness(1.3); } &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); filter: brightness(0.9); } }

在最后的基本设置中,可微调按钮的内边距,为其设置一个较小值的圆角,并将其鼠标指针设置为pointer

属性typebutton, submit, resetinput控件,以及上传控件中的按钮,其设置方法也与button完全一样。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button, input[type=button], input[type=file]::file-selector-button { padding: 0.7em 1em; border: 1px solid gray; border-radius: 0.1em; background-color: #444; cursor: pointer; &:hover { color: yellow; filter: brightness(1.3); } &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); filter: brightness(0.9); } }

设置带有图标的按钮

通过background属性,可以为按钮安置背景图标。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 1em; border: 1px solid gray; border-radius: 0.1em; background-color: #444; line-height: 1em; padding-left: 35px; background-repeat: no-repeat; background-size: 18px; background-position: 10% center; cursor: pointer; &:hover { color: yellow; filter: brightness(1.3); } &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); filter: brightness(0.9); } &#info { background-image: url(/imgs/info-dark.png); } &#note { background-image: url(/imgs/note.png); } &#error { background-image: url(/imgs/error.png); } }

尽管图标有不同的颜色,而filterbrightness函数足以应对这些不同的颜色。

也可使用Unicode字符作为背景图标。主要有2种方式。

第一种是将Unicode字符写进svg中,再将svg转换为data URI的形式供background-image使用;第二种方式是使用::before伪类,将Unicode字符直接写进CSS中。

第二种方式最简单,下面是其实现方法。

:root { color-scheme: dark; } body { color: light-dark(#555, #ACB7C4); background-color: light-dark(#ccc, #2B2B2B); } button { padding: 1.5em 1em; border: 1px solid gray; border-radius: 0.1em; background-color: #444; line-height: 1em; padding-left: 40px; position: relative; &::before { position: absolute; top: center; left: 10px; font-size: 2em; } &#cycle::before { color: cyan; content: "\2672"; } &#snow-man::before { content: "\26C4"; } &#moon::before { color: orange; content: "\23FE"; } cursor: pointer; &:hover { color: yellow; filter: brightness(1.3); } &:active { border-style: inset; box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.125); transform: translate(1px, 1px); filter: brightness(0.9); } }

这种方式的优点是节省带宽、资源丰富、清晰度无损耗、且颜色可定制,但缺点是需花点时间从海量的Unicode字符中找到适合场景的字符。