标题图片

CSS实现双层渐变边框按钮

关闭页面 回到首页 打印文章

作者:xxt8582753

发布日期:2026年6月20日

相信大家已经发现本站新增WindowsXP Luna主题了。WindowsXP是一个经典的操作系统,也是我的童年回忆,我想用现代CSS技术还原其独特的审美风格,以下是我钻研的过程,希望能给大家一点启发。

观察

这是一个标准的WindowsXP对话框,此时我正把鼠标指针放在“取消”按钮上(普通按钮的Hover状态)

我们注意到无论是主要按钮(“确定”按钮)和焦点状态的普通按钮,都具有黑蓝色的窄外边框和带有渐变光泽的内边框,那如何做出这种双层边框效果呢?

也许你会想到使用border再加outline属性,但很可惜,border用outline效果不尽人意,那border能不能加上linear-gradient呢?答案也是不行的。

那么我们就需要使用伪元素来实现了,再配合 WebKit 的遮罩(mask),来实现一个镂空的高亮边框效果,鼠标移上去的时候会变成金色的渐变。

最基础的按钮


            
.xpbutton {
    position: relative;
    border-radius: 3px;
    cursor: pointer;
    padding: 4px 18px;
    font-size: 12px;
    font-family: "Tahoma", "SimSun", sans-serif;
    background: linear-gradient(to bottom, #fff 0%, #ECEBE6 90%, #D6D0C5 100%);
    border: 1px solid #003C74;
    color: #000;
    overflow: hidden;
}
            
            

这是按钮的基本样式,使用了线性渐变背景和边框颜色。

欸,你看,是不是很像?

加上伪元素


            
.xpbutton::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 2px;
  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  pointer-events: none;
}
            
            

::before 是一个伪元素,它不会出现在HTML里,是CSS自动生成的。我们用它在按钮上面加了一层“透明的罩子”,专门用来做边框效果。

伪元素必须有content属性才能显示,这里直接留空就好啦;同时,我们要设置pointer-events来确保伪元素不会挡住鼠标,影响按钮的交互。

遮罩的魔法

这里的-webkit-mask是浏览器的遮罩功能,用来控制元素哪些部分显示、哪些部分被隐藏。我们给伪元素加了两个遮罩:一个是整个区域,一个是中间的内容区域。

-webkit-mask-composite: xor; mask-composite: exclude; 的意思是把两个遮罩区域取交集然后挖掉,也就是只显示边框部分。

发光

给伪元素添加一个渐变背景就好了


            
.xpbutton:hover::before {
    background: linear-gradient(to bottom, #FCD279, #E59700);
    opacity: 1;
}
            
            

最终效果

是不是很像WindowsXP的按钮呢?

新的按钮样式我也很快应用到网站上,整体确实比较协调,就是这个窗框还不是很还原(按理来说xp窗口左右和底部都有蓝色粗边框,并且标题栏也还不是很像)这些细节我后面慢慢磨