<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Web无障碍 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《CSS 单位完全参考手册》</title><link>https://channel.meo-ai.com/posts/703</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/703</guid><pubDate>Wed, 02 Sep 2026 13:28:01 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《CSS 单位完全参考手册》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CSS&quot; title=&quot;#CSS&quot;&gt;#CSS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%93%8D%E5%BA%94%E5%BC%8F%E8%AE%BE%E8%AE%A1&quot; title=&quot;#响应式设计&quot;&gt;#响应式设计&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E6%8E%92%E7%89%88&quot; title=&quot;#Web排版&quot;&gt;#Web排版&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AE%B9%E5%99%A8%E6%9F%A5%E8%AF%A2&quot; title=&quot;#容器查询&quot;&gt;#容器查询&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%A7%86%E5%8F%A3%E5%8D%95%E4%BD%8D&quot; title=&quot;#视口单位&quot;&gt;#视口单位&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AD%97%E4%BD%93%E7%9B%B8%E5%AF%B9%E5%8D%95%E4%BD%8D&quot; title=&quot;#字体相对单位&quot;&gt;#字体相对单位&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CSS%E6%95%B0%E5%AD%A6%E5%87%BD%E6%95%B0&quot; title=&quot;#CSS数学函数&quot;&gt;#CSS数学函数&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;这是一本由 Mykola Ptushchuk 编写的交互式 CSS 单位参考手册，涵盖从基础像素到现代容器查询单位的所有 CSS 度量单位。全书共 7 章，每个单位都配有实时浏览器演示，可在线调整参数观察实际效果，并提供完整 PDF 下载。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 全书结构清晰，覆盖七大单位家族：从绝对单位（px）、字体相对单位（em/rem/ch/cap 等）、视口单位（vw/vh 及小/大/动态视口变体）、容器查询单位（cqi/cqw 等）、百分比、数学函数，到角度单位，形成完整的 CSS 度量体系地图。&lt;br /&gt;&lt;br /&gt;2. 视口单位家族详解：现代移动端浏览器 UI 会动态收缩/展开，因此视口单位分为默认（等价于大视口）、小视口（sv，假设浏览器控件展开）、大视口（lv，假设控件收起）和动态视口（dv，实时状态）四大家族，解决了 &lt;code&gt;100vh&lt;/code&gt; 在移动端全屏布局中常见的&quot;被地址栏遮挡&quot;难题。&lt;br /&gt;&lt;br /&gt;3. 容器查询单位让组件真正可移植：&lt;code&gt;cqi&lt;/code&gt;/&lt;code&gt;cqw&lt;/code&gt; 等单位测量的是组件所在的&quot;查询容器&quot;而非整个视口，使同一个卡片组件在 300px 侧边栏和 700px 主栏中能自动呈现不同布局，无需媒体查询或额外类名，实现了&quot;组件响应自身上下文&quot;而非&quot;响应整个页面&quot;的范式转变。&lt;br /&gt;&lt;br /&gt;4. 字体相对单位不止 em/rem：除了常见的 &lt;code&gt;em&lt;/code&gt;（当前元素字体大小）和 &lt;code&gt;rem&lt;/code&gt;（根元素字体大小），还有 &lt;code&gt;ch&lt;/code&gt;（数字 0 的字宽，适合设置最佳阅读行宽如 &lt;code&gt;65ch&lt;/code&gt;）、&lt;code&gt;cap&lt;/code&gt;（大写字母高度，适合图标与标题对齐）、&lt;code&gt;lh&lt;/code&gt;（当前行高作为长度）等精细排版单位，以及对应的根元素变体（rch/rex/rcap 等，2026 年 1 月才在 Firefox 中补齐，至此全浏览器支持）。&lt;br /&gt;&lt;br /&gt;5. CSS 数学函数是单位的粘合剂：&lt;code&gt;calc()&lt;/code&gt; 可混合不同单位（如 &lt;code&gt;100% - 240px&lt;/code&gt;），&lt;code&gt;clamp()&lt;/code&gt; 实现流体排版（如 &lt;code&gt;clamp(2rem, 5vw + 1rem, 4rem)&lt;/code&gt;），&lt;code&gt;min()/max()&lt;/code&gt; 取极值，还有三角函数（&lt;code&gt;sin/cos/tan&lt;/code&gt;）可用于无 JS 的圆形布局，指数函数（&lt;code&gt;pow/sqrt&lt;/code&gt;）可构建模块化字号比例系统。&lt;br /&gt;&lt;br /&gt;6. 实用选型建议：正文用 &lt;code&gt;rem&lt;/code&gt; 尊重用户偏好，组件内部比例用 &lt;code&gt;em&lt;/code&gt; 保持缩放一致性，&lt;code&gt;line-height&lt;/code&gt; 推荐无单位写法（如 &lt;code&gt;1.5&lt;/code&gt;）以便作为乘数继承，&lt;code&gt;clamp()&lt;/code&gt; 的流体值中务必包含 &lt;code&gt;rem&lt;/code&gt; 项以确保缩放无障碍性。&lt;br /&gt;&lt;br /&gt;7. 交互式学习体验：每个单位都配有可拖拽、可滑动的实时演示，直接在浏览器中观察单位变化效果，将抽象概念转化为直观体验，并支持下载完整 PDF 离线阅读。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://cssunits.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://cssunits.com/&quot;&gt;https://cssunits.com/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://cssunits.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;A complete interactive reference to every CSS measurement unit. From the basics of px and rem to the nuances of svh, dvh, and cqw.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;CSS Units&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;CSS Units — The Complete Reference&quot; src=&quot;/static/https://cdn4.telesco.pe/file/AT6h8pjfCkp_NRrPaD5TkS-87t7UrKQHXNF-NoWZhC1pDd2HlAyJu29y8zrNUSI82Uu4vmjOKmJ65DbVIkgB6uqrGGa-ZuTI3f-39CT-anyXVvjvGsSdF_tocD3xH_AiGgJd3mLLtOLdqEeHS5nz7RYNXG7MzBU1uUM26Jj87nW5fExS5Wf2N0XTxn_zUVx8joWV_wnZmH10otZqAeKHqBiqwtXjV-99EFtl3BiB1VU9OPiiBARJAypdJ9hDcE8Ys3fDSdSXMKR8GPU6Ruy0DvDyvBoyp59ibi5_PX-X4KQrI0-ZueMxN-GdN_e5wlBs2MbhxplSQWiuq8cov38NdQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;CSS Units — The Complete Reference&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;A complete interactive reference to every CSS measurement unit. From the basics of px and rem to the nuances of svh, dvh, and cqw.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《hucre：零依赖的电子表格引擎》</title><link>https://channel.meo-ai.com/posts/693</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/693</guid><pubDate>Sat, 15 Aug 2026 13:03:55 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《hucre：零依赖的电子表格引擎》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%94%B5%E5%AD%90%E8%A1%A8%E6%A0%BC&quot; title=&quot;#电子表格&quot;&gt;#电子表格&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Xlsx&quot; title=&quot;#Xlsx&quot;&gt;#Xlsx&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Csv&quot; title=&quot;#Csv&quot;&gt;#Csv&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Ods&quot; title=&quot;#Ods&quot;&gt;#Ods&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E8%BD%AC%E6%8D%A2&quot; title=&quot;#数据转换&quot;&gt;#数据转换&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9B%B6%E4%BE%9D%E8%B5%96&quot; title=&quot;#零依赖&quot;&gt;#零依赖&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%81%E5%BC%8F%E5%A4%84%E7%90%86&quot; title=&quot;#流式处理&quot;&gt;#流式处理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81&quot; title=&quot;#数据验证&quot;&gt;#数据验证&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE&quot; title=&quot;#无障碍访问&quot;&gt;#无障碍访问&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 核心定位：一个纯 TypeScript 编写的零依赖电子表格引擎，支持读写 XLSX、CSV、ODS、JSON、NDJSON、XML、HTML 等多种格式，可在 Node.js、Deno、Bun、浏览器、Cloudflare Workers 等任意平台运行&lt;br /&gt;2. 极致轻量：完全支持 Tree Shaking，按需导入，CSV 模块仅 3.7KB gzip，完整库 129KB gzip，远小于 SheetJS（300KB）和 ExcelJS（500KB）&lt;br /&gt;3. 多格式统一 API：通过 &lt;code&gt;read()&lt;/code&gt; 自动检测格式，&lt;code&gt;write()&lt;/code&gt; 支持 9 种输出格式（XLSX、ODS、CSV、TSV、JSON、NDJSON、XML、HTML、Markdown），大幅降低多格式处理的心智负担&lt;br /&gt;4. 流式处理：支持 XLSX、CSV、NDJSON、ODS、XML 的流式读写，可处理百万级数据而不爆内存；300万行 XLSX 流式写入峰值内存仅 70MB，而增量写入器需要 1GB+&lt;br /&gt;5. 功能全面：支持单元格样式、条件格式（13 种）、数据验证、超链接、图片（含 SVG）、图表（柱状/折线/饼图等）、数据透视表、迷你图、冻结窗格、密码保护、Excel 2024 原生复选框、模板引擎等&lt;br /&gt;6. 往返保真：&lt;code&gt;openXlsx&lt;/code&gt;/&lt;code&gt;saveXlsx&lt;/code&gt; 路径可保留图表、VBA 宏、切片器、时间线过滤器等 hucre 不原生建模的部分，实现无损编辑他人文件&lt;br /&gt;7. 数据验证与无障碍：内置 Schema 验证（类型强制、正则、枚举、范围），以及 WCAG 2.1 AA 无障碍审计（对比度检查、缺失替代文本、表头检测等）&lt;br /&gt;8. 遗留格式支持：可读取 XLS（Excel 97-2003）和 XLSB（二进制 Excel）文件，自动检测格式&lt;br /&gt;9. 开发体验友好：提供 Builder API 链式调用、对象简写读写（&lt;code&gt;readObjects&lt;/code&gt;/&lt;code&gt;writeObjects&lt;/code&gt;）、CLI 工具（格式转换、检查、验证）、单元格工具函数（行列转换、范围解析）&lt;br /&gt;10. 明确的能力边界：不实现公式计算引擎、不支持 XLS/XLSB 写入、部分高级图表类型（气泡图/雷达图等）仅支持读取和往返、流式 ODS 写入不带样式&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://github.com/productdevbook/hucre&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/productdevbook/hucre&quot;&gt;https://github.com/productdevbook/hucre&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/productdevbook/hucre&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere. - productdevbook/hucre&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;GitHub&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;GitHub - productdevbook/hucre: Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere.&quot; src=&quot;/static/https://cdn4.telesco.pe/file/MJcnXpxpA3YeVtM-Tm5vhddBRePR-Iiy7xQfjh0W5GjjXgCWMvURyaufUW9XrSUFu02S0RODegcGhxzJ8HSISdwFSgv4a3ZhHWQJuOCC0qQuH0EdyatC4ZEy9_nZr6TzfooahohpRRD0QcWrIVL9EWMiCMDY0Cpm3XNUlGuaMc8u5o_98ecZ4Q7GsDla-h9Up2ChebVJ1WQy-Vq7GbaRMHNkCHX5q7_j_U4iwkdmPXJQvtJ1kyKJR7WBdVWyhk8tHITkfV5Xbmqyx6yhd-hXxyunomCEXs7BP3-HQw1s58YG6x6X-G47h9t2AxaRD-TviTPWDoEAMjETvPLU2YOtQA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;GitHub - productdevbook/hucre: Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere.&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere. - productdevbook/hucre&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《别在 div 和 span 上乱加 aria-label》</title><link>https://channel.meo-ai.com/posts/649</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/649</guid><pubDate>Sat, 30 May 2026 00:06:23 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《别在 div 和 span 上乱加 aria-label》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E6%97%A0%E9%9A%9C%E7%A2%8D&quot; title=&quot;#Web无障碍&quot;&gt;#Web无障碍&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ARIA&quot; title=&quot;#ARIA&quot;&gt;#ARIA&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%B1%8F%E5%B9%95%E9%98%85%E8%AF%BB%E5%99%A8&quot; title=&quot;#屏幕阅读器&quot;&gt;#屏幕阅读器&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HTML%E8%AF%AD%E4%B9%89%E5%8C%96&quot; title=&quot;#HTML语义化&quot;&gt;#HTML语义化&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;本文通过实测数据揭示了在 div、span 等 generic 角色元素上使用 aria-label 的严重兼容性问题。ARIA 规范明确禁止为 generic 角色命名，而各屏幕阅读器的表现更是天差地别——有的只读标签、有的只读内容、有的两者都读、有的干脆忽略。这种不一致会让依赖辅助技术的用户获得错误信息，属于典型的&quot;好心办坏事&quot;。作者指出 section 和 popover 是例外，前者加标签会自动升级为 region 地标，后者角色会变为 group。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. ARIA 规范 &lt;a href=&quot;http://5.2.8.6/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;5.2.8.6&quot;&gt;5.2.8.6&lt;/a&gt; 明确把 generic 角色列入&quot;禁止命名&quot;清单，div 和 span 默认就是这个角色&lt;br /&gt;2. 实测 8 组屏幕阅读器+浏览器组合，对带 aria-label 的 div  announcement 结果五花八门：VoiceOver 读&quot;News, group&quot;、TalkBack 只读&quot;News&quot;、JAWS/NVDA 完全忽略标签只读内容&lt;br /&gt;3. 空 div 的测试结果更混乱，有的读&quot;News, empty group&quot;、有的完全静默，无法预测用户会听到什么&lt;br /&gt;4. 这种不可预测性对屏幕阅读器用户是灾难性的——你以为在帮忙标注，实际上可能覆盖了真正有用的内容&lt;br /&gt;5. 例外情况：section 元素加 aria-label 会自动从 generic 升级为 region 地标，这是规范允许的；带 popover 属性的 div 角色会变为 group，加标签也合法&lt;br /&gt;6. 正确做法：需要可访问名称时，优先使用语义化标签（如 button、nav）或显式设置 role，而不是在裸 div 上硬塞 aria-label&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://www.matuzo.at/blog/2026/aria-label-generic-elements&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://www.matuzo.at/blog/2026/aria-label-generic-elements&quot;&gt;https://www.matuzo.at/blog/2026/aria-label-generic-elements&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://matuzo.at/blog/2026/aria-label-generic-elements&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;I&apos;m a frontend developer in Graz, specialized in HTML, accessibility, and CSS layout and architecture.&quot;&gt;
  &lt;i class=&quot;link_preview_right_image&quot; style=&quot;background-image:url(&apos;https://cdn4.telesco.pe/file/p0IER_q1w75MSZ-YvgxY707xXQABFo1FO7gNKQ9GDFMNep8C1rCuHPBZ9IQ5ktQ8IHcQptsm0gkr-holxUDLtxw9rG36qkzcW-mVicPJUyOQDep_xS0ad_ryKGv1-Yt2JEn5V6rl_Gv4foEPeQbH7GjSyvpd9YtaBvo93km2ejhiPByO0H-iD9XnnIFvxTZVA2f7UC3PwBZMltyRN9OSZ2FZCanTFSjZrc5hvcTrSezPEWno5g3-3K29y-ZZQ2UHT0ELUDhGU36T_xwicCDlsalacRx2dHIA8KVOHhfq1kx7QeeWpbHtGlJVOT4zyoVfYmniYLgiJN8v-Dp0dvty5w.jpg&apos;)&quot;&gt;&lt;/i&gt;
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Manuel Matuzovic&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Don&apos;t put aria-label on generic elements like divs&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;I&apos;m a frontend developer in Graz, specialized in HTML, accessibility, and CSS layout and architecture.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>