div模拟textarea文本域轻松实现高度自适应

本文介绍如何利用HTML5的contenteditable属性使div具备文本编辑功能,并通过CSS实现高度自适应效果。针对不同浏览器特性提供了兼容性解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

div的contenteditable属性能够允许用户编辑元素内容包含的任意文本,包括子元素,这是模拟文本域的关键

应用了此属性后,普通的div标签也会像文本域一样可以获得焦点,同时有一个光标在那里闪啊闪,闪啊闪,你越看她她越闪。web QQ 2.0 的聊天对话框的输入框就是应用了此属性

这里写图片描述

使用很简单,一个普通的block元素上加个contenteditable=”true”就ok了,如下:
<div contenteditable="true"></div> 

true外面的引号甚至去掉都没关系。
contenteditable属性虽是HTML5里面的内容,但是IE似乎老早就支持此标签属性了。所以,兼容性方面还是不用太担心的。

ok,最麻烦的模拟textarea的可编辑效果已经解决了,现在想要使用div实现高度自适应那就像是给花花草草松松土一样容易的。使用min-height属性基本上就一步到位了,考虑到IE6浏览器对min/max家族不屑一顾,结合其内部元素溢出会撑开父标签高宽的特性,IE6浏览器直接定高就可以了。于是,假设我们要实现默认200像素高度,高度可随内容自适应的效果,直接下面两个样式就可以了:

{ min-height: 200px; _height: 200px; }

于是,把说到现在的内容结合一起,就可以使用div模拟textarea文本域轻松实现高度自适应了。
**如下测试代码——
CSS代码:**

.test_box {
    width: 400px; 
    min-height: 120px; 
    max-height: 300px;
    _height: 120px; 
    margin-left: auto; 
    margin-right: auto; 
    padding: 3px; 
    outline: 0; 
    border: 1px solid #a0b3d6; 
    font-size: 12px; 
    word-wrap: break-word;
    overflow-x: hidden;
    overflow-y: auto;
    _overflow-y: visible;
}

HTML代码:

<div class="test_box" contenteditable="true"><br /></div> 

结果如下图(全部截自IE6浏览器):
这里写图片描述

一些注意与说明

1.现代浏览器如Firefox在可编辑模式下的div获取焦点的时候会有虚框,而实际上textarea是没有虚框显示的,此迹象会暴露出div是个冒牌货,所以,需要添加下面的样式:

outline:0;

2.Firefox浏览器下可编辑模式的div如果内部元素是空空的,那么其在获取焦点是时候,光标不可见或是与外部div齐高,这也是会暴露出自己是textarea冒牌货的,所以,默认情况下,我们可以在此div中增加一个孤单的
换行标签。但是,IE8下,如果有个默认的br标签,光标位置可能会在第二行闪来闪去,所以,IE8下可编辑div里面默认是不能有br标签的,这个嘛,您自己想办法清掉吧。

3、 IE浏览器下(IE6~8),输入文字回车的时候,div内部是会自动产生p标签包含每行元素的,而其他浏览器貌似是产生br标签(这里尚未全部测试,如有不准,欢迎指正)。由于默认的p标签是有1em大小的上下margin值的,为了效果统一,我们可以设置诸如下面的样式清除p标签的margin值:

.test_box p{ margin: 0; }

4、可编辑模式的div输入的内容都会是很正宗的HTML代码,如果作为内容提交的话需要进行HTML字符过滤。还有,如果您是从其他页面上拷贝一段内容过来,然后粘贴到可编辑模式下的div中,会连HTML也完整的复制过来的(不同于textarea),所以,这里也有必要进行HTML字符过滤(例如web QQ)。

5、 IE6浏览器不支持max-height属性,所以,只用CSS是无法实现超过一定高度出现滚动条的效果,需要js配合实现。

6、 可编辑模式的div标签与textarea一样,是支持focus, blur事件的。自然也支持focus伪类,demo页面中Firefox等现代浏览器获取焦点时的外发光就是使用的:focus。

在设计调查问卷时,如果你想要将左侧的标签列内容右对齐,同时保证右侧的表单元素(如文本输入框、下拉列表、密码框和文本域)具有相同的宽度,你可以采用以下方法: 1. **HTML结构**: 使用CSS Grid或者Flexbox布局。首先,在HTML中创建两个主要容器,左边是标签列,右边是表单区域。 ```html <div class="container"> <div class="labels-container"> <!-- 左侧标签列 --> ... </div> <div class="form-container"> <!-- 右侧表单区域 --> <input type="text" class="uniform-width-input"> <select class="uniform-width-select"> ... </input> <input type="password" class="uniform-width-password"> <textarea class="uniform-width-textarea"></textarea> </div> </div> ``` 2. **CSS样式**: 在外部CSS文件或`<style>`标签中添加如下样式,为这些元素设置统一宽度并使其右对齐。 ```css .container { display: flex; direction: row-reverse; /* 使元素从右向左排列 */ } .labels-container { flex-basis: auto; /* 自适应宽度 */ text-align: right; /* 标签文字右对齐 */ } .form-container { display: flex; flex-direction: column; /* 使得每个元素在同一行 */ justify-content: space-between; /* 保持元素之间间距均匀 */ } .uniform-width-* { width: calc(100% - (max-width-of-largest-label + some-padding)); /* 计算剩余空间并减去最大标签宽度及边距 */ box-sizing: border-box; /* 包含边框和内边距在宽度计算内 */ } ``` - `max-width-of-largest-label`: 需要测量或预设左侧所有标签中的最大宽度。 - `some-padding`: 根据实际需求加上适当的边距。 确保根据你的具体布局调整上述代码,比如计算宽度的方式可能需要基于实际标签宽度和偏好来确定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值