Search code examples
htmlcsssemantics

How to float two elements to the right maintaining the same order visually and semantically?


How to float two elements within a wrapper element to the right keeping the same order of the elements visually and semantically?

<style>
.container { widht: 200px; height: 50px; background: #333; }
.container p { width: 50px; height: 50px; background: #f00; float: right; margin: 0; }
</style>
<div class="container">
    <p class="a">Simon</p>
    <p class="b">Says</p>
</div>

When rendered, this will make the inner elements appear in the order of "Says Simon", http://jsbin.com/eravan/1/edit.


Solution

  • The common fixes are:

    Adding auxiliary element

    <style>
    .container { width: 200px; height: 50px; background: #333; }
    .container p { width: 50px; height: 50px; background: #f00; float: left; margin: 0; }
    .container .aux { float: right; }
    </style>
    <div class="container">
        <div class="aux">
            <p class="a">Simon</p>
            <p class="b">Says</p>
        </div>
    </div>
    

    http://jsbin.com/eravan/6/edit

    The problem with this approach is the redundant auxiliary element itself.

    Messing with the semantics

    <style>
    .container { width: 200px; height: 50px; background: #333; }
    .container p { width: 50px; height: 50px; background: #f00; float: right; margin: 0; }
    </style>
    <div class="container">
        <p class="b">Says</p>
        <p class="a">Simon</p>
    </div>
    

    http://jsbin.com/eravan/9/edit

    This is the worst solution and, unfortunately, the most common as well (Ali Bassam comment directly below proves it).

    Neither of these is the correct answer.