How to style a checkbox using CSS

前端 未结 30 3511
日久生厌
日久生厌 2020-11-21 04:26

I am trying to style a checkbox using the following:

相关标签:
30条回答
  • 2020-11-21 04:59

    No, you still can't style the checkbox itself, but I (finally) figured out how to style an illusion while keeping the functionality of clicking a checkbox. It means that you can toggle it even if the cursor isn't perfectly still without risking selecting text or triggering drag-and-drop!

    This solution probably also fits radio buttons.

    The following works in Internet Explorer 9, Firefox 30.0 and Chrome 40.0.2214.91 and is just a basic example. You can still use it in combination with background images and pseudo-elements.

    http://jsfiddle.net/o0xo13yL/1/

    label {
        display: inline-block;
        position: relative; /* Needed for checkbox absolute positioning */
        background-color: #eee;
        padding: .5rem;
        border: 1px solid #000;
        border-radius: .375rem;
        font-family: "Courier New";
        font-size: 1rem;
        line-height: 1rem;
    }
    
    label > input[type="checkbox"] {
        display: block;
        position: absolute; /* Remove it from the flow */
        width: 100%;
        height: 100%;
        margin: -.5rem; /* Negative the padding of label to cover the "button" */
        cursor: pointer;
        opacity: 0; /* Make it transparent */
        z-index: 666; /* Place it on top of everything else */
    }
    
    label > input[type="checkbox"] + span {
        display: inline-block;
        width: 1rem;
        height: 1rem;
        border: 1px solid #000;
        margin-right: .5rem;
    }
    
    label > input[type="checkbox"]:checked + span {
        background-color: #666;
    }
    
    <label>
        <input type="checkbox" />
        <span>&nbsp;</span>Label text
    </label>
    
    0 讨论(0)
  • 2020-11-21 05:00

    Recently I found a quite interesting solution to the problem.

    You could use appearance: none; to turn off the checkbox's default style and then write your own over it like described here (Example 4).

    Example fiddle

    input[type=checkbox] {
      width: 23px;
      height: 23px;
      -webkit-appearance: none;
      -moz-appearance: none;
      appearance: none;
      margin-right: 10px;
      background-color: #878787;
      outline: 0;
      border: 0;
      display: inline-block;
      -webkit-box-shadow: none !important;
      -moz-box-shadow: none !important;
      box-shadow: none !important;
    }
    
    input[type=checkbox]:focus {
      outline: none;
      border: none !important;
      -webkit-box-shadow: none !important;
      -moz-box-shadow: none !important;
      box-shadow: none !important;
    }
    
    input[type=checkbox]:checked {
      background-color: green;
      text-align: center;
      line-height: 15px;
    }
    <input type="checkbox">

    Unfortunately browser support is quite bad for the appearance option. From my personal testing I only got Opera and Chrome working correctly. But this would be the way to go to keep it simple when better support comes or you only want to use Chrome/Opera.

    "Can I use?" link

    0 讨论(0)
  • 2020-11-21 05:01

    You can achieve quite a cool custom checkbox effect by using the new abilities that come with the :after and :before pseudo classes. The advantage to this, is: You don't need to add anything more to the DOM, just the standard checkbox.

    Note this will only work for compatible browsers. I believe this is related to the fact that some browsers do not allow you to set :after and :before on input elements. Which unfortunately means for the moment only WebKit browsers are supported. Firefox + Internet Explorer will still allow the checkboxes to function, just unstyled, and this will hopefully change in the future (the code does not use vendor prefixes).

    This is a WebKit browser solution only (Chrome, Safari, Mobile browsers)

    See Example Fiddle

    $(function() {
      $('input').change(function() {
        $('div').html(Math.random());
      });
    });
    /* Main Classes */
    .myinput[type="checkbox"]:before {
      position: relative;
      display: block;
      width: 11px;
      height: 11px;
      border: 1px solid #808080;
      content: "";
      background: #FFF;
    }
    
    .myinput[type="checkbox"]:after {
      position: relative;
      display: block;
      left: 2px;
      top: -11px;
      width: 7px;
      height: 7px;
      border-width: 1px;
      border-style: solid;
      border-color: #B3B3B3 #dcffffde #dcffffde #B3B3B3;
      content: "";
      background-image: linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
      background-repeat: no-repeat;
      background-position: center;
    }
    
    .myinput[type="checkbox"]:checked:after {
      background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
    }
    
    .myinput[type="checkbox"]:disabled:after {
      -webkit-filter: opacity(0.4);
    }
    
    .myinput[type="checkbox"]:not(:disabled):checked:hover:after {
      background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
    }
    
    .myinput[type="checkbox"]:not(:disabled):hover:after {
      background-image: linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
      border-color: #85A9BB #92C2DA #92C2DA #85A9BB;
    }
    
    .myinput[type="checkbox"]:not(:disabled):hover:before {
      border-color: #3D7591;
    }
    
    /* Large checkboxes */
    .myinput.large {
      height: 22px;
      width: 22px;
    }
    
    .myinput.large[type="checkbox"]:before {
      width: 20px;
      height: 20px;
    }
    
    .myinput.large[type="checkbox"]:after {
      top: -20px;
      width: 16px;
      height: 16px;
    }
    
    /* Custom checkbox */
    .myinput.large.custom[type="checkbox"]:checked:after {
      background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
    }
    
    .myinput.large.custom[type="checkbox"]:not(:disabled):checked:hover:after {
      background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <table style="width:100%">
      <tr>
        <td>Normal:</td>
        <td><input type="checkbox" /></td>
        <td><input type="checkbox" checked="checked" /></td>
        <td><input type="checkbox" disabled="disabled" /></td>
        <td><input type="checkbox" disabled="disabled" checked="checked" /></td>
      </tr>
      <tr>
        <td>Small:</td>
        <td><input type="checkbox" class="myinput" /></td>
        <td><input type="checkbox" checked="checked" class="myinput" /></td>
        <td><input type="checkbox" disabled="disabled" class="myinput" /></td>
        <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput" /></td>
      </tr>
      <tr>
        <td>Large:</td>
        <td><input type="checkbox" class="myinput large" /></td>
        <td><input type="checkbox" checked="checked" class="myinput large" /></td>
        <td><input type="checkbox" disabled="disabled" class="myinput large" /></td>
        <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large" /></td>
      </tr>
      <tr>
        <td>Custom icon:</td>
        <td><input type="checkbox" class="myinput large custom" /></td>
        <td><input type="checkbox" checked="checked" class="myinput large custom" /></td>
        <td><input type="checkbox" disabled="disabled" class="myinput large custom" /></td>
        <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large custom" /></td>
      </tr>
    </table>

    Bonus Webkit style flipswitch fiddle

    $(function() {
      var f = function() {
        $(this).next().text($(this).is(':checked') ? ':checked' : ':not(:checked)');
      };
      $('input').change(f).trigger('change');
    });
    body {
      font-family: arial;
    }
    
    .flipswitch {
      position: relative;
      background: white;
      width: 120px;
      height: 40px;
      -webkit-appearance: initial;
      border-radius: 3px;
      -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
      outline: none;
      font-size: 14px;
      font-family: Trebuchet, Arial, sans-serif;
      font-weight: bold;
      cursor: pointer;
      border: 1px solid #ffffd;
    }
    
    .flipswitch:after {
      position: absolute;
      top: 5%;
      display: block;
      line-height: 32px;
      width: 45%;
      height: 90%;
      background: #fff;
      box-sizing: border-box;
      text-align: center;
      transition: all 0.3s ease-in 0s;
      color: black;
      border: #888 1px solid;
      border-radius: 3px;
    }
    
    .flipswitch:after {
      left: 2%;
      content: "OFF";
    }
    
    .flipswitch:checked:after {
      left: 53%;
      content: "ON";
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    
    <h2>Webkit friendly mobile-style checkbox/flipswitch</h2>
    <input type="checkbox" class="flipswitch" /> &nbsp;
    <span></span>
    <br>
    <input type="checkbox" checked="checked" class="flipswitch" /> &nbsp;
    <span></span>

    0 讨论(0)
  • 2020-11-21 05:02

    A simple and lightweight template as well:

    input[type=checkbox] {
      cursor: pointer;
    }
    
    input[type=checkbox]:checked:before {
      content: "\2713";
      background: #fffed5;
      text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
      font-size: 20px;
      text-align: center;
      line-height: 8px;
      display: inline-block;
      width: 13px;
      height: 15px;
      color: #00904f;
      border: 1px solid #cdcdcd;
      border-radius: 4px;
      margin: -3px -3px;
      text-indent: 1px;
    }
    
    input[type=checkbox]:before {
      content: "\202A";
      background: #ffffff;
      text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
      font-size: 20px;
      text-align: center;
      line-height: 8px;
      display: inline-block;
      width: 13px;
      height: 15px;
      color: #00904f;
      border: 1px solid #cdcdcd;
      border-radius: 4px;
      margin: -3px -3px;
      text-indent: 1px;
    }
    <input type="checkbox" checked="checked">checked1<br>
    <input type="checkbox">unchecked2<br>
    <input type="checkbox" checked="checked" id="id1">
    <label for="id1">checked2+label</label><br>
    <label for="id2">unchecked2+label+rtl</label>
    <input type="checkbox" id="id2">
    <br>

    https://jsfiddle.net/rvgccn5b/

    0 讨论(0)
  • 2020-11-21 05:03

    You can style checkboxes with a little trickery using the label element an example is below:

    .checkbox > input[type=checkbox] {
      visibility: hidden;
    }
    
    .checkbox {
      position: relative;
      display: block;
      width: 80px;
      height: 26px;
      margin: 0 auto;
      background: #FFF;
      border: 1px solid #2E2E2E;
      border-radius: 2px;
      -webkit-border-radius: 2px;
      -moz-border-radius: 2px;
    }
    
    .checkbox:after {
      position: absolute;
      display: inline;
      right: 10px;
      content: 'no';
      color: #E53935;
      font: 12px/26px Arial, sans-serif;
      font-weight: bold;
      text-transform: capitalize;
      z-index: 0;
    }
    
    .checkbox:before {
      position: absolute;
      display: inline;
      left: 10px;
      content: 'yes';
      color: #43A047;
      font: 12px/26px Arial, sans-serif;
      font-weight: bold;
      text-transform: capitalize;
      z-index: 0;
    }
    
    .checkbox label {
      position: absolute;
      display: block;
      top: 3px;
      left: 3px;
      width: 34px;
      height: 20px;
      background: #2E2E2E;
      cursor: pointer;
      transition: all 0.5s linear;
      -webkit-transition: all 0.5s linear;
      -moz-transition: all 0.5s linear;
      border-radius: 2px;
      -webkit-border-radius: 2px;
      -moz-border-radius: 2px;
      z-index: 1;
    }
    
    .checkbox input[type=checkbox]:checked + label {
      left: 43px;
    }
    <div class="checkbox">
      <input id="checkbox1" type="checkbox" value="1" />
      <label for="checkbox1"></label>
    </div>

    And a FIDDLE for the above code. Note that some CSS doesn't work in older versions of browsers, but I'm sure there are some fancy JavaScript examples out there!

    0 讨论(0)
  • 2020-11-21 05:03

    From my googling, this is the easiest way for checkbox styling. Just add :after and :checked:after CSS based on your design.

    body{
      background: #DDD;
    }
    span{
      margin-left: 30px;
    }
    input[type=checkbox] {
        cursor: pointer;
        font-size: 17px;
        visibility: hidden;
        position: absolute;
        top: 0;
        left: 0;
        transform: scale(1.5);
    }
    
    input[type=checkbox]:after {
        content: " ";
        background-color: #fff;
        display: inline-block;
        color: #00BFF0;
        width: 14px;
        height: 19px;
        visibility: visible;
        border: 1px solid #FFF;
        padding: 0 3px;
        margin: 2px 0;
        border-radius: 8px;
        box-shadow: 0 0 15px 0 rgba(0,0,0,0.08), 0 0 2px 0 rgba(0,0,0,0.16);
    }
    
    input[type=checkbox]:checked:after {
        content: "\2714";
        display: unset;
        font-weight: bold;
    }
    <input type="checkbox"> <span>Select Text</span>

    0 讨论(0)
提交回复
热议问题