CSS - 伪类

CSS 伪类 :invalid 表示一个元素(例如 <form>、<fieldset> 或 <input>),其内容或值根据 type 属性中指定的类型无效,或无法验证。

例如,电子邮件输入、 <input type="email"> 其值与有效电子邮件模式不匹配或数字输入 <input type="number"> 具有包含字母的值。这两种情况都是无效的。

伪类 :invalid 在向用户指示字段错误时很有用。

  • 使用 :out-of-range 伪类应用的任何样式都会覆盖使用 :invalid 伪类应用的样式。适用于 <input type="number">。

  • :无效的伪类可以与其他选择器一起使用,例如 :hover、:focus 等。

  • 对于单选按钮,如果需要其中一个按钮,则 :invalid 伪类将应用于所有单选按钮。

  • Gecko 不会将样式应用于:无效的伪类。但是,Gecko 确实将样式应用于 :user-invalid 伪类。

可访问性问题:对于无效输入,默认使用的颜色是红色,这对于有一定色盲状态的人来说可能会有些困难。相反,建议在无效输入中添加图标或描述性文本,以便更容易理解。

语法

:invalid {
    /* ... */
} 

CSS :invalid 示例

以下示例演示了在输入字段上使用 :invalid 伪类的使用。这里我们看到当字段中的数据无效时,要么不在指定范围内,要么不正确,背景颜色会发生变化。

<html>
<head>
<style>
   .container {
      margin: 40px auto;
      max-width: 700px;
   }

   p {
      font-size: 1.5em;
   }

   input {
      display: block;
      width: 50%;
      height: 2em;
      background-color: lightgray;
   }

   input:invalid {
      background-color: tomato;
   }

   input[type="number"]:invalid {
      background-color: orange;
   }

   input:invalid:focus {
      outline: 0;
      border: none;
      box-shadow: 0 0 5px 5px rgba(0, 136, 255, 0.3);
   }
</style>
</head>
<body>
   <div class="container">
      <p>
        输入类型为 1 到 10 之间的数字。
      </p>
      <input type="number" min="1" max="10" value="2">

      <p>
        输入类型为电子邮件,这是必需的。 如果为空则无效。
      </p>
      <input type="email" required>
    </div>
</body>
</html> 

在上面的例子中:

  • 提供了两个输入字段,一个是数字类型,另一个是电子邮件类型。

  • 带有数字的输入字段,提供 CSS 样式,这样如果该值不是数字且不在 1 到 10 范围内,则将其标记为无效。

  • 电子邮件输入字段如果不遵循,则将其标记为无效电子邮件模式或空。

  • 另一个伪类 :focus 与 :invalid 一起使用,这样当无效字段具有焦点时,就会应用 CSS 样式。

以下示例演示了在字段集上使用 :invalid 伪类的情况。输入字段和按钮的可见性保持隐藏,直到输入为空或不正确。

<html>
<head>
<style>
   /* 将无效字段集的可见性设置为隐藏 */
   fieldset:invalid ~ fieldset {
      visibility: hidden;
   }

   /* 当字段集具有无效值时禁用按钮 */
   form:invalid button {
      background-color: darkgrey;
      opacity: 0.2;
   }

   input,
   textarea {
      box-sizing: border-box;
      width: 500px;
      font-family: monospace;
      padding: 0.25em 0.5em;
   }

   button {
      width: 200px;
      border: thin solid darkgrey;
      font-size: 1.25em;
      background-color: green;
      color: white;
      position:relative;
   }
</style>
</head>
<body>
   <form>
      <fieldset>
        <label for="userid">用户ID</label><br />
        <input type="text" name="userid" id="userid" required />
      </fieldset>
   
      <fieldset>
        <label for="email">Email</label><br />
        <input type="email" name="email" id="email" required />
      </fieldset>
    
      <button type="submit" name="send">提交</button>
    </form> 
</body>
</html> 

在上面的示例中:

  • 有两个字段集,每个字段集都有一个标签和输入元素,一个用于用户 ID,另一个用于电子邮件。

  • 第二个字段集保持隐藏状态,直到未传递有效值为止在第一个中。

  • 直到两个字段集都具有有效值之前,按钮保持禁用状态。

  • 输入元素是设置为必填,因此用户需要输入有效的内容,然后才能看到表单的其余部分并对其进行操作。