html如何转圈_html实现加载转圈动画的CSS技巧【详解】

发布时间 - 2026-01-03 00:00:00    点击率:
最简纯CSS转圈动画:用border构造单色圆环+rotate(360deg)无限旋转,配合border-radius:50%、transparent边框及linear缓动;Safari需will-change:transform或translateZ(0)启用硬件加速。

border + animation 实现最简转圈动画

纯 CSS 实现加载转圈,核心是利用 border 的边框绘制和 transform: rotate() 配合 @keyframes。不需要 JS,不依赖外部资源,兼容性好(IE10+)。

常见错误是直接对元素整体旋转,导致内容也跟着转;正确做法是只旋转一个无内容的伪元素或空 ,并用 border 构造圆环。

  • 必须设置 border-radius: 50% 让元素呈圆形
  • 四边 border 宽度一致,但只留一边有颜色(如 border-top: 4px solid #007bff),其余设为透明(transparent
  • 动画需用 transform: rotate(360deg),不能用 rotateZ 或其他变体,否则部分旧版 Safari 不识别
  • 推荐加 animation-timing-function: linear,避免默认 ease 导致转速不均
.spinner {
  width: 20px;
  height: 20px;
  border: 4px solid transparent;
  border-top-color: #007bff;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

@keyframes spin { to { transform: rotate(360deg); } }

解决 Safari 中 transform 动画卡顿问题

Safari(尤其 iOS 14–15)对纯 transformrotate 动画可能掉帧,尤其在低功耗模式下。根本原因是浏览器未将其提升为独立图层。

强制启用硬件加速可缓解:给转圈元素添加 will-change: transform 或补一个极小的 translateZ(0)

  • will-change: transform 最直接,但不要滥用——仅用于持续动画的元素,否则影响内存
  • 若需兼容 iOS 12–13,用 transform: rotate(0deg) translateZ(0) 开启 GPU 渲染
  • 避免同时对父容器设置 overflow: hidden 和子元素旋转,Safari 可能截断动画轨迹
.spinner {
  will-change: transform;
  /* 或者 */
  /* transform: rotate(0deg) translateZ(0); */
}

响应式转圈大小适配不同设备

固定像素(如 20px)在高 DPI 屏幕上显得过小,在小屏手机上又可能遮挡内容。应优先使用相对单位,并配合 min-width/max-width 控制边界。

  • emrem 替代 px,让尺寸随父文本缩放(例如按钮内的加载图标)
  • clamp() 设置弹性范围:width: clamp(16px, 2.5vw, 32px),兼顾小屏、桌面、大屏
  • 注意 border-width 也要同比例缩放,否则圆环粗细会失衡
  • 如果嵌入文字行内,加 vertical-align: middle 避免基线错位
.spinner-inline {
  width: clamp(12px, 1.8vw, 24px);
  height: clamp(12px, 1.8vw, 24px);
  border-width: clamp(2px, 0.9vw, 4px);
  vertical-align: middle;
}

clip-path 做更精细的转圈控制(如缺口圆环)

默认 border 转圈是实心圆弧,但有些设计需要“缺口”或“断开”的环形(比如进度感更强的 loading)。这时 clip-path 比改 SVG 更轻量。

原理是先画一个完整圆环,再用 clip-path: polygon() 切掉一小段,再旋转它——视觉上就像一段弧在转动。

  • 缺口角度建议控制在 15°–30°,太小难察觉,太大像卡住
  • 必须配合 transform-origin: center,否则裁剪后旋转中心偏移
  • Firefox 对 clip-pathpolygon 支持稳定,但 IE 完全不支持,需降级回 border 方案
.spinner-gap {
  width: 32px;
  height: 32px;
  border: 4px solid #007bff;
  border-radius: 50%;
  animation: spin-gap 1.2s linear infinite;
  transform-origin: center;
  clip-path: polygon(
    0% 0%, 100% 0%, 100% 100%, 0% 100%,
    0% 50%, 15% 50%, 15% 45%, 0% 45%
  );
}

@keyframes spin-gap { to { transform: rotate(360deg); } }

实际项目中,最容易被忽略的是动画触发时机与 DOM 生命周期的配合——比如组件挂载后才开始动画,或请求结束时及时移除 class。CSS 动画本身没状态管理,这部分得靠 JS 控制 class 切换,别指望纯 CSS 自动启停。


# css  # html  # js  # go  # svg  # 伪元素  # 浏览器  # safari  # ios  # 硬件加速  # 卡顿问题  # overflow  # firefox  # class 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  微信h5制作网站有哪些,免费微信H5页面制作工具?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Laravel如何优化应用性能?(缓存和优化命令)  Linux安全能力提升路径_长期防护思维说明【指导】  JS弹性运动实现方法分析  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  黑客如何利用漏洞与弱口令入侵网站服务器?  如何在阿里云域名上完成建站全流程?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何快速辨别茅台真假?关键步骤解析  焦点电影公司作品,电影焦点结局是什么?  免费视频制作网站,更新又快又好的免费电影网站?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  android nfc常用标签读取总结  实例解析Array和String方法  如何用免费手机建站系统零基础打造专业网站?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  如何挑选最适合建站的高性能VPS主机?  开心动漫网站制作软件下载,十分开心动画为何停播?  如何快速搭建高效WAP手机网站吸引移动用户?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  如何用AWS免费套餐快速搭建高效网站?  如何在宝塔面板中修改默认建站目录?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何快速搭建高效香港服务器网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  nginx修改上传文件大小限制的方法  Python并发异常传播_错误处理解析【教程】  javascript如何操作浏览器历史记录_怎样实现无刷新导航  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel如何使用Livewire构建动态组件?(入门代码)  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  简单实现Android文件上传  EditPlus中的正则表达式 实战(2)  网站建设要注意的标准 促进网站用户好感度!  JavaScript如何实现继承_有哪些常用方法  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)