前端可访问性:别让你的网站对某些人关闭大门

前端可访问性:别让你的网站对某些人关闭大门

毒舌时刻

这网站做的跟迷宫似的,正常人都找不到路,更别说有障碍的人了。

各位前端同行,咱们今天聊聊前端可访问性。别告诉我你还在忽略可访问性,那感觉就像在公共建筑里不建无障碍通道——能进,但不是所有人都能进。

为什么你需要关注可访问性

最近看到一个项目,按钮没有焦点状态,表单没有标签,屏幕阅读器根本无法正常工作。我就想问:你是在做网站还是在做密室逃脱?

反面教材

// 反面教材:忽略可访问性 function App() { return ( <div> <h1>我的网站</h1> <div> <input type="text" placeholder="用户名" /> <input type="password" placeholder="密码" /> <button>登录</button> </div> <div> <img src="logo.png" /> <a href="#">关于我们</a> <a href="#">联系我们</a> </div> </div> ); } export default App; 

毒舌点评:这代码,就像在黑暗中摸索,什么都看不见。

正确姿势

1. 语义化 HTML

// 正确姿势:语义化 HTML function App() { return ( <div> <header> <h1>我的网站</h1> </header> <main> <form> <div> <label htmlFor="username">用户名</label> <input type="text" aria-label="用户名" /> </div> <div> <label htmlFor="password">密码</label> <input type="password" aria-label="密码" /> </div> <button type="submit" aria-label="登录">登录</button> </form> </main> <footer> <img src="logo.png" alt="网站 logo" /> <nav> <ul> <li><a href="#">关于我们</a></li> <li><a href="#">联系我们</a></li> </ul> </nav> </footer> </div> ); } export default App; 

2. ARIA 标签

// 正确姿势:使用 ARIA 标签 function App() { const [expanded, setExpanded] = React.useState(false); return ( <div> <button aria-expanded={expanded} aria-controls="menu" onClick={() => setExpanded(!expanded)} > 菜单 </button> <nav aria-hidden={!expanded}> <ul> <li><a href="#">首页</a></li> <li><a href="#">关于我们</a></li> <li><a href="#">联系我们</a></li> </ul> </nav> </div> ); } export default App; 

3. 键盘导航

// 正确姿势:键盘导航 function App() { const [focused, setFocused] = React.useState(0); const items = ['首页', '关于我们', '联系我们', '服务']; const handleKeyDown = (e) => { if (e.key === 'ArrowRight') { setFocused((prev) => (prev + 1) % items.length); } else if (e.key === 'ArrowLeft') { setFocused((prev) => (prev - 1 + items.length) % items.length); } }; return ( <nav onKeyDown={handleKeyDown} tabIndex={0}> <ul> {items.map((item, index) => ( <li key={index}> <a href="#" tabIndex={-1} style={{ outline: index === focused ? '2px solid blue' : 'none', backgroundColor: index === focused ? '#e0e0e0' : 'transparent' }} onClick={() => setFocused(index)} > {item} </a> </li> ))} </ul> </nav> ); } export default App; 

4. 颜色对比度

/* 正确姿势:颜色对比度 */ /* styles.css */ body { color: #333333; /* 深色文本 */ background-color: #ffffff; /* 浅色背景 */ } a { color: #0066cc; /* 蓝色链接,对比度高 */ text-decoration: none; } a:hover { color: #004499; text-decoration: underline; } button { background-color: #0066cc; color: #ffffff; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; } button:hover { background-color: #004499; } 

毒舌点评:这才叫可访问性,让所有人都能平等地使用你的网站。

Read more

【Windows安装openclaw,配置qwen模型和ollama本地模型,飞书群组添加机器人】

【Windows安装openclaw,配置qwen模型和ollama本地模型,飞书群组添加机器人】

Windows11安装OpenClaw,配置千问Qwen模型及配置服务器本地模型Ollama,接入飞书机器人 * 第一步、安装Nodejs * 第二步、安装Git * 第三步、安装Openclaw * 配置本地大模型 * 第四步、配置飞书 第一步、安装Nodejs 1、减少后续各种报错情况,先安装Nodejs,下载地址:https://nodejs.org/zh-cn/download,选择对应操作系统,24版本太新,有些依赖不适配,本文选择22.22.0版本,node-v22.22.0-x64.msi 直接双击安装即可。 2、安装完成看一下版本信息,用管理员权限打开win的PowerShell 3、执行 node -v 第二步、安装Git 1、安装Git 访问地址 https://git-scm.com/install/

FPGA Transformer加速完全指南:从模型优化到硬件实现(附实战案例)

🚀 FPGA Transformer加速完全指南:从模型优化到硬件实现(附实战案例) 📚 目录导航 文章目录 * 🚀 FPGA Transformer加速完全指南:从模型优化到硬件实现(附实战案例) * 📚 目录导航 * 概述 * 第一部分:Transformer基础与FPGA加速价值定位 * 1.1 Transformer架构概览 * 1.1.1 Transformer的基本结构 * 1.1.2 Transformer的关键特性 * 1.1.3 常见的Transformer变体 * 1.2 Transformer推理的挑战 * 1.2.1 计算复杂度分析 * 1.2.2 内存访问瓶颈 * 1.2.3 非线性操作的挑战 * 1.2.4 推理延迟分析 * 1.3

2023年电赛H题(信号分离装置)-FPGA+stm32解法

2023年电赛H题(信号分离装置)-FPGA+stm32解法

目录 前言 题目 解题思路 基本框架 代码思路 第一部分(FPGA的FIFO以及串口发送接收) 1.FIFO 2.(FPGA串口发送) 3.FPGA串口接收 4.总结 第二部分(stm32接收数据进行FFT识别波形以及频率并发送) 1.stm32串口接收 2.stm32进行FFT 3.stm32串口发送 第三部分(FPGA得到波形与频率后生成波形) 第四部分(FPGA锁相) 1.鉴相 2.环路滤波 3.反馈 第五部分(DAC输出) 第六部分(移相) 1.按键消抖 2.按键设置相位差 3.数码管显示相位 第七部分(FPGA代码总结) 后记 前言 本文章除开要求一使用的增益为一的加法器以外,其余皆由FPGA+

【花雕学编程】Arduino BLDC 之模糊动态任务调度机器人

【花雕学编程】Arduino BLDC 之模糊动态任务调度机器人

基于 Arduino 的 BLDC 模糊动态任务调度机器人,是一种将模糊逻辑控制理论应用于机器人多任务管理与执行机构(BLDC 电机)协同控制的智能系统。该方案的核心在于解决传统基于固定优先级或时间片轮转的调度算法在面对非结构化环境时,对“不确定性”和“实时性”处理能力不足的问题。 1、主要特点 模糊逻辑驱动的优先级动态仲裁 这是系统区别于传统实时操作系统的核心,它将离散的“任务优先级”转化为连续的“任务紧迫度”。 * 多输入变量融合: 系统不再仅依据任务注册的时间或预设的静态优先级来调度,而是将传感器数据(如障碍物距离、电池电量、目标接近度)作为模糊输入变量。 * 语言值描述与规则库: 通过定义“很近”、“较远”、“极低”、“正常”等模糊集合,将数值型数据转化为语言型描述。例如,规则库中可定义:“如果前方障碍物距离为‘很近’且电池电量为‘充足’,则避障任务的优先级为‘最高’,巡航任务的优先级为‘零’”。 * 平滑的优先级过渡: 相较于传统算法中任务优先级的“