尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JavaScript+jQuery无缝轮播图组件实现与排错指南
简介这份压缩包面向正在学习前端交互效果、希望掌握轮播图实现思路的初中级开发者围绕原生 JavaScript 操作 DOM 与 jQuery 动画结合解决图片无缝切换、边界跳转与动画衔接等常见问题。包内共 3 个文件以 1 个 html 页面和 2 个 png 图片素材为主整体约 6KB体量轻巧便于直接打开页面阅读源码、替换素材后做二次练习。示例重点演示用原生方法封装基础逻辑、借助 jQuery 完成轮播动画并通过额外增加一张图的方式处理浏览到最后一张时的切换障目技巧对理解索引控制、动画队列和首尾衔接较有帮助。目前已有 301 人学习适合用作课堂示例、课程作业参考或前端入门阶段的手写轮播练习也可据此拆解出可复用的轮播实现思路。1. 从一张静态图到自动播放轮播图为什么是老前端的第一块试金石轮播图大概是前端组件里最不起眼、线上却最容易出问题的那一类。很多人觉得它简单真正在项目里碰到过才发现几十行代码里挤着定时器、DOM 克隆、事件解绑、浏览器重排四件事任何一件没处理干净表现就是闪一下、卡一下或者越转越快。这份 JavaScript jQuery 实现的轮播图压缩包就是把这件事拆开来看。一套不依赖构建工具、双击index.html就能跑的无缝轮播带自动播放、左右箭头、小圆点跳转、悬停暂停。它更适合两类人刚接触 jQuery、需要一个能完整跑通的小案例的以及手上还有老项目挂着 jQuery需要一个能直接拖进去改的轮播组件。2. 项目结构与技术选型一份轮播图工程里通常摆着什么2.1 目录结构四个文件撑起一个组件拿到压缩包解压后常规的组织大致是这样carousel/ ├── index.html # 示例页直接把组件跑起来 ├── css/ │ └── carousel.css # 组件样式跟业务样式分开 ├── js/ │ └── jquery.carousel.js # 插件本体挂在 $.fn 上 └── images/ # 示例图通常 3~5 张我一般会坚持把组件的 CSS 和 JS 放在单独的carousel.css/jquery.carousel.js里不让它跟index.html里的业务样式混在一起。原因很实际轮播图这类组件你迟早要在第二个页面里用第二次样式一旦写进页面第二遍就是复制粘贴改一次要改两处。把组件样式全部挂在一个.carousel根类下面后面整个文件夹拖进别的项目基本不用改。另一件事是示例页和组件分离。index.html只负责给出结构、引脚本、初始化不承担任何组件逻辑。这样你后面重构示例页的时候不会不小心把组件改坏。jquery.carousel.js内部一般是一个 IIFE立即执行函数把 jQuery 传进去;(function ($) { use strict; // 这里写插件 })(jQuery);起手用;是血泪经验。前面某个文件如果结尾没收分号又用了立即执行函数两个 IIFE 连着写浏览器会把后一个当成前一个的调用参数直接报出一堆莫名其妙的错。文件开头补一个分号这个坑就没了。2.2 HTML 骨架为什么用 ul/li 而不是一堆 div示例页里典型的骨架长这样div classcarousel idcarousel div classcarousel-viewport ul classcarousel-track li classslideimg srcimages/banner-1.jpg alt第一张/li li classslideimg srcimages/banner-2.jpg alt第二张/li li classslideimg srcimages/banner-3.jpg alt第三张/li /ul /div a href# classcarousel-arrow prev aria-label上一张/a a href# classcarousel-arrow next aria-label下一张/a ul classcarousel-dots/ul /div三层结构各司其职.carousel管整体定位和事件挂载.carousel-viewport只负责overflow: hidden裁切.carousel-track才真正做位移。这层拆分是我见过的、后面最好改的做法。很多人一开始把裁切和位移放在同一个元素上等要加个渐变遮罩、加个左右箭头渐变层的时候就发现裁切边界和内容边界打架了。小圆点直接用空ul classcarousel-dots让 JS 根据图片数量动态生成。写死在 HTML 里也行但图片一增减就得手动对齐数量迟早会忘。动态生成虽然多几行但数量永远跟内容一致。箭头用a而不是div是为了能拿到键盘焦点加个aria-label成本很低体验差别不小。2.3 CSS 定位策略overflow裁切加transform位移组件样式里最关键的三条.carousel-viewport { position: relative; overflow: hidden; /* 只留可视区其他全裁掉 */ width: 100%; } .carousel-track { display: flex; will-change: transform; /* 提示浏览器提前合成减少抖动 */ transition: transform .6s cubic-bezier(.25, .8, .25, 1); } .carousel-track .slide { flex: 0 0 100%; /* 每张占满可视区宽度 */ list-style: none; } .carousel-track .slide img { display: block; width: 100%; height: auto; /* 别写死高度否则图片变形 */ }几个决定值得说明。第一位移用transform: translateX()不用left。left会触发浏览器重排动画一多就掉帧transform走合成层只重绘不重排。代价是位移量要用百分比或像素自己算没left直观但这笔账划算。第二flex: 0 0 100%里的100%是相对.carousel-track的宽度。而.carousel-track作为块级元素的子元素宽度就是.carousel-viewport的宽度。所以每张 slide 宽度等于可视区宽度translateX(-100%)刚好移动一张位移和索引能一一对应不用额外计算容器宽度。第三transition写在.carousel-track上后面无缝回跳时会临时去掉它。这行 css 是整个无缝效果的关键前提。第三方的轮播库比如很多老项目用的那套常常用绝对定位加left偏移好处是能算到像素级坏处是图片高度不一致时容易错位。flex的好处是每张图自动等高对齐样式简单需要固定高度就在.slide上设height加object-fit: cover不要在外层写死。2.4 依赖选择为什么这套代码用 jQuery 而不是原生看到这里有人会问现在原生querySelector都够用了为什么还拿 jQuery 做轮播图。答案很简单——这份代码的定位不是“新技术演示”而是“能塞进一个还挂着 jQuery 的老项目里直接跑”。这类项目里 jQuery 已经是全局依赖组件再引入一套框架得先过构建这一关。而你用 jQuery 写一个$.fn.carousel调用方一行就能初始化$(#carousel).carousel({ interval: 4000, speed: 500 });链式调用、.on()的事件委托、$.extend合并默认参数这几样东西正好覆盖轮播图需要的全部能力不多不少。事件解绑也可以用命名空间mouseenter.carousel干净地收拾掉这一点原生事件虽然也能做但写起来要自己维护一套字符串前缀反而麻烦。要注意的是 jQuery 版本差异。新版 jQuery 里.on()的事件委托写法、.animate()的行为跟老版本有细微出入$.fn.carousel里如果用到$.isFunction、$.trim这类在 3.x 之后被废弃的工具函数会直接报 “is not a function”。跨版本复用前先在目标项目里console.log($.fn.jquery)确认一下比看一堆报错快得多。3. 无缝滚动的核心算法克隆帧、索引映射和一次位移的完整链路3.1 克隆帧把“最后一张接第一张”做成错觉“无缝”这个词经常被误解。真正的无缝不是把图片首尾接成环形而是让用户看不出回跳的动作。最常用的做法是复制首尾两帧var $track $root.find(.carousel-track); var $slides $track.children(.slide); var total $slides.length; // 一张图不值得轮播直接退出省掉后面所有边界判断 if (total 2) return; // 首尾各克隆一帧开头放最后一张结尾放第一张 $track.prepend($slides.last().clone().addClass(is-clone)); $track.append($slides.first().clone().addClass(is-clone));此时轨道上的真实结构变成[尾克隆, 图1, 图2, 图3, 首克隆]一共total 2帧。克隆帧加上is-clone类方便样式上做区分比如不参与懒加载、不统计点击。原理是从图 3 往后走到“首克隆”用户看到的确实是图 1 的画面这一帧动画播完在用户察觉之前马上把轨道无动画地瞬移回真实的图 1 位置两张画面完全一样视觉上就看不出切换。反过来往前走到“尾克隆”同理。这是整个组件里唯一称得上“技巧”的地方。翻车最多的也是这里——很多人克隆了两帧却忘了在位移结束后瞬移回来结果转一圈之后轨道越走越远最后整排图消失不见。3.2 索引映射真实索引、轨道位置、小圆点三者要对齐克隆帧一加进去索引就不能直接用0到total - 1了。需要区分两套编号编号含义取值范围轨道位置index在[尾克隆, 图1, ..., 图N, 首克隆]上的下标0 ~ total1真实索引real对应到原始图片的下标0 ~ total-1换算关系很简单function toReal(pos) { // 减 1 是因为前面插了一个尾克隆加 total 再取模是为了处理 pos0 的情况 return (pos - 1 total) % total; }让两种位置这样对应好处是后面所有位置相关逻辑比如小圆点高亮、指示器文案、图片懒加载都只依赖这一个index变量。状态源唯一就不会出现“图走到第三张、小圆点还亮在第二张”这种经典错位。(pos - 1 total) % total里的 total不能省。JS 的%对负数返回负值pos 0时-1 % 3得到-1不是2。这种负数取模的问题平时看不见一到首尾边界就会引发错误。3.3 位移与回跳瞬移的那一帧必须关掉过渡有了索引位移就简单了核心只有一个moveTo和一个jumpTofunction moveTo(pos) { if (locked) return; // 动画未结束挡掉重复触发 locked true; $track.css(transform, translateX( (-pos * 100) %)); index pos; syncDots(pos); // 同步小圆点 // 用定时器兜底防止 transition 被中断后 locked 永久卡死 clearTimeout(settleTimer); settleTimer setTimeout(settle, opts.speed 60); } function settle() { if (index 0) { // 停在尾克隆上瞬时闪回真实的最后一张 jumpTo(total); } else if (index total 1) { // 停在首克隆上瞬时闪回真实的第一张 jumpTo(1); } locked false; } function jumpTo(pos) { $track.addClass(is-jumping); // 关掉 transition $track.css(transform, translateX( (-pos * 100) %)); index pos; syncDots(pos); void $track[0].offsetWidth; // 强制回流让新位置立即生效 $track.removeClass(is-jumping); }is-jumping在 CSS 里就一行transition: none。这一行是这个方案的核心有过渡时屏幕就是慢动作回放没有它用户才察觉不到。void offsetWidth这行看起来奇怪作用是强制浏览器把上面的定位算完再移除类否则浏览器可能把两次样式变更合并导致过渡没有被真正关掉。translateX(-pos * 100%)里的百分比是按轨道自身宽度算的。前面已经保证了每张 slide 宽度等于可视区宽度所以-100%刚好退一张-200%退两张索引和位移一一对应不需要再拿offsetWidth去乘一遍。locked是为了防止连续点击比如用户连点三下右箭头时动画队列堆积。没有锁三下点击会让轨道堆到第 4 帧动画看起来会像幻灯片一卡一卡地跳。settle用setTimeout兜底而不是只靠transitionend是踩过坑之后的选择。transitionend在标签页切到后台、动画被浏览器暂停、或元素被display: none时都可能不触发一旦不触发locked就永远不会复位轮播图从此停摆。加一层定时兜底代价只是最坏情况下多等 60ms 解锁。3.4 定时器用递归setTimeout而不是setInterval自动播放这里有个不太容易注意到但很坑的点function play() { stop(); if (!opts.autoplay || total 2) return; function tick() { playTimer setTimeout(function () { next(); // 内部走 moveTo(index 1) tick(); // 播完再排下一次 }, opts.interval); } tick(); } function stop() { clearTimeout(playTimer); playTimer null; }如果换成setInterval(next, 3000)问题会在用户切到别的标签页再切回来时暴露浏览器虽然会节流后台定时器但有些场景下setInterval的回调会攒着一回来连续执行好几次画面一口气跳过好几张。而递归setTimeout每次都是上一次执行完才排下一次天然不会堆积。组件每次交互之后都要调一次play()因为play()开头就stop()了相当于重置计时。用户手动点完按钮不该在一秒内又被自动播放顶走。4. 事件与交互层悬停、箭头、圆点如何归到同一套状态4.1 事件命名空间让解绑能一次清空组件给每个事件都加了.carousel命名空间$root.on(mouseenter.carousel, handleEnter) .on(mouseleave.carousel, handleLeave); $root.on(click.carousel, .carousel-arrow.next, next) .on(click.carousel, .carousel-arrow.prev, prev); $dots.on(click.carousel, li, function () { moveTo($(this).index() 1); // 圆点下标 0..total-1映射到轨道位置 1 });命名空间的好处只在销毁时才体现而它恰恰是最容易忘的一件事。页面上同时有两个轮播实例、或者轮播图所在的弹层被关掉又打开时没有命名空间off(click)会把元素上其他业务绑的 click 一起清掉问题现象是“打开一次弹层后别的按钮会失灵”。组件最好提供一个销毁接口$.fn.carousel.destroy function ($root) { $root.off(.carousel); $root.find(.carousel-dots).off(.carousel); stop(); };.off(.carousel)一行就把所有带这个命名空间的事件解绑了不用一个个写全事件名和选择器。销毁时记得顺手stop()否则定时器还在跑DOM 都删了每次回调都会对着空元素执行控制台会逐渐刷满报错。4.2 小圆点的状态同步只认一个状态源小圆点的生成和高亮都放在一起// 初始化时按真实图片数量生成 for (var i 0; i total; i) { $dots.append(li>var hovering false; $root.on(mouseenter.carousel, function () { hovering true; if (opts.pauseOnHover) stop(); }).on(mouseleave.carousel, function () { hovering false; if (opts.pauseOnHover) play(); });第一个细节是mouseenter/mouseleave而不是mouseover/mouseout。后两者在鼠标从一张图移到另一张图时会反复触发因为它们支持冒泡子元素进出会触发父元素事件表现为“鼠标明明没离开轮播区域播放却不停重启”看起来像是暂停失效。mouseenter/mouseleave不冒泡进出整个容器时各触发一次正合适。第二个细节是记一个hovering状态而不是在点击事件里直接调play()。用户可能是在悬停状态下点的箭头如果点击后无条件play()那就等于在鼠标还停在上面的时候启动了自动播放跟pauseOnHover的意图矛盾。有了hovering点击后可以写成if (!hovering) play();逻辑就自洽了。快速点击的拦截其实已经被locked覆盖了。moveTo开头if (locked) return;动画进行中所有点击都忽略。这里不用再额外做节流locked本身就是最合适的节流器因为它的时间窗正好等于动画时长。4.4 自动播放的启停条件一条清晰的判断链自动播放该在什么条件下停止建议把条件集中在一处判断不要散落在各个事件里function canAutoPlay() { // 一张图、用户关了 autoplay、鼠标悬停中、页面在后台都不播 if (total 2) return false; if (!opts.autoplay) return false; if (hovering) return false; if (document.hidden) return false; return true; }document.hidden这条很多人不会加。标签页切到后台时定时器本来就会被节流但不同浏览器的节流策略不一样有的砍到 1 秒一次有的甚至更激进。主动判断一下切走就stop()回来再play()行为在所有浏览器里一致$(document).on(visibilitychange.carousel, function () { canAutoPlay() ? play() : stop(); });这比依赖“浏览器应该会帮我节流”可靠得多。轮播图跑到后台还在偷偷换图回来时第一眼就是错的这种小问题用户不会报但体验分就扣掉了。5. 常见问题排查轮播图跑不动、跳帧、错位的几个真实翻车现场5.1 现象首屏刚加载就闪一下或者从第二张直接跳到第三张现象页面刚打开第一张还没停稳画面猛地闪一下或者动画直接从第 2 张跳到第 3 张跳过了中间那张。原因克隆帧插进去之后轨道的初始位置没设。默认index 0但0是尾克隆的位置画面显示的是最后一张不是第一张。有些实现是在 HTML 里写死了初始transform但克隆帧插入后元素顺序变了写死的偏移量就对不上了。解决初始化时必须显式把位置设到真实第一张上而且这一帧不能有过渡// 初始化强制落在真实第一张上且不能有动画 index 1; jumpTo(1);注意是jumpTo而不是moveTo。用moveTo会从translateX(0)也就是尾克隆的位置滑到第一张用户会看到一个奇怪的“倒着滑”入场。5.2 现象鼠标来回扫几遍之后点箭头没反应或者越转越快现象把鼠标反复移进移出轮播区域几次之后点箭头没反应或者轮播图转得越来越快像失控一样。原因定时器重复创建了。每次mouseenter调stop()清了旧的但mouseleave里如果写的是setTimeout(tick, interval)而没有先stop()旧定时器还在新定时器又叠上去两个同时跑速度翻倍多扫几次就是四倍、八倍。另一种表现是箭头没反应因为locked被某个没走完的动画卡住永不复位。解决play()第一行无脑stop()只保留一个入口locked一定要配超时兜底。检查时可以在play()和stop()里各打一条日志数一下配对次数很快就能看出哪次多创建了。function play() { stop(); // 不管三七二十一先把旧的清干净 // ... }5.3 现象从其他标签页切回来画面一口气跳过好几张现象在别的标签页待了一会儿再切回来看轮播正好看到画面连着换了好几张中间还带着还没播完的动画。原因用了setInterval。浏览器对后台标签页的定时器有节流策略但不同浏览器的处理不一样有的会把攒下的回调一次性补执行表现出来就是“回来瞬间快进”。解决换成递归setTimeout并且在visibilitychange里主动停播。前者保证不会堆积后者让切走期间根本不跑定时器。这两条一起用行为在所有浏览器里都一致。5.4 现象图片在小圆点对不上的位置或者走到最后一张圆点全灭现象点第三个小圆点图确实到第三张了但高亮落在第二个或者转到最后一张时所有圆点都没有is-active。原因圆点索引和轨道位置差了一个位移。圆点是0..total-1轨道位置是1..total中间那个1的偏移如果某处漏加了或者用eq(pos)而不是eq(toReal(pos))就会整体错位。走到克隆帧时pos超出圆点范围eq取不到元素表现为全灭。解决所有位置到圆点的换算统一走toReal()不要在事件处理和状态同步里各写一套。所有写入点都改走moveTo只保留syncDots一处高亮逻辑。// 只留这一个写入点 function syncDots(pos) { $dots.children().removeClass(is-active).eq(toReal(pos)).addClass(is-active); }5.5 现象图片没加载完就初始化整排图叠在一起或者宽度算成 0现象网速慢的时候打开页面前几秒轮播区是一片空白或者图挤成一团过一会儿才恢复正常。原因script直接放在head里执行或者放在底部但没有等图片加载。图片还没下载完.slide的高度是 0如果组件内部是按offsetHeight计算位置的算出来的结果全是 0位移就没了。解决两种办法选一种。简单的是把初始化挪到$(window).on(load, ...)里等所有资源就绪再建组件更稳的是给.slide设一个固定高度或者aspect-ratio让布局和图片加载解耦组件就可以在$(function(){})里正常跑。后者对首屏体验更好因为不用等图片。// 方案 A等全部资源 $(window).on(load, function () { $(#carousel).carousel(); }); // 方案 B给 slide 定高或定比例然后 DOM ready 就初始化 // .carousel-track .slide { aspect-ratio: 16 / 9; } $(function () { $(#carousel).carousel(); });别再顺序里夹个setTimeout(fn, 300)去赌图片加载速度那只是把问题推迟到网速更差的时候。6. 二次开发把轮播图改成你项目里真正能用的样子6.1 加触摸滑动移动端绕不过去的一段桌面端箭头和圆点够用移动端用户的第一反应是左右划。在事件层补一段触摸逻辑成本不高var startX 0, startY 0, isDrag false; $root.on(touchstart.carousel, function (e) { var t e.originalEvent.touches[0]; startX t.clientX; startY t.clientY; isDrag false; stop(); }).on(touchmove.carousel, function (e) { var t e.originalEvent.touches[0]; // 横向位移明显大于纵向才判定为用户想滑轮播 if (Math.abs(t.clientX - startX) Math.abs(t.clientY - startY)) { isDrag true; } }).on(touchend.carousel, function (e) { if (!isDrag) { play(); return; } // 纵向滑动不拦交还给页面滚动 var delta e.originalEvent.changedTouches[0].clientX - startX; if (Math.abs(delta) 30) { play(); return; } // 位移太小当作误触 delta 0 ? next() : prev(); play(); });关键在touchmove里那个横纵向比较。不看方向直接preventDefault()页面在轮播区上下滑不动移动端体验会很糟。判断出横向滑之后再拦截默认行为垂直滚动才能正常交还给页面。阈值 30px 是我常用的值太小容易误触太大又显得反应迟钝。6.2 懒加载与响应式两个能顺手带上的改造图片一多首屏全下去会把带宽吃光。最简单的懒加载方案初始化时只给当前帧和相邻帧设真实地址$slides.each(function (i) { var $img $(this).find(img); $img.data(src, $img.attr(src)).removeAttr(src); // 先存起来摘掉 src }); function lazyLoad(pos) { var real toReal(pos); // 当前帧和相邻帧优先加载其余交给浏览器空闲时再补 [real, (real 1) % total, (real - 1 total) % total].forEach(function (i) { var $img $slides.eq(i).find(img); if (!$img.attr(src)) $img.attr(src, $img.data(src)); }); }lazyLoad放在syncDots旁边一起调位置一变就补加载不用单独维护。响应式这块因为用了百分比位移窗口缩放时轨道位置本身不用重算但有两个地方要处理一是在resize里清掉locked并重置一次位置防止缩放时动画被打断卡死二是如果用了固定像素高度的.slide要在断点里换高度。我一般写成var resizeTimer null; $(window).on(resize.carousel, function () { clearTimeout(resizeTimer); resizeTimer setTimeout(function () { locked false; // 缩放可能打断动画这里强制解锁 jumpTo(index); // 按当前索引重新落位不去改索引 }, 150); });用jumpTo而不是moveTo是因为缩放时用户不希望看到图在动只希望位置正确。150ms 防抖是为了避免拖动窗口时每一帧都触发重排。6.3 改造后的自检我一般会走一遍的表改完之后别只测点击下面几条我都吃过亏检查项怎么测期望首尾跨界从最后一张点下一张再点上一张图连续无白屏无闪回快速连点一秒内连点右箭头 5 次只前进一张不堆队后台返回切到别的标签页等 30 秒再回来不连跳不崩移动端纵向滑手指在轮播区上下划页面正常滚动不换图慢网首屏网络限速到慢速不叠图不塌高度两个实例共存同页两个轮播互不影响定时器各自独立最后一条尤其容易漏。同页两个实例的场景下如果syncDots里用了模块级变量而不是this.each闭包里的变量两个实例会互相写对方的状态。所有状态变量都放在this.each(function () { ... })的闭包里面一层都不能往上提。我踩过最深的一次是把timer写成了模块级变量两个轮播图共用同一个定时器 ID销毁一个另一个也跟着停。从那以后我每次给 jQuery 组件加状态都强制走一遍“同页挂两个实例”的验证哪怕这个组件暂时只在一个地方用。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

使用Docker-compose快速部署TestLink测试管理系统

使用Docker-compose快速部署TestLink测试管理系统

1. 项目概述 TestLink是一款开源的测试管理工具,用于管理软件测试过程中的测试用例、测试计划和测试执行结果。使用Docker-compose搭建TestLink环境能够快速部署一套完整的测试管理系统,避免了传统安装方式中繁琐的依赖配置和环境准备过程。 2. 环境准…

📅 2026/10/30 10:27:03
科学体重管理:个性化方案与AI技术应用

科学体重管理:个性化方案与AI技术应用

1. 项目概述:健康体重管理的时代意义 2026年被定义为"体重管理年"并非偶然。随着现代生活节奏加快和饮食结构变化,全球超重人群比例已突破40%大关。这个数字背后隐藏着更严峻的现实:体重异常直接关联着200多种慢性疾病的发生风险。…

📅 2026/10/30 10:27:03
CentOS 7离线安装与配置Tomcat 9全指南

CentOS 7离线安装与配置Tomcat 9全指南

1. 离线环境下的准备工作 在CentOS 7系统中离线安装Tomcat,首先需要解决的是依赖环境和安装包的获取问题。与在线安装不同,离线安装需要提前准备好所有必要的组件。 1.1 获取Tomcat安装包 Apache Tomcat的官方下载地址是https://tomcat.apache.org。对…

📅 2026/10/30 10:27:03
MORE NEWS

更多资讯

📰

RT-Thread Env SCons 自定义文件添加与 ST-Link 一键下载配置教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

基于Python的时间胶囊区块链:AES-GCM加密、链上存证与时间锁实践

简介:“区块链上的时间胶囊”项目源码与学习素材,适合具备 Python 编程基础、希望进一步接触区块链时间戳与智能合约开发的读者,可用于理解信息上链、加密保存及到期解锁等场景的基本实现思路,并体会分布式系统中透明性与隐私保护…

📰

LogManager启动后在忙什么:三类后台线程撑起日志全生命周期

摘要:上一篇讲了 LogManager 是什么、Broker 启动时如何加载恢复日志。这篇接着追问:日志恢复完、Broker 对外服务之后,LogManager 还在做什么?答案藏在 startup() 方法里——它会拉起三类后台线程:一个单线程调度器、…

📰

你的第一个开源 PR 指南:Null Motion 本地开发环境、good first issue 清单与 PR 规范

【免费下载链接】NullMotion Play a finished motion-graphics ad in sync with the rough drafts it grew from, and export the breakdown as MP4. 项目地址: https://gitcode.com/gh_mirrors/nu/NullMotion 点击查看 免费下载 Null Motion 是一个本地运行的动效…

📰

iDRAC9 240天试用License:解锁R740/R440远程KVM与虚拟介质

简介:iDRAC9 Enterprise 240天试用版许可证面向戴尔R740、R440等第14代服务器的系统管理员、IT运维人员,用于快速解锁服务器远程管理控制台的完整企业级功能。这份资源体积极小,压缩包仅2KB,内部包含1个XML格式的许可证文件&#…

📰

【吐血整理】STM32F103C8T6 例程全解析:从点亮 LED 到跑通 UCOS 的入门路线图

【吐血整理】STM32F103C8T6 例程全解析:从点亮 LED 到跑通 UCOS 的入门路线图 【免费下载链接】STM32F103C8T6开发参考例程代码 本仓库提供了针对STM32F103C8T6微控制器的开发参考例程代码。这些例程涵盖了多种常见的嵌入式开发功能,包括ADC、IO口、串口…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬