样式引导程序选择不同的“占位符”

Posted

技术标签:

【中文标题】样式引导程序选择不同的“占位符”【英文标题】:Style bootstrap-select "placeholder" differently 【发布时间】:2019-09-17 09:03:57 【问题描述】:

如果选择的选项是 jQuery 的第一个(占位符),我已经成功地为我的正常选择元素应用了不同的样式:

<script type="text/javascript">
        $(document).ready
        (
            function () 
            
                $('select').each(function (index, value)
                
                    if($(this).val()==="")
                     
                        $(this).css('font-style', 'italic');
                        $(this).css('color', '#636c72');
                        $(this).children().css('font-style', 'normal');   
                    
                    else
                    
                        $(this).css('font-style', 'normal');
                        $(this).css('color', 'black');
                        $(this).children().css('font-style', 'normal');    
                    
                );
            
        );
    </script>

但是,我的一些表单正在使用 bootstrap-select 组件,因为它们包含大量的条目(可能有数千个),并且有必要通过文本搜索来缩小条目的范围。这些组件会产生更复杂的 html,上面的代码根本不起作用。

我正在尝试找到一种方法来应用与我的正常选择相同的逻辑:如果选择的选项是第一个,则将输入设置为斜体并使用不同的颜色。以下是此类选择的示例:

<select class="form-control selectpicker" id="medFilter" name="medFilter" th:value="$medFilter"
                                            onchange="this.form.submit()" data-live-search="true" title="Select Med"> 
                                            <option value="">Search Med</option>
                                            <option th:each="med : $meds" th:value="$med.id" 
                                                th:text="$med.toString()" th:selected="$med.id == medFilter">
                                                </option>
                                        </select>

有没有人能够做到这一点?

【问题讨论】:

为什么不用 CSS 做这一切? 【参考方案1】:

问题是 - bootstrap-select&lt;select&gt; 替换为 &lt;button&gt; 和 option> 替换为 &lt;a&gt;

这使您的代码有问题有两个原因:

    您尝试(并且可能成功)设置 hidden 元素的样式(因为 optionselect 在 selectpicker 启动后立即被隐藏。) 您正在绑定到document.ready,而不是引导选择的初始化。

使用 CSS 设置新元素而不是旧元素的样式:

a.placeholder, button.bs-placeholder 
  font-style: italic !important;
  color: #636c72;

HTML(请注意,bs-placeholder 类对于 bootstrap-select 是开箱即用的,当它没有值时,您不需要添加它。):

<select required class="form-control selectpicker" id="medFilter" name="medFilter" title="Select Med">
      <option class="placeholder" selected value="">Search Med</option>
      <option value="med-1">Med 1</option>
      <option value="med-2">Med 2</option>
</select>

只要它可以用 css 存档,我会放弃 document.ready 样式方法。

Plunkr:https://plnkr.co/edit/EAbTMz1WQnFWwtLsmYbZ?p=preview

【讨论】:

你先生是大佬!【参考方案2】:
$('select[name=medFilter] option:eq(1)')

使用此选择器并将您的 css 代码应用于此并设置为占位符。

这将始终选择第 n 个元素(你传入的选项:eq(1))

希望这会奏效。 :)

【讨论】:

【参考方案3】:

你可以用纯 css 来做这一切,它会比用 js 更容易管理。如果选择的选项是第一个,则以下样式的输入以斜体和不同的颜色显示。

我给出了两个例子,一个带有 disabled 和 hidden 属性,另一个没有 disabled 和 hidden 属性。

select option 
  color: #000000;
  font-style: normal;


select:invalid, select option[value=""] 
  color: red; /* Or any color you want */
  font-style: italic;


.form-control 
  margin: 20px 0px;
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css" />

<select required class="form-control selectpicker" id="medFilter" name="medFilter" title="Select Med">
  <option selected value="">Search Med</option>
  <option value="med-1">Med 1</option>
  <option value="med-2">Med 2</option>
  </option>
</select>
<select required class="form-control selectpicker" id="medFilter2" name="medFilter2" title="Select Med 2">
  <option selected disabled hidden value="">Search Med - Another</option>
  <option value="med-1">Med 1</option>
  <option value="med-2">Med 2</option>
  </option>
</select>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>

【讨论】:

【参考方案4】:

要达到预期结果,请使用以下选项

选项1:使用CSS,设置颜色和字体样式选择标题并选择第一个选项

select[title]
  color: green;
  font-style: italic;
<select class="form-control selectpicker" id="medFilter" name="medFilter" th:value="$medFilter"
                                            onchange="this.form.submit()" data-live-search="true" title="Select Med"> 
                                            <option value="">Search Med</option>
                                            <option value="A">AA</option>
                                        </select>

选项 2: 使用添加类 jquery 选择标题和选项第一个子项

$("select[title]").addClass('selectStyle')
.selectStyle
  font-style: italic;
  color: green;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select class="form-control selectpicker" id="medFilter" name="medFilter" th:value="$medFilter"
                                            onchange="this.form.submit()" data-live-search="true" title="Select Med"> 
                                            <option value="">Search Med</option>
                                            <option value="A">AA</option>
                                        </select>

codepen - https://codepen.io/nagasai/pen/qGrqPR

【讨论】:

由于某种原因,当我为我选择第一个选项时,这只会设置列表中的实际选项,而不是选择元素本身。 这是因为 .selectStyle 被添加到 Naga 代码中的 option 中,然后 bootstrap-select 将其复制到它在初始化时创建的 &lt;a&gt; 元素中。它与select 的工作方式不同。请参考我的回答。 @Martin,更新了我对仅样式选择选项的回答

以上是关于样式引导程序选择不同的“占位符”的主要内容,如果未能解决你的问题,请参考以下文章

引导日期时间选择器样式未正确应用

如何将样式仅应用于引导程序中的特定屏幕类型

在 Laravel 4 中使用 HTML 占位符

在引导程序中禁用输入。如何将其应用于不同的 TAG?

使用引导程序根据设备大小在元素上应用边框

限制引导程序样式的范围