如何在没有样式化所有其他选项的情况下使用 CSS 样式选择选项?

Posted

技术标签:

【中文标题】如何在没有样式化所有其他选项的情况下使用 CSS 样式选择选项?【英文标题】:How style selected option with CSS without styling all the other options? 【发布时间】:2012-08-26 13:28:18 【问题描述】:

如何将 CSS 背景颜色仅应用于所选选项?如果我将一个类应用于选择对象,它会设置所有选项的样式。如果我将所需的类应用于选项,我可以在扩展“选择”框时,可以看到所有选项的样式精细。但是,当“选择”框折叠时,所选选项的样式消失。我在最新版本的 Chrome 和 Firefox 中观察到了这种行为。

这是一些超级基本的示例代码。如果没有 jQuery,所选选项始终显示为无样式。使用 jQuery,一旦选择了“已修改”选项,所有选项的样式都将被设置为“已修改”。我一直无法找到解决这个问题的方法...有什么想法吗?

我不想更改选项的样式。只有在选择任何给定选项时才能看到其样式,而不会覆盖其他选项的样式。

<style>
  select.modified,
  option.modified
    background-color: red;
  
</style>

<select id="example">
  <option value="bird" class="modified">bird</option>
  <option value="cat">cat</option>
  <option value="dog" class="modified">dog</option>
</select>

<script>
  $('#example').on('change',function()
    $(this).prop('class',$(this).find('option:selected').prop('class'));  
  );
</script>

【问题讨论】:

你的意思是option.modified 浏览器的特点是难以为复选框、单选按钮和多选/选择等元素设置样式。通常,解决方法是隐藏实际的表单元素,并在其旁边放置一个可样式化的交互式div 在某些浏览器(即 chrome + linux)中存在错误,这使得 &lt;option&gt; 无法从 &lt;select&gt; 继承背景,因此您应该始终(在设置选择背景时)为所有选项设置它. 【参考方案1】:

试试这个:

$('#example').on('change',function()
   $(':selected', this).addClass('modified').siblings().removeClass('modified')
);

option.modified
   background-color: red;

FIDDLE

【讨论】:

啊,.siblings()很好用。以前我需要它的时候从来没有打动过我! +1! 我不想更改各个选项的样式。这是在呈现选择框时由其他东西设置的。我只希望能够在选择选项时看到它的样式,而不是从本质上覆盖所有其他选项的样式。【参考方案2】:
select option.modified  color: red; /*something*/ 

$('#example').on('change', function()
    $(this).find('option').removeClass('modified');
    $(this).find('option:selected').addClass('modified');
);

【讨论】:

就像我上面说的,我不想改变选项的样式。我只是希望能够在选择一个选项时看到它的样式,显然 Chrome 和 Firefox 不这样做。 @DouglasMauch:所以使用不同的class 作为默认的option 样式,并仅将.modified 用于它应该做的事情。【参考方案3】:

您的事件在整个selected#example 列表中,因此它的所有选项自然会获得背景,因为它们位于选择中。尝试将您的事件绑定到选项标签。

另外,您的第二条规则将颜色应用于所有选项标签和虚构的modified 标签。通过将 , 替换为 .,您将按照您的意思行事 - 只有带有 modified 类的选项。

【讨论】:

逗号是错字,应该是 CSS 选择器中的 option.modifed【参考方案4】:

好吧,在阅读了 cmets 之后,我认为您真的想要这些方面的东西。

$('#example').on('change', function() 
    console.log(this.options[this.selectedIndex].style);
);​

或者没有 jQuery

document.getElementById('example').onchange = function() 
    console.log(this.options[this.selectedIndex].style);
;

这将为您提供所有当前规则的CSSStyleDeclaration。请记住,十六进制值以 rgb 形式返回。

演示:http://jsfiddle.net/rlemon/Qu5Xa/1/

或者另一种选择是返回 className....

document.getElementById('example').onchange = function() 
    console.log(this.options[this.selectedIndex].className);
;

或 jQuery

$('#example').on('change', function() 
    $(this.options[this.selectedIndex]).attr('class'); // however I would still not even bother wrapping this up in jQuery and just use this.options[this.selectedIndex].className
);​

【讨论】:

【参考方案5】:

我找到了解决此问题的最佳方法。基本上我必须从选定的焦点选项中删除任何类,并将其添加回模糊的那些类。这似乎可以很好地解决问题。

<script>
  $('#example').on('change',function()
    // do whatever needs to be done
    $(this).blur();
  ).on('focus',function()
    $(this).removeClass($(this).find('option:selected').prop('class'));
  ).on('blur',function()
    $(this).addClass($(this).find('option:selected').prop('class'));
  );
</script>

【讨论】:

以上是关于如何在没有样式化所有其他选项的情况下使用 CSS 样式选择选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Typescript 在不丢失任何道具的情况下键入样式组件?

样式化 HTML 选择 [重复]

使用样式化组件/CSS 在表格内居中

如何在InDesign文档中找到所有对象样式覆盖

即使没有内容,如何强制 antd 选项卡全高(使用 React 和样式化组件)

Confluence 6 中样式化字体