html自定义标签无原生属性行为、不继承表单特性、无默认样式,需手动实现attributechangedcallback、扩展内置元素、显式设置display及无障碍支持。

HTML 自定义标签不能直接加属性或样式——浏览器不认识它,会当普通未知元素处理,连默认样式都没有,更别提绑定事件或读取 dataset。
为什么 <my-button></my-button> 写了 disabled 也没用
原生 HTML 元素(如 <button></button>)的布尔属性(disabled、hidden)有内置行为逻辑;自定义标签只是空壳,disabled 属性会被解析并存在 DOM 上,但不会触发任何效果——没有对应的标准规范去响应它。
- 浏览器不会为
<my-button disabled></my-button>自动禁用交互或加灰 -
element.disabled属性在自定义元素上是undefined,读不到 - 想让它“生效”,得自己监听
disabled变化,并手动控制样式和行为 - 真正起作用的是
attributeChangedCallback配合observedAttributes
怎么让 <my-input></my-input> 支持 value 和 placeholder
必须用 customElements.define() 注册为**自定义内置元素**(extends "input"),而不是独立标签。否则 value 不会双向绑定,placeholder 也不会渲染。
- 写法必须是:
class MyInput extends HTMLInputElement,且注册时加{ extends: "input" } - 调用:
<input is="my-input" value="test">,不能写成<my-input value="test"></my-input> - 独立标签(如
<my-input></my-input>)无法继承表单属性和行为,form.elements里找不到它 - 若坚持用独立标签,
value得自己实现:用get/set访问器 +input事件同步内部<input>子节点
style 写在自定义标签上为啥不生效
因为自定义标签默认是 display: inline,且没有任何用户代理样式(user agent stylesheet)。你写的 color: red 能生效,但 width、padding、font-size 这些依赖盒模型或继承链的,往往没反应。
立即学习“前端免费学习笔记(深入)”;
- 必须显式设置
display(比如display: block或display: inline-block)才能让宽高/内外边距起作用 - 子元素样式不会自动继承到自定义标签内部——除非你用
:host或:host-context()(仅限 Shadow DOM) - 不用 Shadow DOM 时,外部 CSS 选择器能匹配到自定义标签,但优先级低,容易被重置;建议加
!important或提高选择器权重 - 推荐做法:在构造函数里
this.style.display = "inline-block",避免样式未加载时布局塌陷
最常被忽略的一点:自定义标签要真正可用,不是加个 define() 就完事。属性响应、表单集成、键盘焦点、无障碍(role/tabindex)都得手动补全——浏览器不会替你多走一步。










