纯CSS模拟div元素placeholder属性
<style>#showDiv { font-size: 18px; }
#showDiv p { margin: 0 10px; }
#showDiv code { background: #afeeee; padding: 2px 4px; tab-size: 4; }
</style>
<div id="showDiv"><h1>利用伪元素实现div元素的placeholder属性</h1>
<p>HTML元素里头,文本框如 <code>input</code> 和 <code>textarea</code> 拥有 <code>placeholder</code> 属性,该属性用于设置元素文本内容为空时所显示的提示文本,增强人机交互友好性。<code>div</code> 元素则没有此属性,需要另寻他径。</p>
<p>实现方法不止一种,最简单、性能也最好的当属纯 CSS 实现方式。请看代码:</p>
<pre><code><style>
.myDiv {
margin: 10px auto;
width: 600px;
height: 200px;
border: 1px solid gray;
padding: 20px;
position: relative;
}
.myDiv:empty::before {
content: '尚未创建内容,请点击创建';
position: absolute;
color: #999;
}
</style>
<div class="myDiv"></div>
<script>
const myDiv = document.querySelector('.myDiv');
myDiv.onclick = () => toggleContent(myDiv);
function toggleContent(elm) {
const content = '内容已创建,单击清除';
elm.textContent = elm.textContent === '' ? content : '';
}
</script>
</code></pre>
<p>【<strong>代码解释</strong>】</p>
<p>核心在 CSS <code>.myDiv:empty::before</code> 选择器的设置,该设置首先使用伪类 <code>:empyt</code> 来设定 div 元素渲染伪元素的条件,即内容为空时;接着设置伪元素的 <code>::before</code> ,有内容、定位、前景色等属性。</p>
<p>JS代码并未参与模拟 placeholder 属性的设置,在这里它只是协助实现演示。函数 <code>toggleContent(elm)</code> 所实现的功能很简单:判断 elm 元素内容是否为空,如是,令其为预设的内容,反之令其内容为空。</p>
</div> <h2>演示:</h2>
<br><br>
<style>
.myDiv {
margin: 10px auto;
width: 600px;
height: 200px;
border: 1px solid gray;
padding: 20px;
position: relative;
}
.myDiv:empty::before {
content: '尚未创建内容,请点击创建';
position: absolute;
color: #999;
}
</style>
<div class="myDiv"></div>
<script>
const myDiv = document.querySelector('.myDiv');
myDiv.onclick = () => toggleContent(myDiv);
function toggleContent(elm) {
const content = '内容已创建,单击清除';
elm.textContent = elm.textContent === '' ? content : '';
}
</script>
马老师厉害~让div元素有了placeholder属性,若能输入内容就更好了{:4_173:} 杨帆 发表于 2026-2-12 16:52
马老师厉害~让div元素有了placeholder属性,若能输入内容就更好了
可编辑的 div 非常简单,你可以尝试一下:
<div id="editer" contenteditable="true"></div>
就这么简单。但是,要控制好它,则需要下功夫了 马黑黑 发表于 2026-2-12 18:38
可编辑的 div 非常简单,你可以尝试一下:
好的,谢谢马老师,我试一下可编辑的 div{:4_172:} 杨帆 发表于 2026-2-12 19:16
好的,谢谢马老师,我试一下可编辑的 div
这个很有意思的,很容易实现所见即所得的编辑效果。唯一的难题是对其结果的处理。 马黑黑 发表于 2026-2-12 22:35
这个很有意思的,很容易实现所见即所得的编辑效果。唯一的难题是对其结果的处理。
有趣,谢谢老师答疑解惑{:4_180:} 仔细学习了,仍然没弄懂这个模拟是做什么用的,不好意思{:4_204:} 红影 发表于 2026-2-13 18:13
仔细学习了,仍然没弄懂这个模拟是做什么用的,不好意思
也许你用不上。不过,如果确实想了解,可以看一下Markdown在线编辑器的预览区,看有内容和没有内容时的区别。 杨帆 发表于 2026-2-12 22:45
有趣,谢谢老师答疑解惑
{:4_190:}
页:
[1]