input [type ='text'] CSS选择器不适用于默认类型的文本输入吗?


67

默认输入类型为“文本”。我一直认为,input[type='text']即使没有在控件上明确声明类型,CSS声明定位也会影响这些输入。但是,我只是注意到我的默认类型文本输入没有获得样式。为什么会这样呢?我该如何解决呢?

input[type='text'] {
  background: red;
}
<input name='t1' type='text' /> /* Is Red */
<input name='t1' /> /* Is Not Red */


6
CSS选择器将标签的属性作为目标,而不是其默认假设。
里卡多·索萨

Answers:


107

CSS仅使用DOM树中的数据,这与渲染器决定如何处理缺少属性的元素无关。

因此,要么让CSS反映HTML

input:not([type]), input[type="text"]
{
background:red;
}

或使HTML明确。

<input name='t1' type='text'/> /* Is Not Red */

如果没有做到这一点,您将永远无法区分

element { ...properties... }

element[attr] { ...properties... }

因为所有属性将始终在所有元素上定义。(例如,table始终具有一个border属性,0默认为。)


11
input:not([type]), input[type="text"]涵盖这两种情况。
BoltClock

@BoltClock是; 我没想到。
李斯特先生,2012年

从来不知道input:not([type])selector-解决我的问题就在那里
Yarin

我认为这主要是HTML / DOM问题,而不是CSS问题。在HTML中,<table><tr></tr><table>隐式变为<table><tbody><tr></tr></tbody></table>,因此在DOM<input>中不隐式变为是很奇怪<input type="text">的。
2014年

1
@Kal并不奇怪;那是完全不同的情况。HTML的定义对此非常精确:该tbody元素被明确定义为强制性的,但具有可选的开始标记。或换句话说,即使您不在<tbody>HTML源代码中,tbody也在那里。另一方面,typein中的属性input不是必需的。而行为inputtype恰好是一样inputtype='text,但是这是巧合,这无关与DOM树。
李斯特先生2014年

7

根据CSS规范,浏览器可能会或可能不会使用有关默认属性的信息。大部分都不是。CSS 2.1规范中的相关子句是DTD中的5.8.2默认属性值。在CSS 3 Selectors中,使用相同名称的6.3.4子句。它建议:“选择器的设计应使其无论文档树中是否包含默认值都可以使用。”

通常最好是明确指定基本属性,例如type=text而不是默认属性。原因是没有简单可靠的方法来引用input具有默认type属性的元素。


+1,请注意在本节中的任何地方都永远不会使用“必须”一词(除非在示例中描述了一个不同的级联问题)。
BoltClock

重要的是实际的浏览器行为。而且似乎没有浏览器可以执行此操作.....
Pacerier 2014年

6

因为,不应该这样做。

input[type=text] { } 是一个属性选择器,并且只会选择具有匹配属性的那些元素。


1

为了与所有浏览器兼容,您应该始终声明输入类型。

有些浏览器会将默认类型假定为“文本”,但这不是一个好习惯。


3
这如何回答问题?
BoltClock

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.