原生 placeholder 不支持富文本、换行和样式,因浏览器将其视为纯字符串;需用 :placeholder-shown + label 模拟预览,确保可访问性与兼容性。

原生 placeholder 无法预览富文本、不支持换行、不能加样式——这不是 bug,是设计限制。想“预览”它,本质是绕过它。
为什么直接写 placeholder="<strong>邮箱</strong>" 不生效
浏览器把整个属性值当纯字符串处理,<strong></strong> 被当成普通字符显示,不是标签。常见错误现象:<input placeholder="用户名 <small>(必填)</small>"> 渲染出来就是字面量“用户名 (必填)”,括号和小字都原样输出。
- 所有主流浏览器行为一致,没有例外
-
placeholder值里写\n会被转成空格,不是换行 - 哪怕你用 JS 动态赋值
el.placeholder = "<b>test</b>",结果一样
::placeholder 只能改颜色/透明度/字体,别试 padding 或 background
这个伪元素只接受极有限的 CSS 属性: color、font-size、font-style、opacity、text-decoration。其他如 padding、background、display 全部无效。
- Firefox 默认
opacity: 0.5,Chrome/Safari 是1,记得统一写opacity: 1 - 要兼容旧版,得补全前缀:
::-webkit-input-placeholder、::-moz-placeholder、:-ms-input-placeholder - 别指望用它实现“灰色背景+圆角边框”的提示气泡效果——做不到
真要预览格式化内容,用 :placeholder-shown + 浮动 label 模拟
这是目前最可控、无障碍友好的方案:把提示文字从 placeholder 拿出来,做成独立 <label></label> 或伪元素,再用 :placeholder-shown 控制显隐逻辑。
- 结构示例:
<div class="input-group"> <label for="email">邮箱地址</label><input id="email" type="email" placeholder="example@domain.com"> </div> - CSS 控制:
.input-group label { position: absolute; top: 8px; left: 12px; color: #999; font-size: 14px; }+input:not(:placeholder-shown) + label { display: none; } - 注意:必须配
for和id,否则屏幕阅读器读不出字段用途 - 如果 label 需要加粗关键词,直接在 HTML 里写
<strong>必填</strong>,而不是塞进placeholder
低质量 placeholder 预览的临时 hack(仅限调试)
开发时想快速看效果,又懒得搭完整结构?可以用 JS 把 placeholder 值临时渲染到页面上做参考,但绝不能上线:
const input = document.querySelector('input[placeholder]');
const preview = document.createElement('div');
preview.textContent = 'Preview: ' + input.getAttribute('placeholder');
document.body.appendChild(preview);
- 这玩意儿只是帮你确认文案长度、断句是否合理
- 它不反映真实渲染效果(比如 iOS 截断、颜色差异、缩放后模糊)
- 一旦提交代码,这类 preview 必须删掉——它没语义、没可访问性、干扰测试
真正难的不是让提示“看起来像富文本”,而是让它在键盘导航、屏幕阅读器、高对比度模式下都可靠。所以别纠结怎么“骗过浏览器”,优先把 <label></label> 写对,placeholder 当作可有可无的视觉糖。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











