1. 项目概述在Vue2项目中我们经常需要展示大量数据表格。传统静态表格在数据量较大时用户需要手动滚动查看体验较差。而通过CSS动画实现的自动滚动表格能够以优雅的方式展示长列表数据特别适合监控系统、实时数据展示等场景。这个方案的核心优势在于纯CSS实现性能优于JavaScript控制的滚动表头固定内容区域自动向上滚动支持鼠标悬停暂停方便用户查看具体数据无缝循环滚动视觉体验流畅2. 实现原理详解2.1 整体布局结构实现自动滚动表格的关键在于分层处理外层容器.table-wrapper设置固定宽高和overflow:hidden作为整个组件的定位基准表头层.table-header绝对定位固定在顶部只显示表头隐藏内容行内容滚动层.table-body-scroll绝对定位在表头下方设置overflow:hidden隐藏超出部分滚动内容容器.table-scroll-content包含两份相同的数据表格通过CSS动画实现向上移动2.2 CSS动画核心机制keyframes table-scroll-up { 0% { transform: translate3d(0, 0, 0); } 100% { transform: translate3d(0, -50%, 0); } } .table-scroll-content { animation: table-scroll-up 20s linear infinite 0.1s; }动画原理初始位置0%内容位于原始位置结束位置100%内容向上移动50%即一份完整数据的高度无限循环infinite和线性运动linear确保平滑连续滚动0.1s延迟确保DOM完全渲染后再开始动画3. 完整实现步骤3.1 HTML结构搭建div idapp div classtable-wrapper !-- 固定表头 -- div classtable-header el-table :datatableData !-- 表头列定义 -- /el-table /div !-- 内容滚动层 -- div classtable-body-scroll refbodyScroll div classtable-scroll-content refscrollContent !-- 第一份内容 -- div classtable-scroll-item el-table :datatableData !-- 内容列定义 -- /el-table /div !-- 第二份内容 -- div classtable-scroll-item el-table :datatableData !-- 内容列定义 -- /el-table /div /div /div /div /div3.2 CSS样式实现.table-wrapper { width: 700px; height: 300px; overflow: hidden; position: relative; } .table-header { position: absolute; top: 0; left: 0; width: 100%; z-index: 10; } .table-header .el-table__body-wrapper { display: none !important; } .table-body-scroll { position: absolute; top: 41px; /* 表头高度 */ left: 0; width: 100%; height: calc(100% - 41px); overflow: hidden; } .table-scroll-content { display: flex; flex-direction: column; animation: table-scroll-up 20s linear infinite 0.1s; } .table-body-scroll:hover .table-scroll-content { animation-play-state: paused; cursor: pointer; }3.3 JavaScript逻辑补充new Vue({ el: #app, data() { return { tableData: [...], // 表格数据 tableScrollDuration: 20 // 默认滚动时长 } }, mounted() { this.$nextTick(() { this.autoAdjustHeaderHeight(); this.setTableScrollDuration(); this.resetAnimation(); }); }, methods: { // 自动调整表头高度 autoAdjustHeaderHeight() { const header this.$el.querySelector(.table-header); const bodyScroll this.$refs.bodyScroll; if (header bodyScroll) { const headerHeight header.offsetHeight; bodyScroll.style.top ${headerHeight}px; bodyScroll.style.height calc(100% - ${headerHeight}px); } }, // 根据数据量调整滚动速度 setTableScrollDuration() { const scrollContent this.$refs.scrollContent; if (!scrollContent) return; const duration Math.max(15, this.tableData.length * 2); this.tableScrollDuration duration; scrollContent.style.animationDuration ${duration}s; }, // 重置动画确保生效 resetAnimation() { const scrollContent this.$refs.scrollContent; if (scrollContent) { scrollContent.style.animation ; setTimeout(() { scrollContent.style.animation ${this.tableScrollDuration}s table-scroll-up linear infinite 0.1s; }, 100); } }, // 鼠标悬停控制 pauseScroll() { const scrollContent this.$refs.scrollContent; if (scrollContent) { scrollContent.style.animationPlayState paused; } }, resumeScroll() { const scrollContent this.$refs.scrollContent; if (scrollContent) { scrollContent.style.animationPlayState running; } } } });4. 关键问题与优化方案4.1 无缝滚动实现原理为了实现无缝循环效果我们放置了两份相同的数据当第一份数据向上滚动离开可视区域时第二份数据正好接替第一份数据的位置动画结束时50%位移两份数据的位置与初始状态一致由于是无限循环视觉上形成连续滚动的效果4.2 表头高度自适应表头高度可能因以下原因变化不同分辨率的屏幕表头内容变化Element UI版本差异解决方案autoAdjustHeaderHeight() { const header this.$el.querySelector(.table-header); const bodyScroll this.$refs.bodyScroll; if (header bodyScroll) { const headerHeight header.offsetHeight; bodyScroll.style.top ${headerHeight}px; bodyScroll.style.height calc(100% - ${headerHeight}px); } }4.3 滚动速度优化滚动速度应该与数据量成正比数据量少时减慢速度避免滚动过快数据量大时加快速度避免等待时间过长计算公式const duration Math.max(15, this.tableData.length * 2);4.4 动画重置技巧在某些浏览器中直接修改animation属性可能不会立即生效。解决方法scrollContent.style.animation ; // 先清空 setTimeout(() { scrollContent.style.animation ${duration}s table-scroll-up linear infinite 0.1s; }, 100);5. 实际应用中的注意事项5.1 数据更新处理当表格数据变化时需要暂停动画更新数据重新计算滚动速度重置动画示例代码updateTableData(newData) { this.pauseScroll(); this.tableData newData; this.setTableScrollDuration(); this.resetAnimation(); }5.2 移动端适配问题在移动设备上需要注意触摸事件替代鼠标悬停调整动画速度考虑性能优化建议添加触摸事件div classtable-body-scroll touchstartpauseScroll touchendresumeScroll /div5.3 性能优化建议避免在滚动容器中使用复杂DOM结构使用transform代替top/left进行动画合理设置will-change属性对大数据考虑虚拟滚动优化后的CSS.table-scroll-content { will-change: transform; backface-visibility: hidden; }6. 扩展应用场景6.1 横向滚动实现修改关键样式即可实现横向滚动keyframes table-scroll-left { 0% { transform: translate3d(0, 0, 0); } 100% { transform: translate3d(-50%, 0, 0); } } .table-scroll-content { display: flex; flex-direction: row; /* 改为横向排列 */ animation: table-scroll-left 20s linear infinite; }6.2 多表格联动滚动多个表格同步滚动的实现// 在mounted中 this.$nextTick(() { const tables document.querySelectorAll(.table-scroll-content); tables.forEach(table { table.style.animation ${this.tableScrollDuration}s table-scroll-up linear infinite; }); });6.3 动态内容加载结合API实现无限滚动async loadMoreData() { this.pauseScroll(); const newData await fetchMoreData(); this.tableData [...this.tableData, ...newData]; this.setTableScrollDuration(); this.resetAnimation(); }7. 常见问题排查7.1 动画不生效的可能原因DOM未完全渲染确保在$nextTick中执行样式覆盖问题检查开发者工具中的样式优先级浏览器兼容性确保浏览器支持CSS动画硬件加速问题添加transform: translateZ(0)7.2 滚动卡顿问题优化方案减少滚动区域内的DOM数量使用will-change提示浏览器确保使用transform而不是top/left适当降低滚动速度7.3 表头与内容错位解决方案确保表头和内容表格的列定义完全一致检查是否有额外的边框或边距影响使用开发者工具检查元素实际宽度调试技巧.table-header .el-table, .table-scroll-item .el-table { border-collapse: separate; border-spacing: 0; }8. 完整代码示例以下是经过优化的完整实现!doctype html html langzh-CN head meta charsetUTF-8 titleVue2表格自动滚动/title script srchttps://cdnjs.cloudflare.com/ajax/libs/vue/2.6.14/vue.min.js/script link relstylesheet hrefhttps://unpkg.com/element-ui/lib/theme-chalk/index.css script srchttps://unpkg.com/element-ui/lib/index.js/script style .table-wrapper { width: 100%; height: 400px; overflow: hidden; position: relative; border: 1px solid #ebeef5; border-radius: 4px; } .table-header { position: absolute; top: 0; left: 0; width: 100%; z-index: 10; background: white; } .table-header .el-table__body-wrapper { display: none !important; } .table-body-scroll { position: absolute; top: 41px; left: 0; width: 100%; height: calc(100% - 41px); overflow: hidden; } .table-scroll-content { display: flex; flex-direction: column; animation: table-scroll-up 30s linear infinite 0.1s; will-change: transform; } .table-body-scroll:hover .table-scroll-content { animation-play-state: paused; cursor: pointer; } .table-scroll-item .el-table { border-top: none !important; } .table-scroll-item .el-table__header-wrapper { display: none !important; } keyframes table-scroll-up { 0% { transform: translateY(0); } 100% { transform: translateY(-50%); } } /style /head body div idapp div classtable-wrapper div classtable-header el-table :datatableData el-table-column propid labelID width80/el-table-column el-table-column propname label名称/el-table-column el-table-column propvalue label数值/el-table-column el-table-column propdate label日期/el-table-column /el-table /div div classtable-body-scroll refbodyScroll mouseenterpauseScroll mouseleaveresumeScroll div classtable-scroll-content refscrollContent div classtable-scroll-item el-table :datatableData el-table-column propid labelID width80/el-table-column el-table-column propname label名称/el-table-column el-table-column propvalue label数值/el-table-column el-table-column propdate label日期/el-table-column /el-table /div div classtable-scroll-item el-table :datatableData el-table-column propid labelID width80/el-table-column el-table-column propname label名称/el-table-column el-table-column propvalue label数值/el-table-column el-table-column propdate label日期/el-table-column /el-table /div /div /div /div /div script new Vue({ el: #app, data() { return { tableData: this.generateTestData(20) } }, methods: { generateTestData(count) { const data []; for (let i 1; i count; i) { data.push({ id: i, name: 项目${i}, value: Math.round(Math.random() * 100), date: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000) .toISOString().split(T)[0] }); } return data; }, pauseScroll() { const content this.$refs.scrollContent; if (content) content.style.animationPlayState paused; }, resumeScroll() { const content this.$refs.scrollContent; if (content) content.style.animationPlayState running; }, adjustLayout() { this.$nextTick(() { const header this.$el.querySelector(.table-header); const body this.$refs.bodyScroll; if (header body) { const headerHeight header.offsetHeight; body.style.top ${headerHeight}px; body.style.height calc(100% - ${headerHeight}px); // 根据数据量调整速度 const duration Math.max(20, this.tableData.length * 1.5); this.$refs.scrollContent.style.animationDuration ${duration}s; } }); } }, mounted() { this.adjustLayout(); window.addEventListener(resize, this.adjustLayout); }, beforeDestroy() { window.removeEventListener(resize, this.adjustLayout); } }); /script /body /html9. 性能对比与方案选择9.1 CSS动画 vs JavaScript动画特性CSS动画JavaScript动画性能高浏览器优化中等依赖实现流畅度60fps硬件加速依赖requestAnimationFrameCPU占用低中到高实现复杂度简单复杂控制粒度中等高9.2 适用场景建议推荐CSS方案简单自动滚动需求性能敏感场景不需要复杂交互控制推荐JavaScript方案需要精确控制滚动位置复杂交互需求动态加载内容10. 浏览器兼容性处理10.1 前缀处理为确保跨浏览器兼容建议添加前缀.table-scroll-content { -webkit-animation: table-scroll-up 20s linear infinite 0.1s; animation: table-scroll-up 20s linear infinite 0.1s; } -webkit-keyframes table-scroll-up { 0% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 100% { -webkit-transform: translate3d(0, -50%, 0); transform: translate3d(0, -50%, 0); } } keyframes table-scroll-up { 0% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 100% { -webkit-transform: translate3d(0, -50%, 0); transform: translate3d(0, -50%, 0); } }10.2 降级方案对于不支持CSS动画的浏览器如IE9及以下可以提供备选方案mounted() { if (!window.CSS || !CSS.supports(animation, name)) { this.fallbackScroll(); } else { this.initCSSAnimation(); } }, methods: { fallbackScroll() { // 使用JavaScript实现类似效果 const content this.$refs.scrollContent; let position 0; const speed 1; // 像素/帧 const animate () { position - speed; if (position -content.offsetHeight / 2) { position 0; } content.style.transform translateY(${position}px); this.animationId requestAnimationFrame(animate); }; this.animationId requestAnimationFrame(animate); // 添加鼠标控制 this.$refs.bodyScroll.addEventListener(mouseenter, () { cancelAnimationFrame(this.animationId); }); this.$refs.bodyScroll.addEventListener(mouseleave, () { this.animationId requestAnimationFrame(animate); }); } }11. 实际项目中的经验总结11.1 最佳实践建议数据量控制理想数据量15-50条过多数据影响性能过少数据滚动效果不明显动画时长计算// 基础时长 每项0.5秒 const baseDuration 10; const itemDuration 0.5; const duration baseDuration this.tableData.length * itemDuration;响应式设计mounted() { window.addEventListener(resize, this.adjustLayout); }, methods: { adjustLayout() { // 重新计算布局 } }11.2 常见陷阱规避z-index问题确保表头的z-index高于内容避免父元素创建新的层叠上下文边框重叠问题.table-scroll-item:first-child .el-table { border-top: none !important; }动画闪烁问题添加0.1s延迟确保DOM就绪使用transform代替top/left11.3 调试技巧动画暂停调试// 在控制台调试 document.querySelector(.table-scroll-content).style.animationPlayState paused边界检查.table-scroll-item { outline: 1px solid red; /* 临时添加查看边界 */ }性能分析使用Chrome DevTools的Performance面板检查Layout和Paint次数12. 扩展阅读与进阶方向12.1 性能优化进阶will-change使用技巧.table-scroll-content { will-change: transform; backface-visibility: hidden; perspective: 1000px; }GPU加速优化.table-scroll-content { transform: translate3d(0, 0, 0); }减少重绘避免在动画元素上使用box-shadow使用opacity代替visibility12.2 复杂交互扩展滚动速度控制setScrollSpeed(speed) { const content this.$refs.scrollContent; const currentTime (content.style.animationDuration || 20s).replace(s, ); const newTime currentTime * (1/speed); content.style.animationDuration ${newTime}s; }滚动方向切换setScrollDirection(direction) { const content this.$refs.scrollContent; if (direction up) { content.style.animationName table-scroll-up; } else { content.style.animationName table-scroll-down; } }动态内容加载async loadMoreData() { const newData await fetchData(); this.tableData [...this.tableData, ...newData]; this.resetAnimation(); }13. 替代方案比较13.1 现有方案对比方案优点缺点适用场景CSS动画高性能、简单实现控制粒度有限简单自动滚动JavaScript动画灵活控制性能开销大复杂交互需求Web Animation API平衡性能与控制兼容性问题现代浏览器项目第三方库(如iScroll)功能全面体积大、学习成本需要复杂滚动效果13.2 技术选型建议轻量级需求纯CSS方案本文方案中等复杂度Web Animation API企业级应用成熟的第三方库特殊需求自定义JavaScript实现14. 版本迁移与升级14.1 Vue3适配方案Vue3中需要做以下调整引入方式变化import { createApp } from vue; import ElementPlus from element-plus; const app createApp({...}); app.use(ElementPlus); app.mount(#app);组合式API实现setup() { const scrollContent ref(null); const pauseScroll () { scrollContent.value.style.animationPlayState paused; }; return { scrollContent, pauseScroll }; }14.2 Element Plus注意事项Element Plus与Element UI的主要差异类名前缀从el-改为el-部分组件API有变化默认样式有调整对应修改/* Element UI */ .el-table__body-wrapper { display: none; } /* Element Plus */ .el-table__inner-wrapper .el-table__body-wrapper { display: none; }15. 测试与质量保证15.1 单元测试要点动画状态测试it(should pause animation on hover, () { wrapper.find(.table-body-scroll).trigger(mouseenter); expect(wrapper.vm.$refs.scrollContent.style.animationPlayState).toBe(paused); });布局计算测试it(should calculate correct header height, () { const headerHeight wrapper.find(.table-header).element.offsetHeight; const bodyTop wrapper.find(.table-body-scroll).element.style.top; expect(bodyTop).toBe(${headerHeight}px); });15.2 端到端测试示例describe(Table Scroll, () { it(should auto scroll table content, () { cy.visit(/); cy.get(.table-scroll-content).should(have.css, animation-name, table-scroll-up); cy.get(.table-body-scroll).trigger(mouseenter); cy.get(.table-scroll-content).should(have.css, animation-play-state, paused); }); });16. 部署与性能监控16.1 生产环境优化CDN引入优化!-- 添加preconnect预连接 -- link relpreconnect hrefhttps://cdnjs.cloudflare.com link relpreconnect hrefhttps://unpkg.com !-- 添加资源提示 -- link relpreload hrefhttps://cdnjs.cloudflare.com/ajax/libs/vue/2.6.14/vue.min.js asscript关键CSS内联style /* 关键路径CSS放在head中 */ /style16.2 性能监控指标关键指标动画帧率FPS主线程占用时间布局重绘次数监控实现// 使用PerformanceObserver监控动画性能 const observer new PerformanceObserver((list) { for (const entry of list.getEntries()) { if (entry.name table-scroll-up) { console.log(Animation frame time:, entry.duration); } } }); observer.observe({ entryTypes: [animation] });17. 安全注意事项17.1 XSS防护当动态渲染表格内容时Element UI默认防护el-table-column默认使用textContent而非innerHTML使用scoped slots时需注意危险内容处理// 在数据预处理时过滤 tableData.forEach(item { item.name sanitizeHTML(item.name); });17.2 性能安全防止内存泄漏beforeDestroy() { window.removeEventListener(resize, this.adjustLayout); cancelAnimationFrame(this.animationId); }无限循环保护// 设置最大数据量限制 if (this.tableData.length 1000) { console.warn(Too much data may cause performance issues); }18. 无障碍访问支持18.1 ARIA属性添加div classtable-body-scroll roleregion aria-label自动滚动表格 aria-livepolite div classtable-scroll-content !-- 表格内容 -- /div /div18.2 键盘导航支持mounted() { // 添加键盘控制 document.addEventListener(keydown, (e) { if (e.key ArrowUp) this.pauseScroll(); if (e.key ArrowDown) this.resumeScroll(); }); }19. 设计系统集成19.1 主题化适配CSS变量支持.table-wrapper { --scroll-speed: 20s; --header-height: 41px; } .table-scroll-content { animation: table-scroll-up var(--scroll-speed) linear infinite; }动态主题切换watch: { theme(newVal) { if (newVal dark) { document.documentElement.style.setProperty(--table-bg, #333); } else { document.documentElement.style.setProperty(--table-bg, #fff); } } }19.2 组件化封装创建可复用的AutoScrollTable组件template div classauto-scroll-table !-- 组件实现 -- /div /template script export default { props: { data: Array, speed: { type: Number, default: 1 } }, methods: { // 核心方法 } } /script20. 未来演进方向20.1 CSS Scroll API未来可以使用CSS Scroll API实现更精细控制.table-scroll-content { scroll-timeline: --table-scroll y; animation: auto scroll linear --table-scroll; }20.2 Web Components集成将方案封装为Web Componentclass AutoScrollTable extends HTMLElement { constructor() { super(); // 实现逻辑 } } customElements.define(auto-scroll-table, AutoScrollTable);20.3 机器学习优化根据用户交互习惯自动调整滚动速度暂停时长内容优先级
企业数字化 ERP 产品动态
相关推荐
永磁同步电机场路协同建模:RMxprt与Maxwell 2D闭环验证方法 简介:本资源是一份面向电力电子与传动控制方向本科生及电机仿真初学者的实践教学材料,聚焦永磁同步电机(PMSM)在ANSYS Maxwell平台中的全流程建模与仿真方法。内容覆盖RMxprt等效建模、Maxwell 2D二维电磁场建模、关键参数设置&am… · 2026/11/3 16:28:48
小红书技术内容推荐系统优化实践 1. 项目背景与核心价值在小红书这样的内容社区平台,推荐系统扮演着至关重要的角色。它决定了用户能否快速发现感兴趣的内容,也影响着创作者的曝光机会。牛客tracker与每日一题这个组合,实际上是针对技术类内容推荐场景的专项优化方案。我最早… · 2026/11/3 16:28:48
ESP32与AIoT设备端接入云端的最佳实践 1. ESP32与AI设备端接入的背景解析 去年在帮客户部署智能家居中控系统时,我遇到了一个典型需求:如何让搭载TensorFlow Lite Micro的ESP32设备将识别结果可靠地上报至云端管理系统。这个看似简单的"设备-云端"通信链路,在实际部署中… · 2026/11/3 16:27:47
uniapp海外游戏分发工程:PG电子集成与Switch卡带区域适配 简介:这是一套面向海外游戏业务开发者的全栈前端解决方案,基于UniApp框架实现跨平台兼容,专为构建海外游戏交易平台、手游下载站及Switch游戏卡带销售系统设计。资源包含完整可二次开发的前端源码(非编译后产物)&#… · 2026/11/4 0:00:17
Qoder NEXT:智能代码补全工具的技术解析与应用 1. 项目概述Qoder NEXT作为新一代智能编程辅助工具,其核心突破在于通过深度优化代码补全算法,将AI生成代码的开发者采纳率提升了65%。这个数字背后代表着编程效率的实质性飞跃——开发者不再需要花费大量时间在重复性代码编写和机械性调试上,… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46