【问题标题】:How to change the CSS of the active toggle button using pseudo CSS transitions如何使用伪 CSS 过渡更改活动切换按钮的 CSS
【发布时间】:2017-01-22 02:54:27
【问题描述】:

我的网页上有多个切换按钮。我正在使用带有一些 CSS 的 checkbox 输入控件来获得材质切换按钮设计。当我更改任何切换按钮的状态时,CSS 效果会反映在第一个切换按钮上。我如何将效果仅应用于活动切换。

<div>
  <div class="material-toggle">
    <input type="checkbox" id="toggle" name="toggle" checked=true class="switch" />
    <label for="toggle" class=""></label>
  </div>
  <div class="material-toggle">
    <input type="checkbox" id="toggle" name="toggle" checked=true class="switch" />
    <label for="toggle" class=""></label>
  </div>
</div>

这是我正在使用的 CSS。

.material-toggle {
  height: 22px;
  width: 40px;
  margin: 12px;
}

.material-toggle input:empty {
    margin-left: -9999px;
}

.material-toggle input:empty ~ label {
    position: relative;
    float: left;
    width: 150px;
    cursor: pointer;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

.material-toggle input:empty ~ label:before, 
.material-toggle input:empty ~ label:after {
  position: absolute;
    display: block;
  content: ' ';
  -webkit-transition: all 250ms cubic-bezier(.4,0,.2,1);
  transition: all 250ms cubic-bezier(.4,0,.2,1);
}

.material-toggle input:empty ~ label:before {
    top: 3px;
    left: 0px;
    width: 32px;
    height: 13px;
    border-radius: 12px;
    background-color: #bdbdbd;
}

input.switch:empty ~ label:after {
    top: -1px;
    left: -9px;
    width: 1.4em;
    height: 8px;
    bottom: 0.1em;
    margin-left: 0.1em;
    background-color: #fff;
    border-radius: 50%;
    width: 17px;
    height: 17px;
    border-radius: 50%;
    border: solid 2px;
    border-color: #fff;
    box-shadow: 0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12);
}

.material-toggle input:checked ~ label:before {
    background-color: #1e88e5;
}

.material-toggle input:checked ~ label:after {
    left: 15px;
  background-color: #1565c0;
  border-color: #1565c0;
}

我也附上了codepen

【问题讨论】:

    标签: html css material-design css-transitions pseudo-element


    【解决方案1】:

    您需要唯一的 id,目前它们都有 id="toggle"

    <div>
      <div class="material-toggle">
        <input type="checkbox" id="toggle" name="toggle" checked=true class="switch" />
        <label for="toggle" class=""></label>
      </div>
      <div class="material-toggle">
        <input type="checkbox" id="toggle2" name="toggle" checked=true class="switch" />
        <label for="toggle2" class=""></label>
      </div>
    </div>
    

    【讨论】:

    • 不会自行解决问题
    • 嗯,会的
    • 那是因为你的标签都引用了id切换,当然你也需要唯一的标签......
    • 而您在回答中没有提到这一点;)
    【解决方案2】:

    如果您想拥有多个切换按钮,则需要使用 ID,但您在两个切换按钮中都有相同的 ID,因为 ID 是唯一的,所以不会发生这种情况,因此更改 ID 和 label for 以定位那些ID。

    .material-toggle {
      height: 22px;
      width: 40px;
      margin: 12px;
    }
    .material-toggle input:empty {
      margin-left: -9999px;
    }
    .material-toggle input:empty ~ label {
      position: relative;
      float: left;
      width: 150px;
      cursor: pointer;
      -webkit-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
    }
    .material-toggle input:empty ~ label:before,
    .material-toggle input:empty ~ label:after {
      position: absolute;
      display: block;
      content: ' ';
      -webkit-transition: all 250ms cubic-bezier(.4, 0, .2, 1);
      transition: all 250ms cubic-bezier(.4, 0, .2, 1);
    }
    .material-toggle input:empty ~ label:before {
      top: 3px;
      left: 0px;
      width: 32px;
      height: 13px;
      border-radius: 12px;
      background-color: #bdbdbd;
    }
    input.switch:empty ~ label:after {
      top: -1px;
      left: -9px;
      width: 1.4em;
      height: 8px;
      bottom: 0.1em;
      margin-left: 0.1em;
      background-color: #fff;
      border-radius: 50%;
      width: 17px;
      height: 17px;
      border-radius: 50%;
      border: solid 2px;
      border-color: #fff;
      box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .14), 0 3px 3px -2px rgba(0, 0, 0, .2), 0 1px 8px 0 rgba(0, 0, 0, .12);
    }
    .material-toggle input:checked ~ label:before {
      background-color: #1e88e5;
    }
    .material-toggle input:checked ~ label:after {
      left: 15px;
      background-color: #1565c0;
      border-color: #1565c0;
    }
    <div>
      <div class="material-toggle">
        <input type="checkbox" id="toggle" name="toggle" checked=true class="switch" />
        <label for="toggle" class=""></label>
      </div>
      <div class="material-toggle">
        <input type="checkbox" id="toggle2" name="toggle" checked=true class="switch" />
        <label for="toggle2" class=""></label>
      </div>
    </div>

    【讨论】:

      【解决方案3】:

      为什么不使用不同的“id”。 如果我理解这个问题,答案是:

      <div>
          <div class="material-toggle">
              <input type="checkbox" id="toggle1" name="toggle" checked=true class="switch" />
              <label for="toggle1" class=""></label>
          </div>
          <div class="material-toggle">
              <input type="checkbox" id="toggle2" name="toggle" checked=false class="switch" />
              <label for="toggle2" class=""></label>
          </div>
      </div>
      

      【讨论】:

        【解决方案4】:
        <div>
          <div class="material-toggle">
            <input type="checkbox" id="toggle" name="toggle"  class="switch" />
            <label for="toggle" class=""></label>
          </div>
          <div class="material-toggle">
            <input type="checkbox" id="toggle-2" name="toggle" class="switch" />
            <label for="toggle-2" class=""></label>
          </div>
        </div>
        

        我解决了分配不同标签的 for 值的问题。我做了一个材料主题切换器,但我使用了 Javascript 和 Jquery 使其与页面中的多个切换器一起工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-21
          • 1970-01-01
          • 1970-01-01
          • 2019-02-15
          • 1970-01-01
          • 2020-08-31
          • 1970-01-01
          相关资源
          最近更新 更多