切换CSS与单选框不兼容

5

我有一个开关按钮,但它不能与单选框(input type radio)一起使用。如果我尝试使用复选框按钮(checkbox),它可以工作。为什么?如何解决这个问题并保留单选框输入方式?

@charset "utf-8";
/* CSS Document */

/* ---------- GENERAL ---------- */

body {
 background: #4a4a4a;
 color: #151515;
 font: 100%/1.5em "Lato", sans-serif;
 margin: 0;
}

input {
    font-family: inherit;
    font-size: 100%;
    line-height: normal;
    margin: 0;
}

input[type="radio"] {
    box-sizing: border-box;
    padding: 0;
}

/* ---------- SWITCH ---------- */

.container {
 height: 64px;
 left: 50%;
 margin: -32px 0 0 -80px;
 position: absolute;
 top: 50%;
 width: 160px;
}

.switch {
 background: #fff;
 border-radius: 32px;
 display: block;
 height: 64px;
 position: relative;
 width: 160px;
}

.switch label {
 color: #fff;
 font-size: 48px;
 font-weight: 300;
 line-height: 64px;
 text-transform: uppercase;
 -webkit-transition: color .2s ease;
 -moz-transition: color .2s ease;
 -ms-transition: color .2s ease;
 -o-transition: color .2s ease;
 transition: color .2s ease;
 width: 100px;
}

.switch label:nth-of-type(1) {
 left: -75%;
 position: absolute;
 text-align: right;
}

.switch label:nth-of-type(2) {
 position: absolute;
  right: -75%;
 text-align: left;
}

.switch input {
 height: 64px;
 left: 0;
 opacity: 0;
 position: absolute;
 top: 0;
 width: 160px;
 z-index: 2;
}

.switch input:checked~label:nth-of-type(1) { color: #fff; }
.switch input:checked~label:nth-of-type(2) { color: #808080; }

.switch input~:checked~label:nth-of-type(1) { color: #808080; }
.switch input~:checked~label:nth-of-type(2) { color: #fff; }

.switch input:checked~.toggle {
 left: 4px;
}

.switch input~:checked~.toggle {
 left: 100px;
}

.switch input:checked {
 z-index: 0;
}

.toggle {
 background: #4a4a4a;
 border-radius: 50%;
 height: 56px;
 left: 0;
 position: absolute;
 top: 4px;
 -webkit-transition: left .2s ease;
 -moz-transition: left .2s ease;
 -ms-transition: left .2s ease;
 -o-transition: left .2s ease;
 transition: left .2s ease;
 width: 56px;
 z-index: 1;
}

.c-window{
  display: block;
  position: absolute;
  width: 235px;
  height: 235px;
  margin: 0 auto;
  border-radius: 100%;
  border: 8px solid #FFB399;
  background: #5ddfe8; 
  box-shadow: 0px 0px 5px rgba(0,0,0,0.25) inset;
  overflow: hidden;
 transition: background 1s ease-in-out;
}


input[type="radio"]:checked ~ .c-window {
  background: #111;
}
 
 <div class="container">

       <div class="c-window"></div>
      
  <div class="switch white">

   <input type="radio" name="switch" id="switch-off">
   <input type="radio" name="switch" id="switch-on" checked>

   <label for="switch-off">On</label>
   <label for="switch-on">Off</label>

   <span class="toggle"></span>


  

  </div> <!-- end switch -->

 </div> <!-- end container -->

我希望当.c-window切换时,背景颜色能够改变。

1
您有一些拼写错误,如 .switch input~:checked.switch input~:checked~.toggle。此外,input[type="radio"]:checked ~ .c-window 不起作用,因为它们不是兄弟关系。 - Fabrizio Calderan
我编辑了.switch input:checked ~ .c-window {background: #111;},但它还没有生效。 - panagulis72
1
但是你的input:checked和.c-window并不是兄弟元素。更多信息请参见https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_selectors。 - Fabrizio Calderan
我将c-window放在输入框下面,理论上它们现在是兄弟元素。但如果我这样做并刷新页面,圆圈立即变成黑色背景,并且不会改变。 - panagulis72
如果您对上面的代码进行了更改,请将您修改后的代码放在fiddle中,以便我们看到相同的内容。 - Fabrizio Calderan
3个回答

1
  • 你有几个错别字,如@fcalderan在评论中所提到的。
  • 你需要将.c-window作为同级元素,更改HTML标记并添加z-index:-1
  • 你需要指定哪个input会更改background颜色。

/* CSS Document */

/* ---------- GENERAL ---------- */

body {
  background: #4a4a4a;
  color: #151515;
  font: 100%/1.5em"Lato", sans-serif;
  margin: 0;
}
input {
  font-family: inherit;
  font-size: 100%;
  line-height: normal;
  margin: 0;
}
input[type="radio"] {
  box-sizing: border-box;
  padding: 0;
}
/* ---------- SWITCH ---------- */

.container {
  height: 64px;
  left: 50%;
  margin: -32px 0 0 -80px;
  position: absolute;
  top: 50%;
  width: 160px;
}
.switch {
  background: #fff;
  border-radius: 32px;
  display: block;
  height: 64px;
  position: relative;
  width: 160px;
}
.switch label {
  color: #fff;
  font-size: 48px;
  font-weight: 300;
  line-height: 64px;
  text-transform: uppercase;
  -webkit-transition: color .2s ease;
  -moz-transition: color .2s ease;
  -ms-transition: color .2s ease;
  -o-transition: color .2s ease;
  transition: color .2s ease;
  width: 100px;
}
.switch label:first-of-type {
  left: -75%;
  position: absolute;
  text-align: right;
}
.switch label:last-of-type {
  position: absolute;
  right: -75%;
  text-align: left;
}
.switch input {
  height: 64px;
  left: 0;
  opacity: 0;
  position: absolute;
  top: 0;
  width: 160px;
  z-index: 2;
}
.switch input:checked~label:first-of-type {
  color: #fff;
}
.switch input:checked~label:last-of-type {
  color: #808080;
}
.switch input:checked~label:first-of-type {
  color: #808080;
}
.switch input:checked~label:last-of-type {
  color: #fff;
}
.switch input:checked {
 z-index: 0;
}
.switch input:checked~.toggle {
  left: 4px;
}
.switch input~:checked~.toggle {
  left: 100px;
}
.toggle {
  background: #4a4a4a;
  border-radius: 50%;
  height: 56px;
  left: 0;
  position: absolute;
  top: 4px;
  -webkit-transition: left .2s ease;
  -moz-transition: left .2s ease;
  -ms-transition: left .2s ease;
  -o-transition: left .2s ease;
  transition: left .2s ease;
  width: 56px;
  z-index: 1;
}
.c-window {
  display: block;
  position: absolute;
  width: 235px;
  height: 235px;
  margin: 0 auto;
  border-radius: 100%;
  border: 8px solid #FFB399;
  background: #5ddfe8;
  box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.25) inset;
  overflow: hidden;
  transition: background 1s ease-in-out;
  z-index:-1
}
input:last-of-type[type="radio"]:checked ~ .c-window {
  background: #111;
}
<div class="container">
 
  <div class="switch white">
    <input type="radio" name="switch" id="switch-off">
    <input type="radio" name="switch" id="switch-on" checked>
    <label for="switch-off">On</label>
    <label for="switch-on">Off</label>
    <span class="toggle"></span>
    <div class="c-window"></div>
  </div>
  <!-- end switch -->
</div>
<!-- end container -->


0
如果你想使用~选择器,你的代码应该像这样写:

body, html {
  margin: 0;
  padding: 0;
}

.content {
  display: flex;
  height: 100vh;
  align-items: center;
  justify-content: center;
  position: relative;
}

.c-window {
  position: absolute;
  transition: all 0.3s ease-in;
  width: 235px;
  height: 235px;
  border-radius: 50%;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  background: #aaa;
  border: 5px solid black;
  z-index: 1;
}

input {
  position: relative;
  z-index: 2;
}

#switch-off:checked ~ .c-window  {
  background: blue;
}

#switch-on:checked ~ .c-window  {
  background: #aaa;
}
<div class="content">
  <input type="radio" name="switch" id="switch-off">
  <input type="radio" name="switch" id="switch-on" checked>
  
  <div class="c-window"></div>
</div>


0

你不能用JavaScript/jQuery做吗?

HTML:

<div class="container">

   <div class="c-window"></div>

    <div class="switch white">

        <input type="radio" name="switch" value="0" id="switch-off" class="switch">
        <input type="radio" name="switch" value="1" id="switch-on" class="switch" checked>

        <label for="switch-off">On</label>
        <label for="switch-on">Off</label>

        <span class="toggle"></span>

    </div> <!-- end switch -->

</div> <!-- end container -->

jQuery(捕获更改事件):

    $(document).ready(function(){
$('.switch').on('change', function(ev){
if ($(this).val() == 0){
//do some stuff you want when off
}else{
//do some stuff you want when on
}
});
});

1
OP没有提到JavaScript或jQuery。 - Fabrizio Calderan
@NagyIstvan 请查看我的回答。 - dippas
1
正确使用:checked 伪类,就像 OP 尝试做的那样(也请参考之前的回答)。 - Fabrizio Calderan

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