SCSS变量$shape直接控制border-radius是最轻量通用的圆角多态方案,支持数值、百分比、多值语法;配合map预设语义化形状族;桥接CSS自定义属性实现运行时切换;避免滥用clip-path,优先用border-radius降级。
SCSS变量控制border-radius实现圆角多态
直接用
变量驱动
是最轻量、最通用的形状多态方案。它不依赖伪元素或SVG,兼容所有现代浏览器,且能和CSS自定义属性联动。
常见错误是把
写成字符串(如
),导致Sass编译报错
——变量必须是数值或带单位的长度值。
→ 矩形
→ 小圆角
→ 圆形/椭圆(需配合等宽高等比例容器)
→ 不对称圆角(支持空格分隔的四个值)
示例:
用map + @each实现预设形状族切换
当项目需要统一管理「基础圆角语义」(如
/
/
)时,硬编码多个变量易失控。用
map配合
生成类名更可持续。
立即学习
“
前端免费学习笔记(深入)
”;
注意:map键名不能含连字符(
非法),建议用下划线或驼峰;生成的CSS类名再做映射转换。
定义
循环中用
拼接类名,避免
被Sass误解析为减法
不推荐在map里存
——部分旧版iOS Safari对
渲染有微小偏移,显式写
更稳妥
示例片段:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
结合CSS自定义属性实现运行时形状切换
纯SCSS变量只能编译时确定形状,若需用户点击切换(如主题设置里的“圆角强度滑块”),必须桥接CSS自定义属性。
作为中间层,SCSS只负责注入默认值和媒体查询响应逻辑。
容易忽略的是:自定义属性无法直接参与Sass计算(如
必须在CSS层写,不能放在
里);同时要为IE提供
回退值。
在:root中设
,组件用
用
将
设为
,兼顾可访问性
JavaScript动态修改
即可实时生效,无需重载样式表
避免clip-path带来的性能与兼容陷阱
有人试图用
或
实现更复杂的形状(如切角、波浪边),但这是高成本方案:每次变更都会触发layout+paint,且
在Firefox和Safari中支持度极差。
真正需要非矩形轮廓时,优先检查是否能用
(PNG alpha通道)或SVG
内联——它们复用GPU加速,且可被CSS变量控制
实现动画。
如果坚持用
,务必:
只对
或
元素使用,避免污染文档流重排
避免在
中动态切换复杂polygon路径,改用
模拟“膨胀”效果
始终提供
作为降级,例如
形状多态的核心不是炫技,而是让同一套组件在不同上下文里自然适配视觉语言——
变量覆盖90%场景,其余交给具体需求裁决。别为了“支持三角形”提前引入
,等设计真提了三角形按钮再说。
$shapeborder-radius$shape"rounded-lg"Invalid CSS after "...radius: #{$shape}": expected expression$shape: 0$shape: 4px$shape: 50%$shape: 10px 20px 0 30px@mixin shape($shape) {
border-radius: $shape;
}
.btn {
@include shape(6px);
}
.btn--pill {
@include shape(999px);
}
smmdlg$shapes@eachrounded-sm$shapes: (sm: 2px, md: 6px, lg: 12px, full: 50%)#{'rounded-' + $key}rounded-sm0border-radius: 00px$shapes: (sm: 2px, md: 6px, lg: 12px, full: 50%);
@each $key, $val in $shapes {
.rounded-#{$key} {
border-radius: $val;
}
}
--shape-radiuscalc(var(--shape-radius) * 2)@includeborder-radius--shape-radius: 8pxborder-radius: var(--shape-radius, 8px)@media (prefers-reduced-motion: reduce)--shape-radius0pxstyle.setProperty('--shape-radius', '24px')clip-path: polygon()path()path()mask-imagemask-positionclip-pathposition: absolutefixed:hovertransform: scale()border-radiusclip-path: polygon(...); border-radius: 12px;border-radiusclip-path