【问题标题】:How to style Disabled Options in a form如何在表单中设置禁用选项的样式
【发布时间】:2013-03-14 04:28:42
【问题描述】:

我正在使用带有下拉菜单的表单,其中包含禁用的某些选项,因此用户无法选择它们。我正在尝试通过 css 自定义这些元素,但 Chrome 和 IE7/8/9/10 存在一些问题。

HTML:

<div class="formBody">
    <select  name="form[categoria][]"  id="categoria"  class="rsform-select-box">
      <option selected="selected" value="">Scegli una categoria</option>
      <option disabled="disabled" value="">Impresa </option>
    </select>
    <span class="formValidation">
        <span id="component50" class="formNoError">Scegli una categoria</span>
    </span>
</div>

CSS:

select option[disabled] { color: #000; font-weight: bold }

此代码仅适用于 Firefox,不适用于 Chrome 和 IE(所有版本)。

有解决这个问题的办法吗?


选择框的html代码下方

<div class="formBody"><select  name="form[categoria][]"  id="categoria"  class="rsform-select-box" ><option selected="selected" value="">Scegli una categoria</option><option disabled="disabled" value="">Impresa </option><option  value="Servizi">Servizi</option><option  value="Informatica">Informatica</option><option  value="Commercio">Commercio</option><option  value="Telecomunicazioni">Telecomunicazioni</option><option  value="Editoria/Stampa">Editoria/Stampa</option><option  value="Meccanica/Elettrica">Meccanica/Elettrica</option><option  value="Alimentare">Alimentare</option><option  value="Chimica/Farmaceutica">Chimica/Farmaceutica</option><option disabled="disabled" value="">Edilizia </option><option  value="Tessile/Moda">Tessile/Moda</option><option  value="Mobili/Arredamenti">Mobili/Arredamenti</option><option  value="Alberghi/Ristoranti">Alberghi/Ristoranti</option><option  value="Trasporto/Logistica">Trasporto/Logistica</option><option  value="Finanza">Finanza</option><option  value="Altro">Altro</option><option disabled="disabled" value="">Professionista </option><option  value="Commercialista">Commercialista</option><option  value="Ragioniere">Ragioniere</option><option  value="Notaio">Notaio</option><option  value="Tributarista">Tributarista</option><option  value="Avvocato">Avvocato</option><option  value="Consulente del lavoro">Consulente del lavoro</option><option  value="Altro">Altro</option><option disabled="disabled" value="">P.A. Locale </option><option  value="Regione">Regione</option><option  value="Provincia">Provincia</option><option  value="Comune">Comune</option><option  value="Comunit&agrave; Montana">Comunit&agrave; Montana</option><option  value="ASL">ASL</option><option  value="CCIA">CCIA</option><option  value="Altro">Altro</option><option disabled="disabled" value="">P.A. Centrale </option><option  value="Associazione di categoria">Associazione di categoria</option><option  value="Privato">Privato</option><option  value="Altro">Altro</option></select><span class="formValidation"><span id="component50" class="formNoError">Scegli una categoria</span></span></div>

【问题讨论】:

标签: css forms


【解决方案1】:

有一种方法可以只使用 CSS。但是您需要调整您的 HTML 以遵循一些规则:

  • 将您的select 设置为required
  • 禁用的选项需要有空值字段:value=""
  • 您需要设置:valid:invalid 状态的样式

这里是标记:

<select required>
    <option value="" selected disabled>Disabled default</option>
    <option value="" disabled>Just disabled</option>
    <option value="" >Empty but valid</option>
    <option value="a-value-here">Fully valid</option>
</select>
select {
   width: 500px;
   padding: 10px;
}

select:invalid {
   background: red;
}

select:valid {
   background: green;
}

这里是小提琴:https://jsfiddle.net/james2doyle/hw1m2cd9/

现在,当一个选项为disabledvalue=""时,将应用:invalid 987654331。可以看到空值还是可以的。

如果只有select 支持pattern,那么我们可以改用正则表达式进行验证。在发表此评论时,它不支持且仅支持输入“文本”类型。

此解决方案应该适用于 IE >= 10

【讨论】:

    【解决方案2】:

    我使用一个简单的技巧将禁用的选项设置为灰色,希望有人觉得它有用。

    <label>
        <div id="disabledMask"></div>
        <select id="mySelect">
            <option disabled selected>Please Select</option>
            <option value="foo">Bar</option>
        </select>
    </label>
    
    <style>
        label {
            position: relative;
        }
    
        #disabledMask {
            position: absolute;
            background-color: #fff;
            opacity: 0.5;
            pointer-events: none;
            width: 100%;
            height: 100%;
            display: none;
        }
    </style>
    
    <script>
        var toggleMask = function(){
            var option = this.options[this.selectedIndex];
            var disabledMask = document.getElementById('disabledMask');
            disabledMask.style.display = option.disabled? 'block' : 'none';
        };
    
        var mySelect = document.getElementById('mySelect');
        mySelect.addEventListener('change', toggleMask);
        toggleMask.bind(mySelect)();
    </script>
    

    这是一个 jsfiddle:https://jsfiddle.net/jhavbzcx/

    免责声明:根据您选择的样式,您可能需要设置#disabledMask 的样式,以免与下拉箭头重叠。

    【讨论】:

      【解决方案3】:

      我使用 :invalid 来解决我的问题,描述如下:

      因此,这些答案确实设置了禁用选项的样式,但仅在下拉列表中。如果您想将列表顶部的禁用选项显示为“请选择”,则不是。

      希望这可以帮助其他遇到与我类似问题的人。

      基本上,选择需要是必填字段才能工作:

      <select required>
      

      假设选项位于列表顶部:

      <option disabled selected value="">Please select</option>
      

      你的 SCSS 看起来像这样:

      select {
      
        // The select element is set to required
        // as long as the selected options value
        // is empty the element is not valid.
        &:invalid {
          color: gray;
        }
      
        // Styling for browsers which do support
        // styling select option elements directly
        [disabled] {
          color: gray;
        }
      
        option {
          color: black;
        }
      }
      

      所以是 :invalid 允许我们为禁用的选定选项着色。

      感谢 Markus Oberlehner 的帖子:

      博文:https://markus.oberlehner.net/blog/faking-a-placeholder-in-a-html-select-form-field/

      Codepen:https://codepen.io/maoberlehner/pen/WOWrqO

      【讨论】:

      • 优秀的解决方案。
      【解决方案4】:
      <select class="dropdown" name="contactMethod">
      <option selected disabled>Contact method:</option>
      <option class="dropdownplus"> E-mail: </option>
      <option class="dropdownplus"> Website </option>
      <option class="dropdownplus"> None</option>
      </select>
      
      <style>
      .dropdown {
        background-color: rgba(195, 0, 97, 0.1);
        width: 100%;
        border: 1px solid #CC0061;
        border-style: inset;
        color: grey;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        padding: 10px;
        margin-top: 10px;
        margin-bottom: 10px;
        }
      
      option.dropdownplus {
        color: black;
      }
      </style>
      

      见imghttps://ibb.co/d9453b

      【讨论】:

      • 欢迎来到 Stack Overflow!感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 其长期价值,通过展示为什么这是解决问题的好方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
      【解决方案5】:
      <select>
          <option value="volvo" >Volvo</option>
          <option value="saab">Saab</option>
          <option value="vw" disabled>VW</option>
          <option value="audi" class="colr">Audi</option>
          <option value="aaa">Something</option>
          <option value="ccc">Other</option>
          <option value="vw" disabled>VW</option>
          <option value="vvv">Apple</option>
          <option value="nnn" class="colr">Mango</option>
          <option value="cmmmcc">Plum</option>
      </select>
      
      option:disabled {
         background: #ccc;
         width: 500px;
         padding: 5px;
         }
      
      option.colr {
         background: red;
         width: 500px;
         padding: 5px;
         }
      

      检查链接 http://jsfiddle.net/W5B5p/110/

      【讨论】:

      • 你需要在你的
      【解决方案6】:

      你要找的是这个:

      select option:disabled {
          color: #000;
          font-weight: bold;
      }
      

      Here, have a fiddle.

      注意:根据 cmets 部分的报告,此解决方案不适用于 OS X。

      【讨论】:

      • 刚刚在 Firefox 和 Chrome 中测试过,并且可以在两者上运行。
      • 你用的是什么版本?稳定我看到默认行为没有变化。
      • 刚刚在 Chrome 43.0.2357.65 m、Firefox 38.0.1 和 Firefox Developer Edition 40.0a2 (2015-05-24) 中测试,运行良好。
      • 刚刚在 IE、Chrome 和 Firefox 中测试过,在任何地方都能完美运行 :)
      • 如果您在将上述代码设置为白色 (#FFFFFF) 时遇到问题,此时又会使用禁用的灰色,请尝试将其更改为 #FFFFFE。出于某种原因,它会覆盖白色,但不会覆盖 99% 的白色。
      【解决方案7】:
      var select = document.getElementsByTagName("select");
      
      for(var i = 0;i < select.length; i++)
      {
      var el = select[i];
      var optVal = el.options[el.selectedIndex].value
      el.addEventListener('change', function () {
      // Using an if statement to check the class
          if (optVal == "") {
              el.classList.remove('not_chosen');
          } else {
              el.classList.add('not_chosen');
          }
      });
      }
      

      【讨论】:

      • 这到底是什么? CSS
      【解决方案8】:

      我认为您不能使用纯 CSS 定位 option 标记;你只能修改select标签。

      但是,有一些解决方法。见this question

      【讨论】:

      • 在 Firefox 中代码运行良好。我正在尝试找到适用于所有浏览器的替代选项。
      • 如果选项标签被禁用或者你已经添加了一个类,你可以定位它。我已经编辑了@JSW189 小提琴并更新了它jsfiddle.net/W5B5p/110
      • 小提琴中的颜色、背景和宽度样式仅适用于 OSX 上的 Firefox,不适用于 Chrome 或 Safari。但是,一些默认样式会应用于禁用的元素。
      猜你喜欢
      • 2018-04-10
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2014-04-04
      • 2014-11-10
      相关资源
      最近更新 更多