Spin.js-CSS动画进度加载器

Spin.js是一款基于VML的CSS动画加载器,具备高度适应性和良好的浏览器兼容性。它无需额外图片和CSS文件,支持jQuery但不依赖,且配置灵活。文章介绍了 Spin.js 的特性、使用方法,包括如何配置线条数量、长度、颜色等,以及如何启动和停止动画。此外,还列出了对不同浏览器的支持情况。
部署运行你感兴趣的模型镜像

spin.js是一款非常简单的CSS加载器,他是一款使用了VML(Vector Makeup Language)的CSS动画效果。

spin.js的特性

他有着非常强大的适应性,有着以下几个特性:

1.    没有额外的图片,也没有增加的外部CSS文件

2.    不需要依赖于其他工具,对于jQuery而言,它支持jQuery,但是jQuery并非必须的

3.    有很高的可配置性

4.    与分辨率无关

5.    浏览器兼容性很好,在低版本的IE上,采用VML支持

6.    使用了@keyframe动画,在不支持@keyframe的浏览器上,使用setTimeout()

7.    支持所有的主流浏览器,包括IE6

spin.js的使用

spin.js动态创建进度条,并且是圆圈进度动画,它的高配置表现在可以配置颜色,放射线的宽度和长度,旋转是逆时针还是顺时针,还有旋转的速度。你可以设置一个数组,来存储这个进度条的属性:

1.    var opts={

2.    lines:11, // 圆圈中线条的数量

3.    length: 29, // 每条线的长度

4.    width: 10, //每条线的宽度

5.    radius: 30, //每条线的圆角半径

6.    corners: 1, //角落圆度,从0到1

7.    rotate: 0, //旋转偏移量

8.    direction: 1, //旋转方向,其中1表示顺时针,0表示逆时针

9.    color: '#FFF', // 颜色

10.  speed: 1, //旋转速率,单位为转速/

11.  trail: 60, //余晖的百分比,即颜色变化的百分比

12.  shadow: false, //是否显示阴影

13.  hwaccel: false, //是否使用硬件加速

14.  className: 'spinner', // 绑定到spinner上的class名称

15.  zIndex: 2e9, //定位层,默认值是2000000000

16.  top: 'auto', // 相对父元素的向上定位,单位是px

17.  left: 'auto' // 相对父元素的向左定位,单位是px

18.  };

然后结合jQuery使用spin.js非常简单,只需要在选定的元素上,使用spin()方法就可以了,将上面设定的设置作为参数传入:

1.    $("#loading").spin(opts);

停止加载动画效果也非常简单,只需要将false作为参数传入spin方法就可以:

1.    $("#loading").spin(false);

而针对jQuery,spin.js还提供了更为简单的设置,可以传入tiny,small,large来简单设置圆圈的大小,其默认的设置中,圆圈的线条是9根,每条线的长度是10px,宽20px。对于tiny,small,large的设置如下:

·       tiny: {lines: 8, length: 2, width: 2, radius: 3 }

·       small: {lines: 8, length: 4, width: 3, radius: 5 }

·       large: {lines: 10, length: 8, width: 4, radius: 8 } 

spin.js的浏览器支持

spin.js支持所有的主流浏览器,其中包括:

·       Chrome

·       Safari3.2+

·       Firefox3.5+

·       IE6,7,8,9

·       Opera10.6+

·       MobileSafari (iOS 3.1+)

·       Android2.3+

spin.js的演示

在本文中的示例,大家在演示中可以看到旋转的进度条,而当你点击在进度条上面的时候,代码通过传入false参数,将进度条停止并隐藏。

其他演示和库文件下载,请参见IT在线教育平台——麦子学院

任何问题,可以联系我~

 

您可能感兴趣的与本文相关的镜像

HunyuanVideo-Foley

HunyuanVideo-Foley

语音合成

HunyuanVideo-Foley是由腾讯混元2025年8月28日宣布开源端到端视频音效生成模型,用户只需输入视频和文字,就能为视频匹配电影级音效

<!DOCTYPE html> <html lang="zh" class="van-theme-light"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>每天按时喝水养生</title> <!-- Vant UI 样式 --> <link rel="stylesheet" href="assets/lib/index.css"> <!-- 自定义样式 --> <style> body { margin: 0; padding: 0; background: #e5e5e5; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Segoe UI, Arial, Roboto, "PingFang SC", "miui", "Hiragino Sans GB", "Microsoft Yahei", sans-serif; } .divbox { margin: 10px; } .flexbox { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } .header { display: flex; } .caltitle { margin-top: 10px; cursor: pointer; } .tag_dev, .tag { color: #ed6a0c; background: linear-gradient(45deg, #ed6a0c, #ff976a); -webkit-background-clip: text; background-clip: text; color: transparent; text-align: center; font-size: large; font-weight: 700; } .o1, .ot1 { text-indent: -2em; padding-left: 2em; color: #009147; } .o2, .ot2 { text-indent: -2em; padding-left: 2em; } .o3, .ot3 { text-indent: -1.5em; padding-left: 1.5em; } .mrv { color: #009147; font-weight: 700; } .app { text-indent: -3em; padding-left: 3em; } .verTag { padding: 5px; border-radius: 5px; border: 1px solid; margin-left: 5px; } .verTag:hover { background-color: #1a73e8; color: #fff; } .audio { width: 100%; background-color: #f1f3f4; padding: 5px; border-radius: 5px; color: #c1c2c3; } #btnnn { background-color: #c1c2c3; color: #fff; } .clickble { cursor: pointer; } /* 动画样式 */ .ov-icon { display: inline-block; overflow: visible; vertical-align: -0.2em; } .ov-spin { animation: ov-spin 1s linear infinite; } .ov-wrench { animation: ov-wrench 2.5s ease infinite; } .ov-ring { animation: ov-ring 2s ease infinite; } .ov-pulse { animation: ov-pulse 2s linear infinite; } .ov-flash { animation: ov-flash 2s ease infinite; } .ov-float { animation: ov-float 2s linear infinite; } .ov-flip-horizontal { transform: scale(-1, 1); } .ov-flip-vertical { transform: scale(1, -1); } .ov-flip-both { transform: scale(-1, -1); } .ov-inverse { color: #fff; } /* 日历弹窗样式 */ .calendar-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center; z-index: 1000; } .calendar-container { background: white; border-radius: 12px; padding: 20px; width: 90%; max-width: 320px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .calendar-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; font-size: 18px; font-weight: bold; } .calendar-close { background: none; border: none; font-size: 24px; cursor: pointer; color: #999; width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } .calendar-close:hover { background-color: #f5f5f5; } .calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; text-align: center; } .calendar-day { padding: 8px 4px; border-radius: 6px; font-size: 14px; transition: background-color 0.2s; } .calendar-day.header { font-weight: bold; color: #666; cursor: default; } .calendar-day:hover { background-color: #f0f0f0; } .calendar-day.today { background-color: #1a73e8 !important; color: white !important; font-weight: bold; } .calendar-day.selected { background-color: #009147 !important; color: white !important; } @keyframes ov-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes ov-wrench { 0% { transform: rotate(-12deg); } 8% { transform: rotate(12deg); } 10%, 28%, 30%, 48%, 50%, 68% { transform: rotate(24deg); } 18%, 20%, 38%, 40%, 58%, 60% { transform: rotate(-24deg); } 75%, 100% { transform: rotate(0deg); } } @keyframes ov-ring { 0% { transform: rotate(-15deg); } 2% { transform: rotate(15deg); } 4%, 12% { transform: rotate(-18deg); } 6% { transform: rotate(18deg); } 8% { transform: rotate(-22deg); } 10% { transform: rotate(22deg); } 12% { transform: rotate(-18deg); } 14% { transform: rotate(18deg); } 16% { transform: rotate(-12deg); } 18% { transform: rotate(12deg); } 20%, 100% { transform: rotate(0deg); } } @keyframes ov-pulse { 0% { transform: scale(1.1); } 50% { transform: scale(0.8); } 100% { transform: scale(1.1); } } @keyframes ov-flash { 0%, 100%, 50% { opacity: 1; } 25%, 75% { opacity: 0; } } @keyframes ov-float { 0% { transform: translateY(-3px); } 50% { transform: translateY(3px); } 100% { transform: translateY(-3px); } } </style> </head> <body> <div id="app"> <!-- 导航栏 --> <div class="van-nav-bar van-hairline--bottom"> <div class="van-nav-bar__content"> <div class="van-nav-bar__left van-haptics-feedback"> <i class="van-icon van-icon-arrow-left van-nav-bar__arrow"></i> </div> <div class="van-nav-bar__title van-ellipsis">每天按时喝水养生</div> <div class="van-nav-bar__right van-haptics-feedback"> <i class="van-icon van-icon-wap-home-o" style="font-size: 32px;"></i> </div> </div> </div> <!-- 主要内容 --> <div class="divbox"> <div class="flexbox"> <!-- 左箭头按钮 --> <button type="button" class="van-button van-button--default van-button--normal" id="prevDay"> <div class="van-button__content"> <i class="van-icon van-icon-arrow-left van-button__icon"></i> </div> </button> <!-- 日期显示 --> <button type="button" class="van-button van-button--default van-button--normal" id="currentDateBtn"> <div class="van-button__content"> <span class="van-button__text" id="currentDate">2025/11/18(周二)</span> </div> </button> <!-- 右箭头按钮 --> <button type="button" class="van-button van-button--default van-button--normal" id="nextDay"> <div class="van-button__content"> <i class="van-icon van-icon-arrow van-button__icon"></i> </div> </button> </div> <!-- 分割线 --> <div class="van-divider van-divider--hairline" style="margin: 5px;"></div> <!-- 内容区域 --> <div> <!-- 这里可以添加具体的进度内容 --> </div> </div> <!-- 日历弹窗 --> <div id="calendarModal" class="calendar-modal" style="display: none;"> <div class="calendar-container"> <div class="calendar-header"> <span id="calendarMonth"></span> <button id="calendarClose" class="calendar-close">×</button> </div> <div id="calendarDays" class="calendar-grid"></div> </div> </div> <!-- CDN 引入 Vue 3 --> <script src="assets/lib/vue.global.js"></script> <!-- CDN 引入 Vant --> <script src="assets/lib/vant.min.js"></script> <link rel="stylesheet" href="assets/lib/mine.css" /> <!-- 底部占位 --> <div style="margin-bottom: 300px;"></div> <!-- 返回顶部按钮 --> <div class="van-back-top__placeholder"></div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // ====== 关键:初始化 Vant 命令式调用环境 ====== const { createApp } = Vue; const app = createApp({}); // 创建空应用 app.use(vant); // 安装 Vant 插件 const tempDiv = document.createElement('div'); tempDiv.id = 'vant-init'; tempDiv.style.display = 'none'; document.body.appendChild(tempDiv); app.mount(tempDiv); // 挂载(必须!) // ============================================ const currentDateEl = document.getElementById('currentDate'); const currentDateBtn = document.getElementById('currentDateBtn'); let selectedDate = new Date(); function updateDateText(date) { const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; const y = date.getFullYear(); const m = String(date.getMonth() + 1).padStart(2, '0'); const d = String(date.getDate()).padStart(2, '0'); const w = weekdays[date.getDay()]; currentDateEl.textContent = `${y}/${m}/${d}(${w})`; } updateDateText(selectedDate); // 现在 vant.Calendar 已可用! currentDateBtn.addEventListener('click', () => { vant.Calendar({ show: true, defaultDate: selectedDate, showConfirm: false, onConfirm(date) { selectedDate = date; updateDateText(date); } }); }); document.getElementById('prevDay').addEventListener('click', () => { selectedDate.setDate(selectedDate.getDate() - 1); updateDateText(selectedDate); }); document.getElementById('nextDay').addEventListener('click', () => { selectedDate.setDate(selectedDate.getDate() + 1); updateDateText(selectedDate); }); }); </script> </body> </html> 我是直接通过离线html加载的vant 日历组件,其他功能正常,就是点击日期日历组件没反应弹不来,我需要创建vue应用和http server服务启动,只想通过点击html离线在浏览器加载。你帮我
最新发布
11-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值