基于HTML Select选项值的CSS选择另一个元素

30

有没有CSS选择器可以根据HTML select选项值选择元素?

<select>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>

<p>Display only if an option with value 1 is selected</p>

我正在寻找一种仅使用HTML/CSS的方法来仅显示所选数量的表单字段。我已经知道如何使用JavaScript完成此操作。

有没有办法实现这个功能?


编辑:

问题标题可能有误导性。我并不是试图为选择框设置样式,这在SO上已经很常见并且有很多答案。我实际上是想根据在


可能重复:https://dev59.com/YXI-5IYBdhLWcg3wW3Cp - Mark
你可以使用属性选择器来选择它,例如 option[value="1"],但浏览器支持并不是很好,Firefox 可以添加样式,但 Chrome 不行。我认为没有办法在没有 JavaScript/jQuery 的情况下根据所选选项显示段落。 - ferne97
这里有一个测试,展示哪些浏览器支持属性选择器 - http://dev.l-c-n.com/CSS3-selectors/browser-support.php - klewis
6个回答

24

1
他不想在那个值上显示一个div而不是对其进行样式设置吗? - Praveen Puglia
2
更新的问题:我不是真正地想选择选项元素,而是想根据所选选项选择p元素。 - hannson

3

3
你可以使用 select option[value="1"],但是浏览器支持并不完美。

他并不是指选择器的浏览器支持,而是指对于select和option标签的样式。 - Luca Steeb

2
下面的替代方案怎么样?
你不会得到一个

1
我相信在“实时”或“即时”的情况下,只有使用JavaScript或jQuery才可能实现。将潜在隐藏字段包装在具有display: none onLoad的div中,并使用JS或jQuery更改状态为display: block或其他您喜欢的方式。
//Show Hide based on selection form Returns
$(document).ready(function(){

//If Mobile is selected
$("#type").change(function(){
    if($(this).val() == 'Movil'){
     $("#imeiHide").slideDown("fast"); // Slide down fast
    } else{
     $("#imeiHide").slideUp("fast"); //Slide Up Fast
    }
});

//If repairing is selected
$("#type").change(function(){
if($(this).val() == 'repairing'){


$("#problemHide").slideDown("fast"); // Slide down fast
$("#imeiHide").slideDown("fast"); // Slide down fast
}else{
$("#problemHide").slideUp("fast"); //Slide Up Fast
}
});
});
// type is id of <select>
// Movil is option 1
// Repairing is option 2
//problemHide is div hiding field where we write problem
//imeiHide is div hiding field where we write IMEI

我在我的一个应用程序中使用...

使用PHP也是可能的,但是使用PHP,您将不得不发送更改请求或编写一个代码,在php中加载某些类,基于已经选择的值,例如

<select class="<?php if($valueOne == 'Something'){echo 'class1';}else{echo 'class2';}">
   <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>

0

我发现基于这个答案的解决方案最符合OP的要求。虽然不是纯CSS,但涉及的JavaScript最少。

select[data-chosen='1']~.stuff-1{ 
    display: block !important;
}

select:not([data-chosen='1'])~.stuff-1{ 
    display: none;
}

select[data-chosen='2']~.stuff-2{ 
    display: block !important;
}

select[data-chosen='3']~.stuff-3{ 
    display: block !important;
}
<select name="number-of-stuffs" data-chosen = "1" onchange = "this.dataset.chosen = this.value;">
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
</select>
<div class="stuff-1">
  <span> I am stuff-1!</span>
  <input type="text" name="stuff-1-detail">
  <input type="text" name="stuff-1-detail2">
</div>
<div class="stuff-2" style="display:none"> 
  <span> I am stuff-2!</span>
  <input type="text" name="stuff-2-detail">
  <input type="text" name="stuff-2-detail2">
</div>
<div class="stuff-3" style="display:none">
  <span> I am stuff-3!</span>
  <input type="text" name="stuff-3-detail">
  <input type="text" name="stuff-4-detail2">
</div>

你甚至不需要编写任何分离的js,尽管在onchange中嵌入"this.dataset.chosen = this.value;"似乎有点hacky。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接