真要实现「左上红、右下蓝」且交互响应正常的对角线分割双色按钮,必须用伪元素+定位+transform skew或clip-path,而非单层linear-gradient;伪元素方案兼容性好、可控性强,clip-path方案更精确但需现代浏览器支持。

对角线分割双色按钮不能靠 background 单层渐变硬凑——那样只能切出斜线,但两侧颜色无法独立控制 hover 状态或点击反馈。真要实现「左上红、右下蓝」且交互响应正常,得用伪元素 + 定位 + clip-path 或 SVG 背景,而不是瞎叠两个 linear-gradient。
用 ::before 伪元素做斜切底色层
这是最可控、兼容性好(Chrome 80+/Firefox 69+/Safari 15.4+)、支持 hover 动画的方案。核心是让主按钮承载一种颜色,::before 承载另一种,并用 transform: skewX(-45deg) 拉出对角效果。
- 主按钮设为
position: relative,背景色填左上区域(比如#e74c3c) -
::before绝对定位覆盖整个按钮,背景设为右下色(比如#3498db),宽高拉到 150%,再transform: skewX(-45deg) translateX(-25%)把斜块“推”进可视区 - 必须加
z-index: -1确保伪元素在文字下方,否则文字被盖住 - hover 时可分别改主按钮色和伪元素色,或统一加
transition: all 0.2s
示例关键 CSS:
button {
position: relative;
background-color: #e74c3c;
color: white;
border: none;
padding: 12px 24px;
}
button::before {
content: "";
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background-color: #3498db;
transform: skewX(-45deg) translateX(-25%);
z-index: -1;
}
clip-path 切三角形区域(现代写法)
如果只支持较新浏览器(Chrome 104+/Firefox 103+/Safari 16.4+),直接用 clip-path: polygon() 切两个三角形更干净,不用 skew 变形带来的像素模糊或边缘锯齿。
- 按钮本身不设背景,用
background: linear-gradient(135deg, #e74c3c 50%, #3498db 50%)铺满,再用clip-path: polygon(0 0, 100% 0, 100% 100%)切出右下三角 - 但这样只能显一层色——所以实际要用两个
div叠在一起,各自clip-path切互补三角,再分别设色 - 注意:
clip-path在 Firefox 中对 inline 元素支持弱,务必设display: inline-block或block
简单起见,推荐用伪元素方案;若项目已锁定现代浏览器且需精确三角边界,再上 clip-path。
避免用纯 linear-gradient 的坑
很多人试过 background: linear-gradient(135deg, #e74c3c 50%, #3498db 50%),结果发现:斜线位置固定、无法随按钮尺寸自适应、hover 时两色过渡生硬、移动端缩放后斜线错位。
- 问题根源:百分比 50% 是按容器宽高算的,不是按对角线长度;按钮宽高不等时,斜线就歪
- 补救无效:加
background-size: 200% 200%或调角度,只会让分界线偏移,无法真正“顶角到顶角” - 更麻烦的是:这种渐变无法单独给某一半加 hover 效果,比如只让红色区变暗,蓝色区不动——做不到
真正稳定的对角线双色按钮,本质是「视觉合成」,不是「渐变模拟」。伪元素方案能让你把颜色、动画、状态逻辑完全拆开控制,比一行 background 值靠谱得多。别省那几行 CSS,先跑通再优化。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











