【问题标题】:CSS Selector for label bound to input绑定到输入的标签的 CSS 选择器
【发布时间】:2022-01-15 02:24:46
【问题描述】:

有没有办法在 CSS 中选择绑定到具有 required 属性集的 input 字段的 labels(通过 for 属性)?比如:

label:input[required] {
  ...
}

目前,我将class="required" 添加到标签和输入以进行样式设置。我现在在必填字段中有 HTML5 属性 required="required"。删除多余的类属性会很好。

我发现的closest answer 不使用label 元素的for 属性,但要求label 与HTML 中的输入直接相邻。

【问题讨论】:

    标签: css-selectors css


    【解决方案1】:

    CSS 2 Attribute Selectors 怎么样? 它在浏览器之间非常兼容。

    例子:

    <style>
    label[required=required]
    {
    color: blue;
    }
    </style>
    <label required="required" for="one">Label:</label><input name="one" id="one" />
    

    同时检查this

    【讨论】:

    • 显然问题和答案使用格式,但 cmets 没有。该建议的问题在于 required 属性属于 input 元素,而不是 label 元素。 同样在 CSS 中,最好只说: input[required] 因为唯一有效的标记是:HTML -> required XHTML -> required="required" required="false" 或类似的东西是无效的。
    • 是的,required=required 是不必要的。但是,如果他希望能够将所有标签标签附加到具有所需属性的输入上,我认为这是不可能的。您可以获取所有输入 @required input[required],但不能获取所有标签,除非它们是输入的子节点,即使在 HTML 中也是不正确的。
    【解决方案2】:

    此解决方案适用于大多数现代浏览器:

    <style>
    
    label > input[required="required"] {
        background: red; 
    }
    
    </style>
    <label for="myField"><input required="required" id="myField" /></label>
    

    【讨论】:

    • 我认为 OP 要求的选择器通常适用于所有必需的元素,以避免为每个元素指定一个选择器。
    • 如果您使用推荐的标签/输入方式(不嵌套它们),这将不起作用
    • 这种方法的另一个问题,或者 label + input[required] 的其他问题是你正在设计 标签而不是
    • 标签不需要位于 dom 中相对于输入字段的任何特定位置。它们通过绑定到唯一 id 的 for 属性耦合。一个特殊的例子是使用单选按钮。在这种情况下,标签通常放在右侧。
    【解决方案3】:

    您可以使用label[for="title"],其中“title”是您输入的 ID。 示例:

    <label for="title">Title</label>
    <input type="text" id="title" name="title">
    

    css:

    label[for="title"] {
      color: blue;
    }
    

    【讨论】:

    • 你的回答很简单,对我有用。谢谢!
    【解决方案4】:

    我不认为这真的可以通过 CSS 以 OP 想要的方式实现。 CSS 不能那样工作。

    在我看来,更好的方法是退后一步,着眼大局。您有一个表格,其中一些字段是必需的,而有些则不是。最好先给用户所有必填字段,或者将必填字段组合在一起,并将它们与可选字段明确分开。

    你可以创建一个结构如

    <form>
         <ul class="required_fields">
           <li>
              <label>username</label>
              <input />
           </li>
           <li>
              <label>email</label>
              <input />
           </li>
         </ul
         <ul class="optional_fields">
              ...
         </ul>
     </form>
    
    /* CSS */
    .required_fields label {font-weight: bold} 
    .required_fields label:after { content: "*"; color: red } /*more styles for labels*/
    

    这种方法有很多好处。您可以轻松地从“必需”组中添加和删除项目,而无需单独修改每个项目。您可以根据需要将“必需”类分配到链的最高层。如果表单具有“必需”类,则其中的所有内容都将被标记为必需。如果您决定将“必需”类称为其他名称,则可以进行更改的地方较少。总的来说,这种方法还可以帮助您更好地组织表单。您不应将必填字段和可选字段混在一起。

    您可以更进一步,使用一些 javascript 将所需的属性也注入到输入字段中。

    $(".required_fields input").each(function(){
       this.setAttribute('required', 'required');
    });
    

    【讨论】:

    • 这是一个严格的要求,并强制做出特定的设计决策。考虑询问邮寄地址。我们需要地址第 1 行,城市,州,邮编。您会将地址第 2 行移出流程,因为它是可选的?人们熟悉邮寄地址的结构,并希望以标准方式对其进行结构化。
    • 在这种情况下,地址第 2 行是例外,作为例外,它应该得到特殊处理。也许是一个禁用所需样式的类.not_required.required_fields label.not_required:after {content: ""}。似乎是从一般到具体的完美解决方案。
    【解决方案5】:

    这在 CSS 中是不可能的(正如我所尝试的那样)你可以在 JS 中轻松地做到这一点:

    let l = document.querySelectorAll('input[required]')
    l.forEach(e => {
      e ? e.parentElement.classList.add('required-input') : null;
    })
    

    let l = document.querySelectorAll('input[required]')
    l.forEach(e => {
      e ? e.parentElement.classList.add('required-input') : null;
    })
    .required-input label::after {
      content: " *";
      color: red;
    }
    <div>
      <label for="user">Required</label>
      <input name="user" required/>
    </div>
    <br>
    <div>
      <label for="user">not required</label>
      <input name="user" />
    </div>

    【讨论】:

      最近更新 更多