How to align checkboxes and their labels consistently cross-browsers

前端 未结 30 1840
有刺的猬
有刺的猬 2020-11-22 05:56

This is one of the minor CSS problems that plagues me constantly. How do folks around Stack Overflow vertically align checkboxes and

相关标签:
30条回答
  • 2020-11-22 06:00

    position: relative; has some issues in IE with z-index and animations like jQuery's slideUp/slideDown.

    CSS:

    input[type=checkbox], input[type=radio] {
        vertical-align: baseline;
        position: relative;
        top: 3px;
        margin: 0 3px 0 0;
        padding: 0px;
    }
    input.ie7[type=checkbox], input.ie7[type=radio] {
        vertical-align: middle;
        position: static;
        margin-bottom: -2px;
        height: 13px;
        width: 13px;
    }
    

    jQuery:

    $(document).ready(function () {
        if ($.browser.msie && $.browser.version <= 7) {
            $('input[type=checkbox]').addClass('ie7');
            $('input[type=radio]').addClass('ie7');
        }
    });
    

    The styling probably needs tweaks depending on the font-size used in <label>

    PS:
    I use ie7js to make the css work in IE6.

    0 讨论(0)
  • 2020-11-22 06:01

    Sometimes vertical-align needs two inline (span, label, input, etc...) elements next to each other to work properly. The following checkboxes are properly vertically centered in IE, Safari, FF, and Chrome, even if the text size is very small or large.

    They all float next to each other on the same line, but the nowrap means that the whole label text always stays next to the checkbox.

    The downside is the extra meaningless SPAN tags.

    .checkboxes label {
      display: inline-block;
      padding-right: 10px;
      white-space: nowrap;
    }
    .checkboxes input {
      vertical-align: middle;
    }
    .checkboxes label span {
      vertical-align: middle;
    }
    <form>
      <div class="checkboxes">
        <label for="x"><input type="checkbox" id="x" /> <span>Label text x</span></label>
        <label for="y"><input type="checkbox" id="y" /> <span>Label text y</span></label>
        <label for="z"><input type="checkbox" id="z" /> <span>Label text z</span></label>
      </div>
    </form>

    Now, if you had a very long label text that needed to wrap without wrapping under the checkbox, you'd use padding and negative text indent on the label elements:

    .checkboxes label {
      display: block;
      padding-right: 10px;
      padding-left: 22px;
      text-indent: -22px;
    }
    .checkboxes input {
      vertical-align: middle;
    }
    .checkboxes label span {
      vertical-align: middle;
    }
    <form>
      <div class="checkboxes">
        <label for="x"><input type="checkbox" id="x" /> <span>Label text x so long that it will probably wrap so let's see how it goes with the proposed CSS (expected: two lines are aligned nicely)</span></label>
        <label for="y"><input type="checkbox" id="y" /> <span>Label text y</span></label>
        <label for="z"><input type="checkbox" id="z" /> <span>Label text z</span></label>
      </div>
    </form>

    0 讨论(0)
  • 2020-11-22 06:03

    I've never had a problem with doing it like this:

    <form>
      <div>
        <input type="checkbox" id="cb" /> <label for="cb">Label text</label>
      </div>
    </form>
    
    0 讨论(0)
  • Yay thanks! This too has been driving me nuts forever.

    In my particular case, this worked for me:

    input {
        width: 13px;
        height: 13px;
        padding: 0;
        margin:0;
        vertical-align: top;
        position: relative;
        *top: 1px;
        *overflow: hidden;
    }
    label {
        display: block;
        padding: 0;
        padding-left: 15px;
        text-indent: -15px;
        border: 0px solid;
        margin-left: 5px;
        vertical-align: top;
    }
    

    I am using the reset.css which might explain some of the differences, but this seems to work well for me.

    0 讨论(0)
  • 2020-11-22 06:06

    Try my solution, I tried it in IE 6, FF2 and Chrome and it renders pixel by pixel in all the three browsers.

    * {
      padding: 0px;
      margin: 0px;
    }
    #wb {
      width: 15px;
      height: 15px;
      float: left;
    }
    #somelabel {
      float: left;
      padding-left: 3px;
    }
    <div>
      <input id="wb" type="checkbox" />
      <label for="wb" id="somelabel">Web Browser</label>
    </div>

    0 讨论(0)
  • 2020-11-22 06:06

    So I know this has been answered many times, but I feel I have a way more elegant solution than those that have been provided already. And not only 1 elegant solution, but 2 separate solutions to tickle your fancy. With that said, everything you need to know and see are contained in 2 JS Fiddle's, with comments.


    Solution #1 relies on the native "Checkbox" of the given browser, though with a twist... Its contained in a div which is easier to position cross-browser, with an overflow: hidden to chop the excess of a 1px stretched checkbox (this is so you cant see the ugly borders of FF)

    Simple HTML: (follow the link to review the css with comments, code block is to satisfy stackoverflow) http://jsfiddle.net/KQghJ/

    <label><div class="checkbox"><input type="checkbox" /></div> Label text</label>
    

    Solution #2 uses the "Checkbox Toggle Hack" to toggle the CSS state of a DIV, which has been properly positioned across browser, and setup with a simple sprite for the checkbox unchecked and checked states. All that is needed is to adjust the background-position with said Checkbox Toggle Hack. This, in my opinion, is the more elegant solution as you have more control over your checkboxes & radios, and can guarantee they look the same across browser.

    Simple HTML: (follow the link to review the CSS with comments, code block is to satisfy StackOverflow) http://jsfiddle.net/Sx5M2/

    <label><input type="checkbox" /><div class="checkbox"></div>Label text</label>
    

    If anyone disagree's with these methods, please leave me a comment, I would love to hear some feedback on why others have not come across these solutions, or if they have, why I see no answers here regarding them? If anyone sees one of these methods fail, it would be nice to see that too, but these have been tested in the latest browsers and rely on HTML / CSS methods that are quite old, and universal as far as I have seen.

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