Grow your CSS skills. Land your dream job.

direction

Last updated on:

The direction property in CSS sets the direction of of content flow within a block-level element. This applies to text, inline, and inline-block elements. It also sets the default alignment of text and the direction that table cells flow within a table row.

.main-content {
  direction: rtl;  /* Right to Left */
}

The valid values are:

  • ltr - Left to Right, the default
  • rtl - Right to Left
  • inherit - inherits its value from the parent element

The text on this page is set in the default ltr direction. The most common use case to set rtl is for web pages with Hebrew or Arabic text. Here is an example of Arabic set in rtl:

طهيس يس تآخت تهات يس وريتتآن فروم ريغت تو لآفت تهات يس وسآد

There is an HTML attribute for setting the direction as well:

<body dir="rtl">

Both the CSS property and the HTML attribute will cascade the direction to decedent elements. It is recommended you use the HTML attribute, as that will work even if CSS fails or doesn't effect the page for any reason.

There is also a specific HTML tag that can be used for changing the direction of text: <bdo> the bidirectional override element. This exists so there is a semantics-free element to use just for this purpose. For instance:

<p>This text will go left to right.</p>
<p><bdo dir="rtl">This text will go right to left.</bdo></p>

To pair all this with CSS...

*[dir="ltr"] { direction: ltr; unicode-bidi: embed; }

*[dir="rtl"] { direction: rtl; unicode-bidi: embed; }

bdo[dir="ltr"] { direction: ltr; unicode-bidi: bidi-override; }

bdo[dir="rtl"] { direction: rtl; unicode-bidi: bidi-override; }

"bidi" = "bi-directional"

When creating layouts in a pre-flexbox pre-grid world, people often chose between floats and inline-block to create columns. One advantage to inline-block, other than removing the need to clear the float, is that changing the direction property reverses the layout as well. This isn't true for floats, which would need to be reset if a webpage supports multiple languages and the language direction changed from ltr to rtl or vice versa.

If you need to change the direction of an inline element (against what its parent block level element is), you'll either need to use the element, or ensure the inline element sets the unicode-bidi property properly:

<p>Some regular text <bdo dir="rtl">reverse direction</bdo> text text <span dir="rtl">reverse direction</span></p>
span[dir] {
  unicode-bidi: bidi-override;
}

Related Properties

Other Resources

Browser Support

Chrome Safari Firefox Opera IE Android iOS
2.0+ 1.3+ Any 9.2+ 5.5+ Any 3.1+

Comments

  1. I recently wrote a short article on using SASS to simplify creating CSS for RTL/LTR sites and posted the code on GitHub.

  2. Hello,

    I have developed an Arabic online tool to switch all horizontal directions in an input CSS code: LTR to RTL CSS online

  3. Permalink to comment#

    Check “RTL This” for tutorials and tips on front-end web development for LTR/RTL sites.

  4. I’ve been surfing online more than three hours today, yet I never found any interesting article like yours.
    It’s pretty worth enough for me. In my view, if all web owners and bloggers made good content as you did,
    the internet will be much more useful than evera before.

    aol blog list

  5. how to make it in blog.com ?

    thank you :)

Leave a Comment

Posting Code

Markdown is supported in the comment area, so you can write inline code in backticks like `this` or multiline blocks of code in in triple backtick fences like ```this```. You don't need to escape code in backticks, Markdown does that for you.

Sadly, it's kind of broken. WordPress only accepts a subset of HTML in comments, which makes sense, because certainly some HTML can't be allowed, like <script> tags. But this stripping happens before the comment is processed by Markdown (via Jetpack). It seems to me that would be reversed, because after Markdown processes code in backticks, it's escaped, thus safe. If you think you can fix this issue, get in touch!

If you need to make sure the code (typically HTML) you post absolutely posts correctly, escape it and put it within <pre><code> tags.

Current ye@r *

*May or may not contain any actual "CSS" or "Tricks".