Tailwind CSS 更改占位符选项的文本颜色

use*_*338 8 html css html-select tailwind-css

我有一个项目,我需要在表单中使用选择。所有其他类型的输入都有一个浅灰色的占位符。输入中输入的文本是黑色的。

表单的选择输入需要具有相同的样式。默认/占位符值需要以深灰色显示,用户可以选择的实际值需要以黑色显示。但是当我尝试为第一个(默认/占位符)选项指定不同的颜色时,它不使用这种颜色。它实际上继续使用选择元素中指定的颜色。

这是元素内的选择:

 <select
        type="text"
        name="carType"
        id="carType"
        v-model="carType"
        placeholder="Car Type"
        class="my-2 px-4 py-3 border rounded-lg text-black-primary focus:outline-none text-sm"
      >
        <option class="text-gray-400" value="" disabled selected>Select your option</option>
        <option value="volvo">Volvo</option>
        <option value="saab">Saab</option>
        <option value="mercedes">Mercedes</option>
        <option value="audi">Audi</option>
</select>
Run Code Online (Sandbox Code Playgroud)

Zso*_*ros 15

使用普通 CSS 也可能很棘手,但有一个解决方法。如果它是必填字段,您可以将该required属性添加到select元素中,并使用:invalid伪类将其设置为占位符。这个想法是,如果第一个选项用作占位符,则默认情况selecteddisabled,该表单字段无效,因此您可以将其设置为这样的样式。

在下面的代码片段中,我只添加一个required属性并:invalid直接设置类的样式,这并不是真正的 Tailwind-y,但它可以工作:

@import url("https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css");

:invalid {
  color: rgba(156, 163, 175, 1);
}
Run Code Online (Sandbox Code Playgroud)
<select
  type="text"
  id="carType"
  class="my-2 px-4 py-3 border rounded-lg text-black-primary focus:outline-none text-sm"
  name="carType"
  required
  v-model="carType"
>
  <option value="" disabled selected>Select your option</option>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>
Run Code Online (Sandbox Code Playgroud)

定制 Tailwind 2 变体

以下仅与Tailwind 2相关,Tailwind 3已添加invalid:实用程序

尽管 Tailwind 有hover:focus:disabled:等实用程序,但不幸的是它没有invalid:。如果您想使用该invalid:text-gray-400变体,则需要创建一个插件。幸运的是,文档有一个很好的示例,可以用作我们的基础:

// tailwind.config.js
const plugin = require('tailwindcss/plugin');

module.exports = {
  variants: {
    textColor: ({ after }) => after(['invalid']),
  },
  plugins: [
    plugin(function ({ addVariant, e }) {
      addVariant('invalid', ({ modifySelectors, separator }) => {
        modifySelectors(({ className }) => {
          return `.${e(`invalid${separator}${className}`)}:invalid`;
        });
      });
    }),
  ],
};
Run Code Online (Sandbox Code Playgroud)

invalid:text-gray-400现在您可以像在元素中一样使用该类select,并摆脱自定义 CSS 样式:

<select
  type="text"
  id="carType"
  class="my-2 px-4 py-3 border rounded-lg text-black-primary invalid:text-gray-400 focus:outline-none text-sm"
  name="carType"
  required
  v-model="carType"
>
  <option value="" disabled selected>Select your option</option>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>
Run Code Online (Sandbox Code Playgroud)

Vue 条件类

当您使用 Vue 时,第三种选择是使用条件类。只需在两个类之间切换,text-gray-400text-black-primary基于 的值即可carType

  • 更新:在 tailwindcss v3 中,您不需要额外的插件,所有伪类都包含在内。更多 https://tailwindcss.com/docs/hover-focus-and-other-states (6认同)
  • 这是一个很棒的答案!您的自定义插件完美运行。谢谢 :) (3认同)