哦,<textarea>
。 你拥有多少怪癖。 这里收集了九个你可能想对 textarea 执行的操作。 尽情享受。
1. 将图片作为 textarea 背景,输入文字时消失。
您可以像其他任何元素一样,为 textarea 添加背景图片。 在这种情况下,图片是一个友好的提醒,要友好 =)。 如果您出于某种原因添加了背景图片,它可能会破坏 textarea 的浏览器默认样式。 默认的 1px 实心粗体边框将被替换为更厚的斜面边框。 要恢复浏览器默认设置,您只需将边框强制恢复正常。
textarea {
background: url(images/benice.png) center center no-repeat; /* This ruins default border */
border: 1px solid #888;
}
一旦文本到达该位置,该背景图片可能会干扰文本的可读性。 以下是一些 jQuery 代码,它将在 textarea 获得焦点时移除背景,如果 textarea 中没有任何文本,则将其放回。
$('textarea')
.focus(function() { $(this).css("background", "none") })
.blur(function() { if ($(this)[0].value == '') { $(this).css("background", "url(images/benice.png) center center no-repeat") } });
2. HTML5 占位符文本
HTML5 表单中有一个新的属性称为placeholder。 它在 textarea 中显示淡灰色的文本(也适用于文本样式输入),当 textarea 获得焦点或具有任何值时,该文本将消失。
<textarea placeholder="Remember, be nice!" cols="30" rows="5"></textarea>
HTML5 占位符文本在 Safari 5、Mobile Safari、Chrome 6 和 Firefox 4 alpha 中有效。
3. 占位符文本,HTML5 结合 jQuery 备用方案
我们可以通过 JavaScript 测试来轻松测试特定元素是否支持特定属性。
function elementSupportsAttribute(element, attribute) {
var test = document.createElement(element);
if (attribute in test) {
return true;
} else {
return false;
}
};
然后我们可以编写代码,以便如果浏览器支持 placeholder 属性,我们将使用它,否则,我们将使用 jQuery 模拟该行为。
if (!elementSupportsAttribute('textarea', 'placeholder')) {
// Fallback for browsers that don't support HTML5 placeholder attribute
$("#example-three")
.data("originalText", $("#example-three").text())
.css("color", "#999")
.focus(function() {
var $el = $(this);
if (this.value == $el.data("originalText")) {
this.value = "";
}
})
.blur(function() {
if (this.value == "") {
this.value = $(this).data("originalText");
}
});
} else {
// Browser does support HTML5 placeholder attribute, so use it.
$("#example-three")
.attr("placeholder", $("#example-three").text())
.text("");
}
4. 移除蓝色辉光
所有 WebKit 浏览器、Firefox 3.6 和 Opera 10 都会在 textarea 获得焦点时在其周围显示一个发光的蓝色边框。 您可以像这样从 WebKit 浏览器中移除它。
textarea {
outline: none;
}
您也可以将其应用于 :focus 样式,但无论哪种方式都可以。 我还没有找到从 Firefox 或 Opera 中移除它的方法,但是-moz-outline-style是我测试过的最接近的方法。
提醒: 蓝色辉光正在成为一个强大的标准,而破坏该标准通常对您的用户不利。 如果您这样做,您也应该有一个非常有说服力的理由,以及一个同样强大的 :focus 样式。
5. 移除调整大小手柄
WebKit 浏览器在文本区域的右下角附加了一个小的 UI 元素,用户可以使用它通过点击和拖动来调整 textarea 的大小。 如果出于任何原因您想移除它,CSS 就足够了。
textarea {
resize: none;
}
6. 添加调整大小手柄
jQuery UI 具有一个 可调整大小的交互,可用于 textarea。 它在所有浏览器中都有效,并覆盖了 WebKit 原生版本,因为此版本具有各种花哨的功能(如回调和动画)。
要使用它,请在您的页面上加载 jQuery 和 jQuery UI,并且在最基本的层面上,您可以像这样调用它。
$("textarea").resizable();
7. 自动调整大小以适应内容
James Padolsey 有一个非常棒的 jQuery 脚本,用于 自动调整 textarea 大小(该脚本在互联网上时有时无,所以这里有一个 备份。)
这里有 Louis Lazeris 的另一个,其中还包含指向其他选项的链接。 它的工作方式与您希望的一样。 textarea 最初以正常合理的尺寸开始。 随着您输入越来越多的内容,textarea 会扩展以包含所有这些文本,而不是像默认设置那样触发滚动条。
该插件有多种选项,但在最简单的情况下,您只需加载 jQuery、插件文件并像这样调用它。
$('textarea').autoResize();
这里的另一个技巧是根本不使用 <textarea>
,而是使用 <div contenteditable>
。 它将自动增长,根本不需要花哨的 JavaScript 帮助 - 除了它不再是真正的表单元素,因此您需要 JavaScript 来提取/发送值。
8. 不换行
要防止文本在 CSS 中正常换行,您可以使用#whatever { white-space: nowrap; }。 但是出于某种原因,这对 textarea 不起作用。 如果您希望能够在 textarea 中键入,并且希望行在您按下回车键之前不换行(而是触发水平滚动条),则必须使用wrap="off"属性。
<textarea wrap="off" cols="30" rows="5"></textarea>
9. 移除 Internet Explorer 中的默认滚动条
IE 默认情况下在所有 textarea 上都显示垂直滚动条。 您可以使用overflow: hidden将其隐藏,但这样您在扩展时就完全不会获得任何滚动条。 值得庆幸的是,自动溢出可以移除滚动条,但在需要时仍会将其放回。
textarea {
overflow: auto;
}
所有上述示例 都可以在此处查看。
这是 Chris 最有见地的文章之一。 我真的很想了解有关文本区域的更多信息,而这是为数不多的专门针对它们的帖子之一:D 非常感谢。
非常、非常、有用的技巧! 谢谢!(那是 3 个 very)
糟糕……非常。
您太棒了,Chris……谢谢。
很值得了解的东西!
我认为没有必要为 textarea 使用 jQuery。 我宁愿使用 CSS 伪类(Hover、active、focus……)。
本文中使用 jQuery 的任何内容都是专门针对 CSS 本身无法完成的事情。
你说得对!哈哈
您可以使用 :focus 做同样的事情,您在说什么“css 本身无法做到”。
请便测试吧。
.text {background-color:#FFF;color:#000;}
.text:focus {background-color:#000;color:#FFF;}
如果文本区域内有文本,则背景图像将保持移除状态。此文本测试只能使用JavaScript执行。
嗯……虽然我承认它不是跨浏览器的,但有*:empty,对吧?
js用于确定当焦点离开文本区域时内部是否有文本,并且仅当文本区域没有文本时才返回背景。
:empty,虽然不是跨浏览器的。
精彩的文章,我发现它非常有用。很棒的信息和细节!
对于#4,我认为这实际上是使用键盘选项卡浏览表单的人员的可访问性问题,链接周围的虚线也是如此。
但只要添加了:focus行为,就可以。
哇,一次性提示,谢谢Chris
Chris,内容不错,但只有一件事:Firefox 3.6在聚焦时不会在文本区域上显示任何蓝色光晕。我还想指出,对于您的第一个示例,最好使用:focus伪类提供CSS回退。
除此之外,我将来一定会使用其中的一些,尤其是自动调整大小。
在我的Mac版本上确实有,也许这是Mac独有的功能?
Windows上的Chrome在文本框周围显示黄橙色光晕。
好吧,至少您的评论文本框在Chrome(Windows)上没有黄橙色光晕。我猜您也在css tricks上使用这些技巧^^
是的,这是Mac独有的功能。其他操作系统有不同的显示聚焦元素的默认方式。
蓝色的光晕只有Safari才有 :)
正如Sumeet所说,其他浏览器执行不同的操作,有些浏览器像Chrome一样使用不同的光晕。
我相信Chrome中的发光也取决于正在使用的主题;-)
这在每个主题平台上都会发生变化,因为xul尝试使用系统的输入样式。
我已经自己以艰难的方式发现了其中一半的技巧,但学习这些可以为用户带来改变的小事情总是好的。
感谢Chris提供的这些资源!
查看我的联系表单
http://bit.ly/b6GSWE
它很漂亮。
它缺少很多安全措施。在CSS-Tricks.com上,已经有很多关于它的文章,并且经过多次版本更新,最终结果是
在我看来,这要好得多,并且用户和电子邮件客户端的最终结果大致相同。
我使用了其中的代码来构建表单……所以希望它不会缺少很多。
哇,非常感谢Chris!
感谢分享,Chris!
不错。谢谢。一如既往:非常实用的技巧
题外话:刚刚查看了James Padolsey的网站,我真的很喜欢背景的滚动效果。有什么想法是如何做到的吗?
问候
jQuery,那是肯定的,我认为使用这段代码 :)
谢谢。我会试试这个……
感谢分享。非常有帮助
其中一些“技巧”非常有用,其他则不……
1.a 很好,1.b(在聚焦时移除背景)可以使用textarea:focus {} background.image: none } 无需JS即可完成;)
2./3. HTML5真棒 :)
4. 如前所述,不应这样做……
5. 嗯……为什么?
6. /7./8./9. 这些技巧确实很有用 :) 感谢!
@4:许多人/客户不喜欢光晕。
@5:许多人尝试移除调整大小框,因为有时调整大小会破坏设计的布局。因此,它也可能非常有用。
哦,天哪,Chris,你无法相信IE给我的溢出问题带来了多少麻烦。我总是使用overflow:hidden,并希望人们不会回滚,因为我真的很讨厌那个始终存在的自动滚动条,即使没有任何文本也是如此。我完全忽略了overflow:auto的可能性。非常感谢!节省了太多痛苦!
感谢这些有用的技巧!
谢谢,Chris!
很棒的文章。
这些是jQuery默认自带的吗?还是文本区域的某种插件?
很棒的文章,谢谢 :)
您可以通过设置-moz-appearance: none或在文本区域上设置背景或边框来关闭Firefox中的焦点环:这也会覆盖原生外观。
谢谢!
酷毙了!
感谢您的努力 :)
Chris,很棒的文章!内容丰富且值得收藏。
我建议对elementSupportsAttribute函数进行优化
这不会带来任何明显的性能提升,但它确实展示了我们在使用JavaScript进行编码时都喜欢的东西。
是的,这很有趣!
是啊,我不明白这一切有什么意义。
非常棒……有用
Chris,我能看到演示吗?
当然
https://css-tricks.cn/examples/TextareaTricks/
文本区域技巧的集合,有些我以前还不知道。感谢发布它。
不错的文章,
很高兴获得专注于单个元素的技巧
这些是我喜欢的文章类型。
优秀的文章,已添加到收藏夹,继续努力。
不错的技巧..感谢分享,Chris!
感谢“resize: none;”我之前并不知道这个技巧 :)
而不是
var test = document.createElement(element);
if (attribute in test) {
return true;
} else {
return false;
}
您可以这样做
var test = document.createElement(element);
return (attribute in test);
或者甚至
return (attribute in document.createElement(element))
最后,你把所有这些都整合起来了,Chris!
我以前花了两三天的时间试图找到1、2、4、5、7、9的解决方案……
感谢这个不错的教程:D
这真是太奇怪了!我昨天还在找一篇关于如何做到这一点的指南!感谢Chris:D
我通常会移除水平调整大小
而且我讨厌只有4行的很小的文本区域(很多网站出于某种奇怪的原因使用这种文本区域)
这正是我要找的,谢谢:)
这简直是弱智
$(this)[0].value
你应该用这个代替
this.value
this是 JavaScript 中的一个特殊关键字(就像许多其他编程/脚本语言一样),它指的是当前正在运行代码的“所有者”对象。在这种情况下,this指的是文本区域 DOM 对象,而value是它的一个原生属性。
你所做的是告诉 jQuery 获取此对象($(this)),将其放入 jQuery 集合中,访问该集合的第一个元素($(this)[0]),然后访问该对象的value属性($(this)[0].value),而不是直接访问属性(this.value),而无需将 jQuery 牵扯进来!
在你尝试教别人任何东西之前,你真的应该学习一些 JavaScript 和 jQuery!
还有一件事……<code> 标签是一个内联标签是有原因的!如果你保留了此标签的默认行为,我的上一条评论看起来会更好吗?
切……甚至更“厉害”
var $el = $(this);
// console.log($el.text(), "value: " + $el.attr("val"));
你真的选择了到达该元素的值属性的最长路径……
比
$el.attr(“val”)
更短的是
$el.val()
或者(仍然很糟糕)
$el[0].value
或者(最好的)
this.value
…
对于您评论中对我有帮助的部分
太棒了,谢谢!你说得对,我将编辑代码使其更有效率。我实际上知道更好的方法,有时我只是快速地让它工作,而不回去清理它。
对于粗鲁的部分
你应该试着少说些粗话!
我不知道 HTML5 的占位符标签或 jQuery 的调整大小,所以非常感谢您突出显示这些。
是的。我也不知道。我喜欢访问这个网站,因为我总能学到新东西。
感谢发布这篇文章,我学到了一些以前从未意识到的技巧!
感谢 Chris!!!这绝对应该收藏起来。
不错的技巧……我确实学到了一些关于文本区域在前端上下文中非常重要的东西
如果你想要一个更通用的 jQuery 备选方案来实现 HTML5 占位符属性,请随意使用我的占位符 jQuery 插件。
垃圾信息。
这篇文章对我帮助很大,尽管我了解上面提到的某些技巧,但我发现占位符技巧非常有用,因为我还没有接触过 html5。
感谢您提供如此详细的文本区域标签 CSS 技巧文档。
iPhone 上的第 4 个技巧会移除文本框的内阴影。在聚焦和非聚焦状态下都是如此。
我有一个关于新的“占位符”文本的问题
如果用户没有输入任何内容,该文本是否会传递到 POST/GET 数组中?如果不传递,那将非常有用,否则在检查“必填”字段的空白字段时会导致额外的验证。
顺便说一句,这篇文章写得很好!
不会
嘿,Chris,感谢与我们分享一些非常棒的技巧。我一直想知道如何在框中移除调整大小的句柄,但从未真正研究过……现在你已经把它带给我了。我想这将是尝试这些示例并看看我如何使用它们的情况。干杯。
同意,这是一个很棒的技巧。有时候这些东西会让人感到厌烦。
很棒的文章,Chris!真是太疯狂了,你经常会在我在思考某个主题时发布新的文章。
关于这一点……有谁知道如何在文本区域中使文本“滚动”而不显示滚动条吗?
我有一个样式化的表单,其中包含一个包含文本区域的元素,该元素设置了宽度和高度。文本区域也由 cols/rows 设置,但在 Firefox 中,当我的输入到达底部时,它会继续向下延伸到你看不到你在写什么的地方。
Safari 会自动向上移动文本,以便你正在编写的行保持可见。
我已经尝试了我能想到的一切,所以如果有人能给我一些建议,我将不胜感激。
干杯……伙计
对我的 GUI 非常非常有用。
感谢分享,Chris :-)
非常有用的技巧 - 谢谢分享;)
重要的是要记住,尽管你可以使用 CSS 样式化文本区域,但始终需要包含 cols 和 row 属性,无论如何。
CSS 与 cols 和 rows
在使用提出的文本区域自动调整大小方法时遇到各种问题,我找到了这个,它更容易实现,而且据我所见,它与跨浏览器兼容性更好:http://perplexed.co.uk/596_expanding_textarea_as_you_type.htm
找不到调整大小的 js,请更新您的链接
精彩精彩精彩的文章,我学到了一些关于如何移除活动字段的光晕的新知识——它看起来很糟糕!
不过我遇到一个问题,我无法让文本从文本区域框的顶部开始。我尝试过
vertical-align: top !important;
text-align: start;
但这没有效果。
甚至尝试从整个输入字段中移除“vertical-align: middle”并更改为 top,但文本仍然显示在区域的中间。
我做错了什么?
Chris -
如果你在文本区域中使用“overflow: auto;”,它会像“white-space: nowrap;”一样工作。
只是想分享一下!
有没有人对我的问题有什么想法,即我似乎无法使文本从文本区域框的顶部开始,而不是从垂直中心开始?
这里有一些非常大的疏忽
a) 你正在使用 jQuery 的 data() 方法,但你实际上不需要它。标准使用占位符属性就足够了。我将在下面添加一个示例。
b) 如果你将字段的值更改为占位符文本,则应在提交前将其更改回来(否则占位符文本将作为字段提交,这不能很好地替代默认行为——默认情况下,如果字段为空,则不会提交占位符文本)。
我意识到以下实现并不理想——它可能应该使用元素数组来使代码尽可能地 DRY——但这是一个良好的开端。
然后,在提交表单之前,我们应该在理想情况下执行类似 onsubmit=”return clearPlaceholders(‘#’+this.id)” 的操作,以防止占位符数据被提交。clearPlaceholders 函数看起来像这样
这基本上就是我正在做的,并且效果很好。