无线电输入样式不适用于Firefox

时间:2015-07-14 20:44:18

标签: html css firefox

所以我使用下面的css设置了我的无线电输入。但是在Firefox中,会出现一个完全不同的收音机,我根本无法设置它的样式。

它在safari和chrome中完美运行但我似乎无法弄清楚为什么它在Firefox中不起作用。

 input[type=checkbox] {
   border: 0px;
   cursor: pointer;
   height: 20px;
   margin: 0px 10px 0px 0px;
   position: relative;
   overflow: hidden;
   vertical-align: -5px;
   width: 20px;
 }
 input[type=checkbox]:before {
   background-color: transparent;
   border: 2px solid #E0E0E0;
   content: '';
   display: block;
   height: 20px;
   left: 0px;
   opacity: 1;
   position: absolute;
   transition: opacity .15s linear;
   top: 0px;
   width: 20px;
 }
 input[type=checkbox]:after {
   border: 2px solid #EC407A;
   content: '';
   display: block;
   height: 23px;
   left: -5px;
   opacity: 0;
   position: absolute;
   top: -9px;
   transform: rotate(-45deg);
   -webkit-transform: rotate(-45deg);
   transition: opacity .15s linear;
   width: 27px;
 }
 input[type=checkbox]:checked:before {
   opacity: 0;
 }
 input[type=checkbox]:checked:after {
   opacity: 1;
 }
 input[type=checkbox]:focus {
   box-shadow: none;
   outline: 0px;
 }
 .radio-wrapper {
   position: relative;
 }
 input[type='radio'] {
   -webkit-appearance: none;
   -moz-appearance: none;
   -ms-appearance: none;
   -o-appearance: none;
   appearance: none;
   position: relative;
   right: 0;
   bottom: 0;
   left: 0;
   height: 20px;
   width: 20px;
   -webkit-transition: all 0.15s ease-out 0s;
   -moz-transition: all 0.15s ease-out 0s;
   transition: all 0.15s ease-out 0s;
   background: #cbd1d8;
   border: none;
   color: #fff;
   cursor: pointer;
   display: inline-block;
   outline: none;
   position: relative;
   border-radius: 50%;
 }
 @-webkit-keyframes click-wave {
   0% {
     height: 40px;
     width: 40px;
     opacity: 0.35;
     position: relative;
   }
   100% {
     height: 200px;
     width: 200px;
     margin-left: -80px;
     margin-top: -80px;
     opacity: 0.0;
   }
 }
 @-moz-keyframes click-wave {
   0% {
     height: 40px;
     width: 40px;
     opacity: 0.35;
     position: relative;
   }
   100% {
     height: 200px;
     width: 200px;
     margin-left: -80px;
     margin-top: -80px;
     opacity: 0.0;
   }
 }
 @keyframes click-wave {
   0% {
     height: 40px;
     width: 40px;
     opacity: 0.35;
     position: relative;
   }
   100% {
     height: 200px;
     width: 200px;
     margin-left: -80px;
     margin-top: -80px;
     opacity: 0.0;
   }
 }
 .option-input {
   -webkit-transition: all 0.15s ease-out 0s;
   -moz-transition: all 0.15s ease-out 0s;
   transition: all 0.15s ease-out 0s;
   background: #7CE1C9;
   border: none;
   color: #fff;
   cursor: pointer;
   display: inline-block;
   outline: none;
   position: relative;
   margin-right: 0.5rem;
 }
 .option-input:hover {
   background: #9faab7;
 }
 .option-input:checked {
   background: #7CE1C9;
 }
 .option-input:checked::before {
   height: 20px;
   width: 20px;
   position: relative;
   content: '\2716';
   display: inline-block;
   font-size: 14.66667px;
   text-align: center;
   line-height: 20px;
 }
 .option-input:checked::after {
   -webkit-animation: click-wave 0.65s;
   -moz-animation: click-wave 0.65s;
   animation: click-wave 0.65s;
   background: #7CE1C9;
   content: '';
   display: block;
   position: relative;
 }
 .option-input.radio {
   border-radius: 50%;
 }
 .option-input.radio::after {
   border-radius: 50%;
 }
 input[type='radio'] + label {
   user-select: none;
   cursor: pointer;
   padding-left: 30px;
 }
 input[type='radio'] + label:before,
 input[type='radio'] + label:after {
   background: #fff;
   background-clip: padding-box;
   border: 2px solid #EC407A;
   border-radius: 50%;
   bottom: 3px;
   content: '';
   display: block;
   height: 16px;
   left: 3px;
   margin-top: -8px;
   position: absolute;
   top: 50%;
   transition: all 0.3s ease;
   width: 16px;
 }
 input[type='radio'] + label:after {
   background: #7CE1C9;
   border: 2px solid #fff;
   transform: scale(0);
   -wekbit-transform: scale(0);
   transition: all 0.3s ease;
 }
 input[type='radio']:focus + label:before {
   box-shadow: 0 0 5px #EC407A;
 }
 input[type='radio']:checked + label:before {
   border-color: #EC407A;
 }
 input[type='radio']:checked + label:after {
   transform: scale(0.75, 0.75);
   -webkit-transform: scale(0.75, 0.75);
 }
 `
<form>
  <li class='initialForm'><span class='optionText'>$option1</span><strong><input type='radio' class='option-input radio option1' id='$id' value='1' name='option'></strong>
  </li>
  <li class='initialForm'><span class='optionText'>$option2</span><strong><input type='radio' class='option-input radio option2' id='$id' value='2' name='option'></strong>
  </li>
</form>

3 个答案:

答案 0 :(得分:0)

您使用的是-webkit CSS前缀,专门用于Chrome和Safari(或基于webkit的浏览器)。

您还应该使用-moz CSS前缀,特别是Firefox。当然,如果你想支持IE,它们可能对某些方法有额外或不同的风格。

专门针对您的transform方法,在Firefox中,它被认为是实验性的,可能-moz-transform更合适。

答案 1 :(得分:0)

来源:https://clarknikdelpowell.com/blog/styling-radio-buttons-select-boxes-in-firefox/

尽管它是Chrome,Safari和Firefox(-webkit-appearance,-moz-appearance)的一部分,但实际上并不是CSS。很多人使用-webkit-appearance:none从按钮,输入重命名所有内容的外观。但是,有一些Firefox错误使得-moz-appearance:没有一个危险的命题。

由于外观在复选框和单选按钮上都不起作用。你仍然可以设置单选按钮的样式,你只需要使用一些技巧就可以实现它。这是你如何做到的。

  1. 将收音机输入设为display:none。

  2. 按照您要设置单选按钮样式的方式设置单选按钮旁边的范围。

  3. 使用:checked属性切换其外观。

  4. 有关浏览器兼容性和更多信息,请参阅源代码 使用:checked属性切换其外观。

答案 2 :(得分:-1)

我在网上找到了这篇博文,它解决了你遇到的问题:https://clarknikdelpowell.com/blog/styling-radio-buttons-select-boxes-in-firefox/

编辑: 一般来说,直接设置单选按钮被认为是不好的做法。您遇到问题的原因是因为-webkit-appearance, -moz-appearance实际上不是CSS。由于您不能直接设置单选按钮的样式,因此您必须使用一些解决方法。

  1. 将收音机输入设为display:none。
  2. 按照您要设置单选按钮样式的方式设置与单选按钮相邻的跨度。
  3. 使用:checked属性切换其外观。
  4. 我使用您指定的一些代码在jsFiddle上绘制了一个基本示例:https://jsfiddle.net/o3nurghw/2/

    HTML:

    <form>
      <li class='initialForm'>
          <span class='optionText'>$option1</span>
          <input type='radio' class='option-input radio option1' id='$id' value='1' name='option' />
          <span class="overlay"></span> <!-- the adjacent span -->
      </li>
      <li class='initialForm'>
        <span class='optionText'>$option2</span>
        <input type='radio' class='option-input radio option2' id='$id' value='2' name='option' />
        <span class="overlay"></span> <!-- the adjacent span -->
      </li>
    </form>
    

    CSS:

    .initialForm {
        margin-bottom: .5em;
        display: block;
        cursor: pointer;    
        font-size: 16px;
        line-height: 1em;
    }
    .overlay {
        position: relative;
        right: 0;
        bottom: 0;
        left: 0;
        height: 20px;
        width: 20px;
        -webkit-transition: all 0.15s ease-out 0s;
        -moz-transition: all 0.15s ease-out 0s;
        transition: all 0.15s ease-out 0s;
        background: #cbd1d8;
        border: none;
        color: #fff;
        cursor: pointer;
        display: inline-block;
        outline: none;
        position: relative;
        border-radius: 50%;
    }
    .radio {
        display: none;
    }
    .radio:checked + span:before {
        width: .75em;
        height: .75em;
        margin: .125em;
        display: block;
        content: " ";
        background-color: #666;
        border-radius: 100%;
    }