文本域

一、关于textarea元素的cols和rows属性

<textarea>元素,俗称“文本域”,或者“多行文本框”,其自带原生的HTML属性rows表示行的意思,可以改变<textarea>的可视区域高度,cols表示列,可以改变<textarea>的可视区域宽度。例如:

<textarea></textarea>
<textarea cols="30" rows="5"></textarea>

会发现,下面的尺寸明显比没有colsrows属性值的要大。

下面问题来了,我想很多小伙伴知道colsrows可以影响文本域的尺寸,那colsrows不同的数值和最终展示的像素尺寸之间有没有什么关系呢?可不可以通过公式计算呢?最终表现是否还受到其他CSS属性的影响呢?

我想,以上的问题就很少有人知道了,包括我在内,在写此文之前,也是模模糊糊的了解。

二、cols属性值和宽度

您可以狠狠地点击这里:textarea文本域cols属性和宽度关系demo

界面如下:

我们可以选择下拉修改文本域的文字尺寸,字体以及字符间距等,看看会不会对文本域的宽度造成影响。结果结论如下:

  Chrome IE FireFox
font-size
font-family
letter-spacing

可以看见,Chrome浏览器只受到字符大小影响,对字体和字符间距视而不见;而FireFox浏览器则每一个都会影响之;而IE浏览器不受字符间距影响。

那最关心的问题来了,cols的值和最终呈现的宽度有没有什么比如的关系或者公式呢?

在simsun字体,也就是宋体下,我们可以很容易得看出之间的关系为:

  • Chrome: 8px * cols + 17px
  • IE: 8px * cols + 17px
  • FireFox: 8px * cols + 29px

由于CSS,HTML这些东西是老外发明的,因此,cols每个单位相对的宽度是相对于英文字符而言的,在宋体下,可以认为是8px,后面的17px其实很好理解,表示滚动条的宽度。在window系统下,默认,所有浏览器的滚动条所占据的宽度都是17像素。所以,对于Chrome和IE浏览器而言,文本域最终的宽度(paddingborder尺寸暂不考虑)就是单字符宽度*cols值+滚动条宽度。然而,FireFox浏览器下,增加的宽度是29px,这个不就搞不清楚问什么是29px了。

在IE浏览器下,如果<textarea>overflow属性值为hidden, 则没有后面增加的17px,而其他浏览器没有此现象。

然后,当我们使用其他字体的时候,最终的宽度表现则比较微妙了。因此,单个cols对应的单位就不是整数了,可能是8.1px也有可能是7.7px~7.8px这样子的。

总结一下就是:
貌似在Chrome浏览器下才有点实用价值,因为其他浏览器下的宽度波动太明显,任何其他环境的变化都会导致宽度不一样,这个其实在网页布局中是很糟糕
的。因为,网页是自上而下流式的,高度可以很长很长,但是,宽度一般是固定的,资源比较紧张,要求布局精确,因此,一旦出现宽度在各个浏览器下不一样的情
况,势必大大影响其实用价值。因此,在实际web制作的时候,除非一些对宽度要求不高的情况,其余时候,还是使用CSS width属性来控制文本域的宽度。

三、rows属性值和高度

您可以狠狠地点击这里:textarea文本域rows属性和高度关系demo

界面如下:

我们可以选择下拉修改文本域的文字尺寸,字体以及行高等,看看会不会对文本域的高度造成影响。结果结论如下:

  Chrome IE FireFox
font-size
font-family
line-height

可以看见,Chrome浏览器和FireFox浏览器只受到行高大小影响,对字体和字符大小视而不见;而IE浏览器却是完全相反的处理,对line-height行高视而不见,但是,却对字符大小和字体有影响。

那最关心的问题来了,rows的值和最终呈现的高度有没有什么比如的关系或者公式呢(先不考虑paddingborder的影响)?

在Chrome浏览器下,最终的高度就是rows的值和line-height行高的乘积。正如上面的demo截图所示,rows值为2line-height20px的时候,最后的高度是40px, 就是他们的乘积。

在FireFox浏览器下也是类似的,但是有一点不同,就是高度需要再把滚动条的尺寸计算上去,因此,是下面这幅光景,高度都比Chrome浏览器高17px:

在IE浏览器下,高度与行高没关系,更像是有文本的content area高度(inline box模型中的概念)决定的,因为当不同字体切换的时候,高度也会变高,例如,使用微软雅黑字体就会变高很明显,而微软雅黑的content area高度就是比一般字体要高。因此,要想确定文本域高度其与字符之间的关系,关键很难确定那个计算系数:高度=rows*系数。例如,16px的微软雅黑字体的系数近似21(见下图),宋体simsun则是18.2~18.5之间等。

总结一下就是:
兼容性还是一团糟,没有任何两个浏览器是完全同一表现。但是最终表现设计要比cols要好那么一点点。更关键的问题是,高度这个东西一般要求没那么严,所以,我们有时候不想重新搞个CSS确认文本域的高度,使用rows属性值搞一下也是可以的。

四、最后的结束语

最后研究的结果是,兼容性很差,想要各个浏览器下表现一模一样成本很高。因此,如果对文本域的布局要求比较严格,还是使用CSS width/height属性精确控制。

唯一的收获就是,知道了各个浏览器如何兼容性不一,以及最终尺寸呈现的计算方法,相关因素等,说不定,对于日后某个功能实现提供了不一样的思路呢!

En,that’s all!

本文为原创文章,包含脚本行为,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:http://www.zhangxinxu.com/wordpress/?p=5240

时间: 2024-10-30 16:40:02

文本域的相关文章

javaSwing文本域文件

public class JTextAreaTest extends JFrame{    public JTextAreaTest()    {            setSize(200, 400);        setTitle("定义自动换行的文本域");        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);                Container cp=getContentPane(); 

Bootstrap系列 -- 16. 文本域textarea

文本域和原始使用方法一样,设置rows可定义其高度,设置cols可以设置其宽度.但如果textarea元素中添加了类名“form-control”类名,则无需设置cols属性.因为Bootstrap框架中的“form-control”样式的表单控件宽度为100%或auto. <form role="form"> <div class="form-group"> <textarea class="form-control&quo

表单控件+下拉列表+文本域

一.表单控件 1.<input type="text" name="user"  size="20默认" /> 2.<input type="password" name="code"  /> 3.<input type="radio" name="sex[]" value="1" />+<input ty

jquery 文本域光标操作(选、添、删、取)

一.JQuery扩展 ; (function ($) { /* * 文本域光标操作(选.添.删.取)的jQuery扩展 http://www.cnblogs.com/phpyangbo/p/5528648.html */ $.fn.extend({ /* * 获取光标所在位置 */ iGetFieldPos: function () { var field = this.get(0); if (document.selection) { //IE $(this).focus(); var sel

bootstrap-表单控件——文本域textarea

1.运行效果如图所示 2.实现代码如下 <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <title>表单控件--文本域textarea</title>     <!--

JS-007-富文本域操作

在日常 web 编写过程中,富文本域几乎成为了一个网站不可页面元素,同时,其也有着各种各样的实现方式,网络上也存在着各种各样的集成插件可供引用.此文以 js 获取.修改 163 邮箱写邮件时的邮件内容为例,演示 js 操作富文本域的方法.其他各种富文本域内容的修改可参考此文进行编写,感兴趣的小主们,可以尝试一下当前流行的各种富文本域插件. 首先简单演示一下 163 写邮件时,收件人的获取.修改,其页面源码如下所示: 以下为相应元素获取.修改的 js 演示: 以下为 js 获取富文本域内容演示:

HTML学习笔记 域元素(form表单、textarea文本域、fieldset域集合、input使用) 案例 第四节 (原创)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表单</title> </head> <body> <!--form表单--> <form> 用户名: <!--文本域--> <input type="text">

HTML文本域(文本框)禁止修改写入数据方法

html文本域有时需要禁止修改内容,方法如下: 加入readonly=""或readonly="readonly" 如下:<input name="textfield" type="text" value="" readonly="" /><textarea name="textfield" readonly="readonly"

文本域的宽度和高度应该用cols和rows来控制,还是 用width和height来控制

文本域宽度如果用cols来控制,缩放网页的时候文本域的宽度不会自动变化 用width来表示就会跟着网页缩放而缩放 看到下面一段文字: 对于内容至上的网页,在禁用CSS的情况下,HTML内容要做到易于阅读. 如果textarea没有cols和rows,在禁用CSS的情况下,textarea变的很小,用户无法输入很多文字,不符合textarea的语义——用来输入大段的文字. 所以,在XHTML 1.0 Transitional中,textarea必须有cols和rows属性,可以和css同时使用.

GUI编程笔记07:GUI把文本框的值移到文本域案例

1.首先我们了解一下我们的需求,如下: 输入“风清扬”,点击“数据转移”,这样的文本会出现到下面的文本域中,这就是我们的需求. 2.代码如下: package cn.itcast_05; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.Action