如何在Edge中使此复选框样式起作用?

时间:2018-12-06 18:19:55

标签: css css3 checkbox microsoft-edge webkit-appearance

我正在设置复选框的样式,使其看起来像切换开关,在Chrome,UC浏览器,适用于Windows的Safari中可以很好地工作,而在Firefox中则有点不稳定,但是可以接受。不幸的是,在Edge中根本无法使用。

我已经浏览了我正在使用的CSS属性,并且似乎所有功能都受到Edge的支持,所以我不明白我所缺少的内容。

while
.toggle{
      width:34px;
      height:16px;
      border-radius:40px;
      position:relative;
      -webkit-appearance: none;
      margin:2px 0 0 0px;
      box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.4);
      background: -webkit-linear-gradient(#c6c6c6,#e3e3e3);
      cursor:hand;cursor:pointer;pointer:hand;
      outline: 0;
    }
    .toggle:checked{
      background: -webkit-linear-gradient(#77178F,#AD73BB);
      box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.4);
    }
    .toggle:before {
      content:'';
      letter-spacing:1px;
      color: rgba(0,0,0,.15);
      font-size:10px;
      font-weight:100;
      text-shadow:1px 1px 1px rgba(255,255,255,1);
      width:7px;
      height:7px;
      padding:2px;
      top:2px;
      left:2px;
      position:absolute;
      border-radius:40px;
      background: linear-gradient(#ebebeb,#f1f1f1);
      box-shadow: -2px 2px 8px rgba(0, 0, 0, 0.2),
            -1px 1px 2px rgba(0, 0, 0, 0.3),
            inset 1px 1px 1px #ffffff;
      transition: all 0.4s;
    }
    .toggle:checked:before {
      left:20px;
      background:#f1f1f1;
    }
    .toggle:checked:after {
      background: linear-gradient(#d8eec4,#5fa718);
      box-shadow: inset -1px -1px 4px #417f0b,
            inset 1px 1px 2px #5b9f1a;
    }

在我看来<input type=checkbox class=toggle>并未执行应有的操作(隐藏原始复选框),但据推测也受支持。

如果有人对这个问题有任何经验,可以给我一些见解,将不胜感激。

3 个答案:

答案 0 :(得分:0)

最好隐藏一个复选框,用另一个元素(例如标签)将其包装,然后将同级添加到该复选框中。您可以在https://www.w3schools.com/howto/howto_css_switch.asp处找到复选框切换的示例。


或者您可以在下面调整代码:

.toggle {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
}

.toggle input[type=checkbox] { 
  opacity: 0; /* or use display: none; to hide default checkbox */
  width: 0;
  height: 0;
}

.toggle .slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: linear-gradient(#ebebeb, #f1f1f1);
  box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.4);
  -webkit-transition: .4s;
  transition: .4s;
}

.toggle .slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background: #ffffff;
  -webkit-transition: .4s;
  transition: .4s;
}

.toggle input[type=checkbox]:checked + .slider {
  background: linear-gradient(#77178F,#AD73BB);
  box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.4);
}

.toggle input[type=checkbox]:checked + .slider:before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(26px);
}

.toggle .slider.round {
  border-radius: 34px;
}

.toggle .slider.round:before {
  border-radius: 50%;
}
<label class="toggle">
  <input type="checkbox">
  <span class="slider round"></span>
</label>

答案 1 :(得分:0)

您可以添加标签以满足您的要求,这是一种解决方法。这样,您可以将标签与复选框连接起来,然后将样式应用于标签,而不是复选框本身。

这是我的测试代码。

CSS。

    .toggle {
        visibility: hidden;
        opacity: 0;           
    }
        .toggle + label {
            width: 34px;
            height: 16px;
            border-radius: 40px;
            position: relative;
            box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.4);
            background: linear-gradient(#c6c6c6,#e3e3e3);
            cursor: pointer;
            outline: 0;
            display: inline-block;               
        }

            .toggle + label:before {
                content: '';
                letter-spacing: 1px;
                color: rgba(0,0,0,.15);
                font-size: 10px;
                font-weight: 100;
                text-shadow: 1px 1px 1px rgba(255,255,255,1);
                width: 7px;
                height: 7px;
                padding: 2px;
                top: 2px;
                left: 2px;
                position: absolute;
                border-radius: 40px;
                background: linear-gradient(#ebebeb,#f1f1f1);
                box-shadow: -2px 2px 8px rgba(0, 0, 0, 0.2), -1px 1px 2px rgba(0, 0, 0, 0.3), inset 1px 1px 1px #ffffff;
                transition: all 0.4s;
            }

        .toggle:checked + label {
            background: linear-gradient(#77178F,#AD73BB);
            box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.4);
        }
    .toggle:checked + label:before {
        left: 20px;
        background: #f1f1f1;
    }
    .toggle:checked + label:after {
        background: linear-gradient(#d8eec4,#5fa718);
        box-shadow: inset -1px -1px 4px #417f0b, inset 1px 1px 2px #5b9f1a;
    }

HTML

<input type="checkbox" class="toggle" id="mycheckbox">
<label for="mycheckbox" />

running result

答案 2 :(得分:0)

将所选答案的另一个灵活变体添加到组合中:https://codepen.io/hawatt/pen/MWKyJJZ

HAML

.toggle-switch
  %input{type: 'checkbox',  id: 'away-from-desk' }
  %span.toggle-handle
  %label{'for' => 'away-from-desk'} Away from desk

SCSS

$toggle-width: 2.8rem;
$toggle-height: 1.5rem;
$toggle-handle-diameter: calc(#{$toggle-height} * 0.8);

.toggle-switch {
  position: relative;
  display: flex;
  align-items: center;
  input {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    width: $toggle-width;
    height: $toggle-height;
    display: inline-flex;
    position: relative;
    border-radius: $toggle-height;
    overflow: hidden;
    outline: none;
    border: none;
    cursor: pointer;
    background-color: #c0c0c0;
    transition: all ease 0.3s;
    z-index: 0;
    text-indent: -5000px;
  }
  .toggle-handle {
    pointer-events: none;
    display: flex;
    position: absolute;
    z-index: 2;
    width: $toggle-handle-diameter;
    height: $toggle-handle-diameter;
    background: #fff;
    border-radius: 50%;
    left: 0;
    margin: 0 0.35rem;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
    transition: all ease 0.3s;
  }
  input:checked,
  input.enabled {
    background-color: dodgerblue;
    & + .toggle-handle {
      left: calc(#{$toggle-width} - #{$toggle-handle-diameter} - 0.25rem);
    }
  }
  label {
    cursor: pointer;
  }
}