HTML 常见属性

HTML 元素的属性是用于控制元素行为或样式的附加信息。 以下是一些常见的 HTML 属性: 1. 通用属性(Global Attributes) 这些属性几乎可以应用于所有 HTML 元素: id:元素的唯一标识符,用于 JavaScript 或 CSS 选择。 <div id="main"></div> class:为元素指定一个或多个类名,用于 CSS 样式或 JavaScript 操作。 <div class="container header"></div> style:为元素设置内联样式。 <div style="color: red;"></div> title:为元素提供额外信息,当鼠标悬停在元素上时显示。 <button title="Click me!">Click</button> data-*:自定义属性,用于存储私有数据,以 data- 为前缀,可以通过 JavaScript 访问。 <div data-user-id="123"></div> 2. 事件属性(Event Attributes) 这些属性用于处理元素上的事件: onclick:定义单击事件处理函数。 <button onclick="alert('Clicked!')">Click me</button> onmouseover:鼠标悬停时触发的事件。 <div onmouseover="console.log('Mouse over')"></div> onkeydown:按下键盘时触发的事件。 <input type="text" onkeydown="handleKeyDown(event)"> 3. 表单相关属性 type:定义输入框类型,例如 text、password、email 等。 <input type="text"> name:定义表单元素的名称,用于表单提交。 <input type="text" name="username"> value:定义表单元素的默认值。 <input type="text" value="Default value"> placeholder:为输入框提供占位符文本,提示用户输入。 <input type="text" placeholder="Enter your name"> disabled:禁用输入元素,使其不可交互。 <input type="text" disabled> required:标记表单元素为必填项。 <input type="text" required> 4. 链接和资源加载属性 href:用于指定超链接的目标 URL。 <a href="https://example.com">Go to example.com</a> src:指定图像、脚本或其他资源的路径。 <img src="image.jpg" alt="Image description"> alt:为图像提供替代文本,图像无法加载时显示。 <img src="image.jpg" alt="Alternative text"> rel:指定链接与目标文档的关系,常用于 link 标签和 a 标签。 <link rel="stylesheet" href="style.css"> target:定义链接的打开方式,常用值包括 _self(当前窗口)和 _blank(新窗口)。 <a href="https://example.com" target="_blank">Open in new tab</a> 5. 多媒体属性 controls:为 <audio> 或 <video> 元素添加播放控件。 <video src="video.mp4" controls></video> autoplay:自动播放音频或视频。 <audio src="audio.mp3" autoplay></audio> loop:音频或视频播放完后重新开始播放。 <video src="video.mp4" loop></video> muted:自动静音视频或音频。 <audio src="audio.mp3" muted></audio> 6. 图像和媒体相关属性 width 和 height:定义图像或视频的宽度和高度。 <img src="image.jpg" width="200" height="100"> 7. iframe 属性 src:定义嵌入的网页 URL。 <iframe src="https://example.com"></iframe> sandbox:为嵌入内容提供更严格的限制,控制 iframe 的行为。 <iframe src="https://example.com" sandbox></iframe> 8. 语义化属性 role:为屏幕阅读器和辅助技术提供语义化描述。 <div role="navigation"></div> 9. 布局和可访问性属性 hidden:隐藏元素,元素不会显示在页面中。 <div hidden>This content is hidden</div> tabindex:定义元素的 tab 键导航顺序。 <button tabindex="1">First</button> <button tabindex="2">Second</button> 常见考点 1. 全局属性(Global Attributes) class:用于给元素指定样式类,如何使用多个类?有哪些常见用法? id:唯一标识元素,id 的作用和注意事项。 style:内联样式的作用及其优先级。 title:为元素提供额外信息(鼠标悬停时显示)。 data- 属性*:自定义数据属性,如何在 JavaScript 中访问 data-* 属性? 2. 事件属性(Event Attributes) onclick、onmouseover 等事件处理属性。 如何使用事件属性进行事件绑定? 事件属性和 JavaScript 事件监听器(addEventListener)的区别和应用场景。 3. 表单属性 name:用于提交表单数据时作为键名。 action:表单提交的目标 URL。 method:表单的提交方式(GET 或 POST)。 autocomplete:是否启用表单自动填充。 required、pattern、min/max 等 HTML5 校验属性。 4. 输入控件相关属性 value:为输入控件设置默认值。 placeholder:为输入框提供提示文本。 disabled:禁用输入控件。 readonly:只读属性,控件不能被修改。 maxlength/minlength:输入字符长度的限制。 accept:文件上传时,限制允许的文件类型(适用于 <input type="file">)。 5. 媒体元素属性 src:媒体文件的路径(适用于 <img>、<audio>、<video> 等)。 alt:图片无法加载时显示的替代文本。 controls:是否为媒体文件显示默认控制条。 autoplay:媒体文件是否自动播放。 loop:媒体文件是否循环播放。 muted:媒体文件是否静音。 6. 超链接相关属性 href:链接目标的 URL。 target:定义链接打开的方式(如 _blank 打开新窗口)。 download:允许下载链接资源,而不是导航到资源。 rel:定义链接与当前文档的关系(如 nofollow、noopener)。 7. iframe 属性 src:嵌入的文档或网页的 URL。 sandbox:启用或禁用特定行为(如禁止脚本、表单提交等)。 allow:控制 iframe 内的权限(如允许摄像头、麦克风访问)。 8. 图像和图形属性 srcset:为不同设备提供不同分辨率的图像资源。 sizes:配合 srcset,定义不同视口下图像显示的尺寸。 usemap:指定图片使用的图像映射。 height/width:定义图片或其他元素的高度和宽度。 9. meta 标签属性 charset:指定文档的字符编码(如 UTF-8)。 name 和 content:为文档提供元信息(如 description, viewport)。 http-equiv:配合 content,定义 HTTP 头信息(如 refresh, Content-Type)。 10. 无障碍相关属性 aria- 属性*:为无障碍工具(如屏幕阅读器)提供更多语义信息。 role:指定元素的功能角色,增强无障碍性。 11. iframe 和图片的懒加载 loading=“lazy”:为图片和 iframe 启用懒加载。 12. 语言和方向属性 lang:指定元素或页面的语言(如 lang="en")。 dir:指定文本的书写方向(如 ltr 左到右,rtl 右到左)。

October 15, 2024

font

什么是 font 属性? 在CSS中, font 属性是一个简写属性,用于设置字体的多个相关属性,包括字体大小、字体样式、字体粗细、字体系列等。使用 font 属性可以方便地在一个声明中设置多个字体相关的样式。 font 属性的语法 font: [font-style] [font-variant] [font-weight] [font-size] [line-height] [font-family]; 各个属性的详细说明 font-style:设置字体的样式。 取值: normal:正常字体(默认值)。 italic:斜体字。 oblique:倾斜字体。 font-variant:设置字体的变体。 取值: normal:正常(默认值)。 small-caps:小型大写字母。 font-weight:设置字体的粗细。 取值: normal:正常粗细(默认值)。 bold:加粗。 bolder:比父元素更粗。 lighter:比父元素更细。 数值:可以使用 100 到 900 的数值,100 为最细,900 为最粗。 font-size:设置字体的大小。 取值: 可以使用绝对单位(如 px、 pt)或相对单位(如 em、 rem、 %)。 line-height:设置行高。 取值: 可以使用数值、单位(如 px、 em)或百分比。 font-family:设置字体系列。 取值: 可以指定多个字体名称,以逗号分隔,浏览器将使用第一个可用的字体。 例如: "Arial", "Helvetica", sans-serif。 使用 font 属性的注意事项 font 属性必须按照特定的顺序书写,尤其是 font-size 和 font-family,它们是必需的。 如果使用 font 属性,其他相关的字体属性(如 font-size 和 font-family)不能单独设置。 实例:使用 font 属性设置文本样式 HTML 代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Font 属性示例</title> <link rel="stylesheet" href="styles.css"> </head> <body> <h1 class="title">欢迎来到我的网站</h1> <p class="description">这是一个关于CSS字体属性的示例,展示如何使用font属性设置文本样式。</p> </body> </html> CSS 代码(styles.css) body { font-family: Arial, sans-serif; /* 设置全局字体 */ } .title { font: bold 24px/1.5 "Helvetica Neue", Arial, sans-serif; /* 设置标题字体样式 */ color: #333; /* 字体颜色 */ } .description { font: italic normal 16px/1.8 "Georgia", serif; /* 设置描述文本字体样式 */ color: #666; /* 字体颜色 */ } 解释 HTML结构:我们创建了一个包含标题和描述的简单网页。 CSS样式: 在 .title 类中,使用 font 属性设置了字体为加粗、24px大、行高为1.5、字体系列为 "Helvetica Neue",后备字体为 Arial 和无衬线字体。 在 .description 类中,使用 font 属性设置了字体为斜体、正常粗细、16px大、行高为1.8、字体系列为 "Georgia",后备字体为衬线字体。 结果 通过以上代码,浏览器将展示一个标题和描述文本,标题为加粗大字体,描述为斜体较小字体。这样可以清晰地展示不同文本的样式和视觉层次感。 ...

October 10, 2024

侦听器watch

一、 watch API 我们先看看 watch的使用例子,watch 有多种用法,可以接收多种类型参数: import { reactive, watch } from 'vue' // 1. 传入getter函数 const state = reactive({ count: 0 }) watch(() => state.count, (count, prevCount) => { // 当 state.count 更新,会触发此回调函数 }) // 2. 传入reactive对象 watch(state, (count, prevCount) => { // 当 state.count 更新,会触发此回调函数 }) // 3. 传入ref对象 const stateRef = ref(0) watch(stateRef, (count, prevCount) => { // 当 stateRef.value 更新,会触发此回调函数 }) // 4.监听多个数据源,回调函数接受两个数组,分别对应来源数组中的新值和旧值: watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => { /* ... */ }) 从上面的例子可以看到,对于 watch,它能接收的第一个参数类型非常多。 你可以传入一个ref对象、一个响应式对象、一个 getter 函数、甚至是一个数组。 我们在上一篇中知道了computed对象其内部是借助了 effect函数 创建了一个 reactiveEffect函数,在访问computed对象的值时,执行其 runner函数 求值。 ...

October 4, 2024

第三方库的安全

从一个安全漏洞说起 Lodash 是一款非常流行的 npm 库,每月的下载量超过 8000 万次,GitHub 上使用它的项目有超过 400 万。之前有段时间, Lodash 的一个安全漏洞刷爆了朋友圈,我们先来回忆下这个安全漏洞: 攻击者可以通过 Lodash 的一些函数覆盖或污染应用程序。例如:通过 Lodash 库中的函数 defaultsDeep 可以修改 Object.prototype 的属性。 我们都知道,JavaScript 在读取对象中的某个属性时,如果查找不到就会去其原型链上查找。试想一下,如果被修改的属性是 toString 方法: const payload = '{"constructor": {"prototype": {"toString": true}}}' _.defaultsDeep({}, JSON.parse(payload)) 每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 [object type],其中 type 是对象的类型。如果覆盖了 toString() 方法,那么给应用带来的影响就是非常大的。 其实上述的问题就属于一个很常见的安全漏洞 —— 原型污染 原型污染:攻击者通过某种手段修改 JavaScript 对象的原型(prototype) 然而这并不是 Lodash 第一次爆出安全漏洞了。事实上,像这样的安全漏洞还可能存在于我们使用的千千万万个不同的开源依赖中,如果我们平时不重视他们,一旦出现问题对我们的项目造成的损失是不可估计的。这相当于你的项目中埋着很多不知道什么时候就会爆炸的炸弹。 安全调查 其实开发人员对开源代码的安全性的信任程度要大于对自己编写的代码的安全性的信任程度,但是在确保代码安全性和质量的工具还有很多不足之处。在 npm 还没有一个完善的安全检测机制之前,npm 和 NodeJs 团队曾经对数万名 JavaScript 开发者发起过一个调查,第一个问题就是安全问题,具体就是开发人员如何看待他们编写的代码和所使用的开源项目的安全性。 调查结果显示:全球 97% 的 JavaScript 开发人员在自己开发的项目中都依赖开源代码,77% 的开发人员对他们使用的开源代码是否安全表示担忧。更有趣的是,有 87% 的人表示担心自己的代码的安全性。 ...

October 2, 2024

解构赋值

解构赋值概念 解构赋值语法是一种 Javascript 表达式。 通过解构赋值,可以将属性/值从对象/数组中取出,赋值给其他变量。 解构赋值是通过将结构中的各元素复制到变量中来达到“解构”的目的。但对象/数组本身不会被修改。 数组解构 基本使用 📖 可以在定义变量的同时,使用解构进行赋值 let [one, two, three] = foo; //等同于 let one = foo[0]; let two = foo[1]; let three = foo[2]; 📖 也可以先声明变量,在进行解构赋值 设置默认值 当【左边≠右边】时,可以先设置一个默认值,否则取不到值的变量会变成undefined 剩余值处理 可以使用三个点 "..."+ 参数来接收剩余的所有元素,变量名称随意,必须在最后一个参数的位置上 进阶用法 🎨 可以和split 函数结合使用,比如 let [Mother,Father] = "judy,pete".split(','); console.log(Mother) //judy console.log(Father) //pete 🎨 可以使用逗号忽略元素,比如 let [name1,,name3] = ["Julius01", "Caesar02", "Consul03"] 🎨 可以直接赋值给对象的属性,比如 let user = {}; [user.name, user.surname] = ["Ilya","Kantor"] ...

October 2, 2024

Harness Engineering 精读笔记

基于 2025.11 — 2026.03 期间 Anthropic、OpenAI、LangChain、Google DeepMind、Stanford 发布的九篇核心文章的精读整理。 目标:理解 Harness Engineering 是什么,以及大公司和学术机构在实践中做了哪些探索。 一、什么是 Harness Engineering? 1.1 Harness 的定义 LangChain 给出了最清晰的公式化定义: Agent = Model + Harness “If you’re not the model, you’re the harness.” “A harness is every piece of code, configuration, and execution logic that isn’t the model itself.” 具体来说,Harness 包括: System Prompts — 系统提示词,定义 Agent 的行为边界 Tools / Skills / MCPs — 工具集及其描述(文件读写、代码执行、浏览器操作等) Bundled Infrastructure — 捆绑基础设施(文件系统、沙箱、浏览器) Orchestration Logic — 编排逻辑(子 Agent 派生、任务交接、模型路由) Hooks / Middleware — 确定性执行逻辑(压缩、续行、lint 检查等) Anthropic 不给 Harness 下抽象定义,而是通过实践来展示:他们用 “harness design” 和 “harnesses for long-running agents” 来描述围绕 Agent 执行循环的编排层。Anthropic 在博客中明确说:“harness design is key to performance at the frontier of agentic coding”。 ...

May 2, 2026

iOS无障碍树详解

前言 打开 iPhone 的"设置 → 辅助功能 → 旁白(VoiceOver)",再用三指在屏幕上滑动,iPhone 就会逐个读出当前界面上的每个控件:"登录按钮,双击以激活"、"用户名,文本框,已填写 ancheng"、"价格,¥99"。这背后支撑 VoiceOver、开关控制(Switch Control)、语音控制(Voice Control)、全键盘访问(Full Keyboard Access)、Xcode UITest、AI Agent 识屏 等一系列能力的,是一棵并行于 UIView 视图树的 无障碍树(Accessibility Tree,AX Tree)。 对大多数 iOS 工程师来说,无障碍树是"黑盒":设了 isAccessibilityElement = true、填了 accessibilityLabel,然后就不管了。但一旦遇到以下问题,就不得不深入理解它的工作机制: 为什么 UITest 里用 XCUIElement 定位不到某个按钮? 为什么打开 VoiceOver 后 App 明显变卡? 为什么一个自绘的 CALayer 按钮在 VoiceOver 下无法被朗读? 为什么 UILabel 嵌在 UIStackView 里焦点顺序是乱的? SwiftUI 的 .accessibilityElement(children: .combine) 到底合并了什么? Accessibility Inspector 里看到的树结构从哪儿来? AI Agent(如 iOS 上的 Claude、ChatGPT Mac 客户端)是如何"看到"屏幕的? 本文从操作系统层的 AX 架构讲起,逐层拆解:AX Server 守护进程、UIKit 中的 UIAccessibility 协议、UIAccessibilityElement 类、UIAccessibilityContainer 协议、焦点排序算法、SwiftUI 的 AX 实现、辅助技术的工作原理、性能优化、UITest 与 AI 识屏原理、调试工具与最佳实践。 ...

May 2, 2026

Mach-O的链接、装载与库

本文深入介绍iOS/macOS开发中的Mach-O文件格式、动态库与静态库,帮助理解程序的链接、装载过程,以及Rebase/Bind的底层原理。 一、基础概念 在深入学习之前,先了解几个核心概念。 1.0 从源代码到可执行文件 一段源代码要变成可执行文件,需要经历以下几个阶段: flowchart TB A["源代码 (.m/.swift)"] --> B["预处理展开宏、处理#import/#include"] B --> C["编译源代码 → 汇编代码"] C --> D["汇编汇编代码 → 目标文件(.o)"] D --> E["链接目标文件 + 库 → 可执行文件"] E --> F["可执行文件"] 1.1 什么是符号(Symbol) 符号是程序中函数、变量、类等实体的名称标识。当你写下一个函数调用时,编译器需要知道这个函数在哪里,符号就是用来定位它的。 // 这段代码中包含多个符号 void myFunction(void) { // 定义了符号 _myFunction NSLog(@"Hello"); // 引用了外部符号 _NSLog } int globalVar = 10; // 定义了符号 _globalVar 符号分为两类: 已定义符号:在当前编译单元(即当前源文件编译生成的.o文件)中有具体代码或数据定义的符号(如上例中的 _myFunction 和 _globalVar) 未定义符号:当前编译单元只是引用,实际定义在其他编译单元或库中的符号(如上例中的 _NSLog),需要在链接时解析 1.2 什么是链接(Linking) 链接是将多个编译后的目标文件(.o)组合成一个可执行文件的过程。链接器的核心工作是符号解析——把所有"未定义符号"与其他编译单元中的"已定义符号"关联起来。 flowchart LR subgraph 输入 A["main.o已定义: _main未定义: _foo"] B["foo.o已定义: _foo未定义: _NSLog"] C["Foundation已定义: _NSLog"] end A --> D["链接器符号解析"] B --> D C --> D D --> E["可执行文件所有符号已解析"] 符号解析的过程 链接器会遍历所有输入的目标文件和库,执行以下步骤: ...

May 2, 2026

建造者模式

定义 建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。建造者模式特别适用于创建包含多个可选参数的对象。 建造者模式的核心思想是:将一个复杂对象的构建过程分解为多个简单的步骤,通过一步一步地构建,最终得到完整的对象。 为什么需要建造者模式 建造者模式要解决的核心问题是:简化复杂对象的创建过程,特别是当对象有很多可选参数时。 问题场景:假设我们需要创建一个网络请求配置对象,它有很多可选参数。 使用构造函数的方式: struct NetworkConfig { let baseURL: URL let timeout: TimeInterval let retryCount: Int let cachePolicy: CachePolicy let headers: [String: String] let enableLogging: Bool let certificatePinning: Bool // 构造函数参数太多! init(baseURL: URL, timeout: TimeInterval = 30, retryCount: Int = 3, cachePolicy: CachePolicy = .default, headers: [String: String] = [:], enableLogging: Bool = false, certificatePinning: Bool = false) { // ... } } // 使用时 - 参数太多,难以阅读 let config = NetworkConfig( baseURL: URL(string: "https://api.example.com")!, timeout: 60, retryCount: 5, cachePolicy: .reloadIgnoringCache, headers: ["Authorization": "Bearer token"], enableLogging: true, certificatePinning: true ) 这种方式有什么问题? ...

May 2, 2026

代码规范工程化

规范化是前端工程化的一个重要部分。现在,有许多工具能够辅助我们实行代码的规范化,比如你一定知道的 ESLint 和 Prettier。 今天,来聊聊这些工具的工作原理和基本使用,了解它们是如何发挥作用的,以及如何更好地利用这些工具去规范项目的代码。 1. ESlint - 检查你的 JavaScript 代码 让我们先从知名度最高的 ESLint 开始。 1.1. ESLint 及其作用 Lint 是一类专门用于检查代码的工具软件, 也称 linter。ESLint ,即 JavaScript (ECMAScript)代码的检查工具。 正如官网的介绍 —— “Find and fix problems in your JavaScript code”,ESLint 能够辅助查找出你的 JavaScript 代码中的问题,包括: 代码风格问题(styles)。比如,运算符两边的空格、语句末尾的分号。 不好的写法。比如,使用 == 进行比较而不是 ===。 可能存在逻辑问题的代码模式。比如,定义了一个变量,但没有使用到它。 此外,ESLint 还能够帮你自动修复一些简单的问题。 我们将在下一小结学习如何使用 ESLint 检查我们的 JavaScript 代码,并修复其中的一些问题。 1.2. ESLint 快速上手 为了在项目中使用 ESLint,需要先安装它。 # 初始化一个 npm 项目 mkdir eslint-test cd eslint-test npm init -y # 安装 eslint npm init @eslint/config 回答一系列问题后,你可以看目录中的配置文件 .eslintrc.js,这个配置文件告诉 ESLint 如何去解析项目,这个项目采用了哪些规范和规则。 ...

August 7, 2025