reactjs 在CSS中,< label>为选定的选择父< input>级

idfiyjo8  于 2023-03-08  发布在  React
关注(0)|答案(3)|浏览(113)

编辑:显然不能使用〈〉大括号或它隐藏名称?
我已经看到了这个问题的一些变体,但是没有一个符合我的特定问题,我认为这是一个简单的问题。我在react中创建了下面的单选按钮组:

const myOptions = ["YTD", "Week", "Month", "Pre AS", "Post AS"]
    const myButtons =
        <form>
            <div className="radio-group">
                {myOptions.map((d, i) => {
                    return (
                        <label>
                            <input
                                type={"radio"}
                                value={myOptions[i]}
                                checked={timeframeNew === myOptions[i]}
                                onChange={this.handleTimeframeNewChange}
                            />
                            <span>{myOptions[i]}</span>
                        </label>
                    )
                })}
            </div>
        </form>;

这里是我目前的CSS样式的按钮看起来不错...

input[type=radio] { 
  position: absolute;
  visibility: hidden;
  display: none;
}

label {
  color: #333;
  background: #EEE;
  display: inline-block;
  cursor: pointer;
  font-weight: bold;
  padding: 5px 20px;
  border: 2px solid orange;
}

input[type=radio]:checked + label {
  color: red;
  background: #333;
}

label + input[type=radio] + label {
  border-left: solid 2px blue;
}

.radio-group {
  border: solid 2px green;
  display: inline-block;
  margin: 20px;
  border-radius: 10px;
  overflow: hidden;
}

不幸的是,CSS没有按预期工作。特别是,下面的选择-input [type = radio]:checked + label不起作用,因为没有紧接在 * input * 后面的 * label *。到目前为止,我成功地让react onChange处理函数工作的唯一方法是将input放在label内部,就像这样,然后在每个. map循环中返回 * label *。

  • 由于返回值必须是单个元素,如果我想从 * label * 中取出,我需要将它们都包含在 * div * 或 * span * 中,由于某种原因,这样做会破坏我的onChange处理程序...

所以我的问题是,如何如何我可以,在CSS中,抓住 * 标签 *,对应于点击的 * 输入 *。我想改变整个标签的颜色和背景时,它是/不是点击,所以选择跨度没有帮助(因为这只改变文本的颜色/背景,而不是整个标签)。
提前感谢!!

brvekthn

brvekthn1#

CSS可以选择子元素和兄弟元素,但不能选择父元素。我经常隐藏默认的单选按钮和复选框,并创建自己的,如下所示:

.button-group{
  font-size:0; /*Prevents a space from occuring between buttons*/
}
.button-group input{
  position:absolute; 
  visibility:hidden; /* display:none causes some browsers to ignore the input altogether */
}
.button-group input+span{
  display:inline-block;
  line-height:20px;
  font-size:1rem;
  vertical-align:top;
  padding:0 10px;
  color:#000;
  border-left:1px solid #a00;
}
.button-group label:first-child input+span{
  border-radius:10px 0 0 10px;
  border-left:0;
}
.button-group label:last-child input+span{
  border-radius:0 10px 10px 0;
}
.button-group input:not(:checked)+span{
  background-color:#faa;
}
.button-group input:not(:checked)+span:hover{
  background-color:#f66;
}
input[type=radio]:checked+span{
  background-color:#f33;
}
<div class="button-group">
  <label>
    <input type="radio" value="1" name="myfield" />
    <span>Option 1</span>
  </label>

  <label>
    <input type="radio" value="2" name="myfield" />
    <span>Option 2</span>
  </label>

  <label>
    <input type="radio" value="3" name="myfield" />
    <span>Option 3</span>
  </label>
</div>
wz1wpwve

wz1wpwve2#

  • 由于返回值必须是单个元素,如果我想从标签中取出,我需要将它们都包含在div或span中,出于某种原因,这样做会破坏我的onChange处理程序...

可以使用<React.Fragment> <input /> <span /> </ReactFragment>返回多个元素,而无需在div或span中呈现它们

eqzww0vc

eqzww0vc3#

使用:has-selector时,只有CSS可以实现此目的
示例:

<label>
  Option 1
  <input type="radio" name="foo" value="1" />
</label>

<label>
  Option 2
  <input type="radio" name="foo" value="2" />
</label>
label:has(input:checked) {
  background: red;
}

相关问题