有没有一种简单的方法来选择所有的HTML表单输入元素而不重复规则选择器?

问题描述:

HTML有一个设计问题,我认为,由此形式输入元件是不一致type<input />checkboxtext等)或都是自己的单元类型(selecttextarea等)的。我知道它是基于元素对子元素的需求与否(<select><textarea>有孩子,但<input />没有),但不同类型的<input />会导致截然不同的呈现效果 - 例如,checkboxradio通常呈现为一个小的可点击的平方共享输入,而textpassword是没有指定宽度的矩形。有没有一种简单的方法来选择所有的HTML表单输入元素而不重复规则选择器?

这意味着如果你是造型输入,你会需要需要多重规则。

鉴于此HTML:

<div class="field"> 
    <label> 
     <input type="checkbox" /> Option 1 
    </label> 
    <label> 
     <input type="checkbox" /> Option 2 
    </label> 
</div> 

<div class="field"> 
    A question? 
    <label> 
     <input type="radio" /> Option 1 
    </label> 
    <label> 
     <input type="radio" /> Option 2 
    </label> 
</div> 

<div class="field"> 
    <label> 
     Your name 
     <input type="text" /> 
    </label> 
</div> 

<div class="field"> 
    <label> 
     An essay 
     <textarea></textarea> 
    </label> 
</div> 

如果你想样式仅文本输入框,你可能会认为你只需要:

input, 
textarea { 
    border: 1px inset green; 
} 

然而,这也将(不当)样式的radiocheckbox输入,因此您需要输入input的样式,然后为input[type=radio]input[type=checkbox]添加新规则,以重新设计它们以匹配您的设计或重新设置其风格 - 或更改rul e匹配input[type=text]

但也不是完美的,因为输入规则仍然没有对其他类型的input指定样式:这些文本框为蓝本(如passwordemail),或那些没有(colorimagefile等)。除了所有其他表单元素(例如selecttextareabutton等)外,您还需要为每种类型添加一条规则,然后您需要重复这些选择器每种情况下,风格需要在一个新的环境不同:

input[type=text], 
input[type=password], 
input[type=search], 
input[type=tel], 
input[type=url], 
input[type=email], 
textarea { 
    border: 1px inset green; 
} 

input[type=radio], 
input[type=checkbox] { 
    border: none; 
} 

.someWrapper input[type=text], 
.someWrapper input[type=password], 
.someWrapper input[type=search], 
.someWrapper input[type=tel], 
.someWrapper input[type=url], 
.someWrapper input[type=email], 
.someWrapper textarea { 
    border: 1px inset green; 
} 

.someWrapper input[type=radio], 
.someWrapper input[type=checkbox] { 
    border: none; 
} 

/* etc */ 

不过,我觉得有很多的投入可分为“输入类”,如“文字输入”类:textpasswordtextareaemailsearch等 - “框输入”类:checkbox,radio,“日期”类:date,datetime, month等,等等。

因此,而不是手动添加这些类如class值到我在HTML输入,是否有任何浏览器的固有方式,诸如通过CSS伪类,例如input:textboxinput:boxinput?如果是这样,这将大大简化表单的CSS选择器,并减少缺少选择器的CSS错误。

+0

你上市将是“文字输入”类的一部分,“日期”类。支持它们的浏览器会添加额外的UI,但将其基于标准文本输入字段。另外,不支持新的HTML5输入类型的浏览器将把它们全部渲染为默认文本框。但是,不,CSS中没有通用的“文本框类型输入域”选择器。 – Adrian

+1

为什么你甚至需要包装?难道你不能只创建一个表单字段类,其中所有的用户输入都具有“form-field”类吗? – Adjit

+0

@Adjit是的,但我想知道是否有办法做到这一点,而不改变我的HTML来添加额外的'class'属性值。 – Dai

你可以使用类型选择:

input[type="text"] { } 
input[type="email"] { } 

等。检查这https://www.w3schools.com/css/css_attribute_selectors.asp

+0

这是我所要求的完全相反:问题是有**太多**不同'键入不同输入的值,否则看起来相同以使穷举规则选择器可行。 – Dai

+0

如果不是通过类型,标签或类,你应该如何将不同的选择器分组在一起? – buxbeatz

幸运的是,有一些在CSS中,做你想做的。:read-write伪选择器(https://developer.mozilla.org/en-US/docs/Web/CSS/:read-write)选择用户可编辑的元素。

考虑以下几点:

<input type="radio" selected /><br/> 
<input type="checkbox" selected><br> 
<input type="button" value="Click me"><br> 
<input type="submit" value="Submit me"><br> 
<input type="text"><br> 
<input type="password"><br> 
<input type="email"><br> 
<input type="date"><br> 
<textarea></textarea><br> 

底部5个元素(不包括br多个)将被选择并与CSS的下面一条线强调:

*:read-write {border:1px solid #f3f;} 

浏览器支持还算不错基本的表单域。

注意:我说在第一线近。这选择日期字段。

+1

向下侧(或向上侧)与此,它也将针对比即'input',其他任何_editable_元件,诸如'div'用'contenteditable'属性 – LGSon

+2

@LGSon幸运的那些元件可以被第一匹配和排除(*:read-write:not(input)' - 或者反过来:'input:read-write'(除'textarea'外)。 – Dai

+0

@戴我很清楚这一点:) ...我的评论是简单地阐明了发布的答案,并且我不能说我为什么没有在我的评论中添加该评论,所以谢谢...评论upvoted – LGSon

你应该能够只使用input[type]但是,适用于selecttextarea字段时,并不一定能帮助你。但是无论如何你都必须添加这些选择器。

input[type], 
 
textarea { 
 
    border: 1px inset green; 
 
} 
 

 
input[type=radio], 
 
input[type=checkbox] { 
 
    border: none; 
 
} 
 

 
input[type], 
 
textarea { 
 
    border: 1px inset green; 
 
} 
 

 
input[type=radio], 
 
input[type=checkbox] { 
 
    border: none; 
 
}
<input type="text"/><br/> 
 
<input type="button" value="click"/><br/> 
 
<input type="checkbox"/><br/> 
 
<input type="radio"/><br/> 
 
<input type="color"/><br/> 
 
<textarea></textarea>

+0

'输入[类型]'是没有实际意义为** **所有''元素具有'类型=“”'属性定义(不包括无效文件,当然)。 – Dai