HTML5 中的一种新型输入类型是 search
。
<input type=search name=s>
在大多数浏览器中,它没有任何作用。 它只是像文本输入一样工作。 这不是问题。 规范不要求它执行任何特殊操作。 然而,WebKit 浏览器确实以略有不同的方式处理它,主要是通过样式。

默认情况下,WebKit 中的搜索输入具有内嵌边框、圆角和严格的排版控制。
样式限制
WebKit 对您可以在搜索输入上更改的内容有很大的限制。 我想,这样做的目的是为了保持一致性。 特别是在 Safari 中,搜索字段看起来与浏览器右上角的搜索框完全一样。 以下 CSS 将在 WebKit 中被忽略,无论如何,即使使用 !important
规则也无法阻止它。
input[type=search] {
padding: 30px; /* Overridden by padding: 1px; */
font-family: Georgia; /* Overridden by font: -webkit-small-control; */
border: 5px solid black; /* Overridden by border: 2px inset; */
background: red; /* Overridden by background-color: white; */
line-height: 3; /* Irrelevant, I guess */
}
换句话说,**请务必谨慎**在搜索输入上使用任何这些 CSS 属性,除非您愿意在其他浏览器中看到搜索输入看起来**非常**不同。
允许的样式
以下 CSS 按预期工作。 我认为,最后三个属性可能应该像上面的属性一样被锁定,因为对这些属性进行样式设置几乎总是比不设置样式看起来更糟糕。
input[type=search] {
color: red;
text-align: right;
cursor: pointer;
display: block;
width: 100%;
letter-spacing: 4px;
text-shadow: 0 0 2px black;
word-spacing: 20px;
}
无效的样式
小心不要在搜索输入上使用 text-indent
。 结果非常奇怪且不一致。 以下是一个例子

有时文本在下面,像这样。 有时它根本不可见。 它似乎与周围元素以及缩进量有关(低值有时可以正常工作)。
显示以前的搜索
据我所知,这一点在任何地方都没有记录,也不在规范中,但如果您在输入上添加一个 results
参数,WebKit 将应用一个带有下拉箭头的小放大镜,以显示以前的搜索结果。 (感谢 Mike Taylor)。
<input type=search results=5 name=s>

您为 results
属性提供的整数是此下拉菜单中显示的最近搜索数量,如果存在那么多搜索。
我真的很喜欢这个小放大镜。 它突出了该字段的搜索功能,但我认为这个功能本身相当不稳定。 在页面重新加载时,最近的搜索将被清除,因此该下拉菜单几乎总是显示“没有最近的搜索”,除非您已实现某种 Ajax 搜索(甚至我还没有真正测试过)。
更新:您可以使用 autosave
参数来跨页面加载持久保存下拉菜单中的值。
<input type=search results=5 autosave=some_unique_value name=s>
大小限制
WebKit 搜索输入只有三种不同的“大小”,它由您在它们上面声明的字体大小决定。
结果大小 | CSS 字体大小 |
---|---|
小 | <= 10px |
中 | 11px – 15px |
大 | >= 16px |

这种小、中、大模式非常令人沮丧,因为即使设置相同的字体值,即使是最小的“调整”,您也会在不同浏览器中看到字体大小差异。

注意 WebKit 侧搜索输入右侧的 (x)。 这是 WebKit 中这些搜索输入的附加功能。 如果输入有任何值(不是占位符,而是真实值),则将显示 (x),它是一个用于清除输入的功能性 UI 控件。
说到占位符文本,搜索输入非常适合使用它。
<input type=search results=5 placeholder=Search... name=s>
如果您不喜欢浅灰色,可以为占位符文本设置样式
::-webkit-input-placeholder {
color: orangered;
}
设置搜索图形小部件的样式
例如,当您在搜索输入中输入文本时显示的小 (x) 按钮。 可以通过首先删除特殊伪元素(我们应该称它们为伪元素吗?)上的 -webkit-appearance,然后应用您自己的样式来设置它的样式。
input[type="search"]::-webkit-search-cancel-button {
/* Remove default */
-webkit-appearance: none;
/* Now your own custom styles */
height: 10px;
width: 10px;
background: red;
/* Will place small red box on the right of input (positioning carries over) */
}
搜索输入上的特殊 JavaScript 事件
当我了解更多信息时会更新它,但现在,我在 Ajaxian 上看到来自“maccman”的这条评论
还有一些自定义事件,例如“search”,它在用户暂停键入时触发(将“incremental”设置为 true)。
Chris,总结得很棒。 我在最近的一个项目中使用了它。 您可以使用以下 CSS 绕过样式限制
我也不能为此担功,我只是记得我在哪里找到了它…… CSS Webkit Appearance
还不够。 要删除多余的填充,您需要像这样禁用 WebKit 专有的伪元素
我通常将搜索输入的类型设置为文本字段。 这似乎解决了我的很多样式问题:-webkit-appearance: textfield;
input[type=search] {
-webkit-appearance: textfield;
}
做得好,它已经在我的收藏夹中了,谢谢!
我刚在 Chrome 7 和 5 上尝试了您的演示,但看起来不像您在这里描述的那样。 也许这只是 Safari 独有的功能?
开篇段落
Chrome 是一个 WebKit 浏览器。
我最近一直在玩搜索输入,您关于 Chrome 的说法是正确的——该特定功能最近在 Webkit 中实现,因此我相信 Chrome 仍然需要升级到最新的 Webkit 版本才能拥有它(Chrome 还没有文本描边,尽管最新的 Safari 已经有了)。
我喜欢搜索输入的功能,但我想实现像素级完美的样式,但我无法做到,因此最终放弃了它。 可能将来会再尝试一下,但现在还不是时候……
我在 Windows XP 上的 Chrome 5 和 Safari 5 上尝试了您的演示,它看起来不像在 Mac 上那么精致。 似乎圆角在 Windows 上不起作用。
这是一个 屏幕截图。
这个。在 Windows XP 的任何浏览器中,角落都没有圆角。非常想知道它们是否只是在 Safari 5 Mac 上是圆角的。也就是说,我很好奇它们是否在 Chrome 5 Mac 或其他 Windows 平台上的任何浏览器中也是圆角的。
正如 Ben 指出,大多数这些 CSS 问题可以通过更改 -webkit-appearance 属性(为 none 或 textfield)来解决。
我最近在一个项目中使用了它
input[type=”search”] { -webkit-appearance: textfield; }
我只是记得一个关于 Chrome(仅限 Windows 版本)的内部 box-shadow 问题。
为什么当 Webkit 做了一些违反规范的事情,并且它本身在不同版本中表现不同时,这被认为是可以的,但当其他浏览器引擎这样做时,它们被认为是做了一些非常错误的事情,应该被回避?
Dave,我不得不同意。如果这是 IE 的行为,人们会从树林里跑出来抨击它。然而,苹果使用 Webkit,所以不知何故这是可以的。
…因为当 Webkit 做到这一点时,它通常在功能上是健全的,并且是对微软做不同事情的改进,仅仅因为他们可以做到。
说得很好——当 Webkit 做了一些不同的事情时,是为了改进,当微软做了一些不同的事情时,是为了让每个人都按他们的方式去做。不幸的是,他们多年来一直得逞!
当我阅读这篇文章时,我有点恼火,但也许因为 Webkit 在其他很多方面都做得很好,所以更容易原谅它?
我认为这是一个很好的观点,也是一个有趣的话题。我认为在这种特殊情况下,它在技术上是一个可选的补充,您可以选择使用或不使用它。实现也没有错误或违反规范,这主要是 IE 受到抨击的原因。IE 确实有一些其他浏览器没有的实现,它做得很好。例如,“orphans”属性工作得很好(防止在文本块末尾的单字出现在新行上)目前仅在 IE 和 Opera 中有效,我一直在使用它。所以在这种情况下,应该换个方向飞翔。
感谢您提供关于 Webkit html5 搜索输入的概述。LT
很棒的工作,非常感谢
谢谢:)
谢谢:)不错:)
嗨
我喜欢这篇文章,但你一直把 Webkit 浏览器与某样东西进行比较——那是什么?
我猜是 IE 或 Firefox,但它可能是一整组浏览器——你能澄清一下吗,拜托?
谢谢:)
“results” 在这里有记录(简要):http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/Attributes.html#//apple_ref/doc/uid/TP40008058-results
你知道吗,这有点糟糕。所以很好,搜索元素很酷,但是所有这些样式限制……这是谁的主意?在我看来非常愚蠢。
我必须同意关于样式限制的说法。我不在乎浏览器默认情况下是否以不同的方式做事,但当无法对某些东西应用 css 而不跳过障碍时,就会出现问题。
正如其他人所说,解决此问题的办法是设置 -webkit-appearance。此技术也适用于其他输入类型,例如复选框或单选按钮。
嗯……
我被撕裂了,不知道这是否是好的或坏的行为(全部或部分)。正如其他人指出的那样,我轻微的亲苹果偏见可能让我无法仅仅将其视为坏事。但是,我还记得 Firefox 的早期,当时关于作者更改任何窗口 chrome 外观是否是不好的做法有很多讨论,这样它才能与操作系统和特定浏览器约定保持一致。(IE 滚动条,我正在看着你)。
我还阅读了一些关于重置样式表的内容,这些样式表注意不要出于类似的原因弄乱表单。如果苹果使用这种推理来证明他们在“搜索”表单上的做法,那么我认为我可以接受它。
我们中的一些人真的很喜欢能够控制所有事情,但我也可以理解另一面,即用户代理供应商希望他们的平台做某些事情,并且能够展示他们认为重要的功能。
苹果可能专注于操作系统一致性和他们特定的设计美学。Firefox 专注于可扩展性,Chrome 专注于纯粹的速度,Opera 专注于比 IE 更好,并且仍然拥有大量功能和许多内置工具栏。IE 专注于……推动 Silverlight?
同意。但是,操作系统一致性和设计师自由之间的界限应该在哪里?
很棒的文章(一如既往)Chris。我一定会在我的下一个项目中使用它+=]
倒数第二个代码示例中的错别字
placholder 应该是 placeholder。
感谢分享
正如其他人所说,只需将 webkit-appearance 设置为 none。但是,您还需要更改其他几个属性。
http://anthonyshort.com.au/post/1016795820/styling-the-search-input-in-webkit
Webkit 还会更改搜索输入的 box-sizing 属性,因此您需要重置它,并且只需要禁用单个伪元素即可删除额外的填充。
谢谢 Chris…:)
我知道你还有更多很棒的信息
你是个好人
@results?但这些不是“results”。它们是之前输入的搜索词。
它应该是 @prevterms 或类似的东西。
我同意。
-webkit-appearance: input
顺便说一下看起来不错,但它能在旧的 ie 6 甚至 7 中工作吗?我尝试过自定义输入,但当谈到 ie 时,总是会遇到大麻烦,也许 html5 会打破障碍,我希望如此:)
不错的技巧 Chris,谢谢您。
很棒的工作,Chris
在 Safari 中,您可以跨浏览会话维护最近搜索的列表。
只需添加 autosave=”Any Unique Identifier”。
Chrome 应该尽快实现此可用性功能。
填充、背景和边框错误让我花了半个多小时才让它工作……
希望我早点看到你的博客文章!
不错的博客,对于开发人员和设计师来说也很有用,可以利用 Webkit 并使用最近搜索功能(如不同浏览器的自动建议)来制作完美的搜索框。
谢谢:)
这篇文章介绍了如何创建更好的搜索功能,但我很好奇你是如何使用 WordPress 在你的网站上搜索不同区域的。
现在,似乎只有
-webkit-appearance: none;
不能再移除 iOS 上的圆角了。不过添加border-radius: 0;
可以解决这个问题!注意以下问题
http://blog.yorkxin.org/posts/2013/07/03/universal-hover-triggers-double-tap-bug-in-ios-safari
以及
http://help.symbolset.com/customer/portal/questions/828932-conflict-with-symbolset-ios-search-inputs-and-javascript
令我惊讶的是,一个简单的输入框在 iOS Safari 上会导致如此多的问题……
我在 iPhone 5 上用 iOS 7 测试过,-webkit-appearance: none; 解决了问题!:)
有人知道是否可以更改出现的搜索历史记录列表的样式吗?
当它在一个精致的深色网站上显示一个耀眼的白色背景时,真是太烦人了!
嗨,Chris,
我还有另一个需求。
我想在搜索框中看到取消按钮。它在桌面 Webkit 浏览器中可见。
但不知何故,我在 iOS Safari 浏览器中看不到它。
你能告诉我可能是什么问题吗?
此致,
Jesudas