Gaia/CSS Guidelines: Difference between revisions
(Adding guidelines for RTL/LTR/bidi) |
(→Direction (RTL/LTR and Bidi): additional guidelines: direction-sensitive rules) |
||
Line 121: | Line 121: | ||
==Direction (RTL/LTR and | ==Direction (RTL/LTR and BiDi)== | ||
Many UI elements are have to be mirrored for languages written Right-To-Left. Here’s how you can make it easier. | |||
===Use the same specificity for LTR and RTL=== | |||
Rules that are direction-specific (e.g LTR) should have the same specificity as their RTL counterparts. Rules with an implicit direction should be made explicit using either the dir attribute selector (html[dir="ltr|rtl"]), or the :-moz-dir(rtl) pseudo-class. RTL and LTR -specific rules should always be grouped together in the same stylesheet to simplify maintenance. | Rules that are direction-specific (e.g LTR) should have the same specificity as their RTL counterparts. Rules with an implicit direction should be made explicit using either the dir attribute selector (html[dir="ltr|rtl"]), or the :-moz-dir(rtl) pseudo-class. RTL and LTR -specific rules should always be grouped together in the same stylesheet to simplify maintenance. | ||
<pre> | <pre> | ||
Line 129: | Line 133: | ||
html[dir="rtl"] .foo { | html[dir="rtl"] .foo { | ||
right: 0; | right: 0; | ||
} | |||
</pre> | |||
===Use direction-sensitive rules=== | |||
Many CSS rules that include a `left` or `right` keyword can be written with `start` or `end` instead: | |||
{| class="wikitable" style="width: 100%" | |||
|- | |||
! left/right !! begin/end !! browser compatibility | |||
|- | |||
|style="text-align: center" colspan="3"| text alignment | |||
|- | |||
| text-align: left<br>text-align: right || text-align: start<br>text-align: end || | |||
|- | |||
|style="text-align: center" colspan="3"| padding, margin, border | |||
|- | |||
| padding-left<br>padding-right || padding-inline-start<br>padding-inline-end || Gecko 41+ | |||
|- | |||
| border-left<br>border-right || border-inline-start<br>border-inline-end || Gecko 41+ | |||
|- | |||
| margin-left<br>margin-right || margin-inline-start<br>margin-inline-end || Gecko 41+ | |||
|- | |||
|style="text-align: center" colspan="3"| absolute positioning | |||
|- | |||
| left<br>right || offset-inline-start<br>offset-inline-end || Gecko 41+ | |||
|- | |||
|style="text-align: center" colspan="3"| float positioning | |||
|- | |||
| float: left<br>float: right || float: inline-start<br>float: inline-end || (not yet supported) | |||
|} | |||
'''Warning:''' in most cases, you don’t want to apply these direction-sensitive rules to HTML elements carrying a <code>dir="auto"</code> attribute because the layout would be modified by the content direction. | |||
===margin, padding, border: do not use 4-value shorthands=== | |||
Beware of the shorthands on margin/padding/border rules: | |||
<pre> | |||
margin: 1rem; /* OK: start and end margins are set to 1rem */ | |||
margin: 1rem 2rem; /* OK: start and end margins are set to 2rem */ | |||
margin: 1rem 2rem 3rem; /* OK: start and end margins are set to 2rem */ | |||
margin: 1rem 2rem 3rem 4rem; /* direction-specific! */ | |||
</pre> | |||
Shorthands with 1, 2 or 3 values are BiDi-proof; shorthands with 4 values are not. | |||
As an example, rather than using: | |||
<pre> | |||
.myClass { | |||
padding: 1rem 2rem 3rem 4rem; | |||
} | |||
</pre> | |||
you should use: | |||
<pre> | |||
.myClass { | |||
padding: 1rem 2rem 3rem; | |||
padding-inline-start: 4rem; | |||
} | |||
</pre> | |||
or, if the target element has a <code>dir="auto"</code> attribute (or if your browser doesn’t support -inline-start): | |||
<pre> | |||
.myClass { | |||
padding: 1rem 2rem 3rem; | |||
} | |||
html[dir="ltr"] .myClass { | |||
padding-left: 4rem; | |||
} | |||
html[dir="rtl"] .myClass { | |||
padding-right: 4rem; | |||
} | } | ||
</pre> | </pre> |
Revision as of 08:32, 16 September 2015
Indentation
- No tabs.
- Indent by two spaces.
- No (trailing spaces) spaces that appears at the end of a string.
Style
- Use lowercased-and-hyphen delimited classes and ids.
Units
- em, rem, %
- You don't have to add any units, if the value is 0
body { font-size: 10px; } 1rem = 10px 1px = 0.1rem
Selectors
- end in an opening brace
- be closed with a closing brace on a separate line without indentation
- Multiple selectors should each be on a single line
/*single selector*/ .gaia { ... } /*multiple selectors*/ .b2g, .gaia, .firefox-os { ... }
Comments
Describe a section of code
/** * Your Comment Here. */
Shorter inline comments may be added after a property, preceded with a space
... { padding-left: 2em; /* dir="ltr" */ }
Properties
- All properties should be on the following line after the opening brace.
- have a single space before the property value
- allways add a semi-colon at the end
- multiple values - each value should be separated with a space.
.b2g { color: #efefef; font-size: 0.9rem; font-family: Open Sans, sans-serif; }
Background
- color is first
- image path without any quotes
- background repeat
- background position with % or rem
- Don't use shorthand property when you change only a single value(except when you need to override a rules)
... { background: #fff url(images/default.png) no-repeat 3rem 100%; padding: 0 0 0 5rem; }
Multiple Backgrounds
... { background: url(images/image-3.png), url(images/image-2.png), url(images/image-1.png), #fff; }
Gradients
... { background: linear-gradient(to bottom, #fff, #000); }
Borders
... { border: 0.1rem solid #fff; }
Colors
... { color: #0f0; /* HEX color - defined using the 3-character dash notation */ color: #00ff00 /* HEX color - defined using the 6-character dash notation */ color: rgba( 34, 12, 64, 0.3); /* rgba(R,G,B,a) - using only for transparent colors */ }
Direction (RTL/LTR and BiDi)
Many UI elements are have to be mirrored for languages written Right-To-Left. Here’s how you can make it easier.
Use the same specificity for LTR and RTL
Rules that are direction-specific (e.g LTR) should have the same specificity as their RTL counterparts. Rules with an implicit direction should be made explicit using either the dir attribute selector (html[dir="ltr|rtl"]), or the :-moz-dir(rtl) pseudo-class. RTL and LTR -specific rules should always be grouped together in the same stylesheet to simplify maintenance.
html[dir="ltr"] .foo { left: 0; } html[dir="rtl"] .foo { right: 0; }
Use direction-sensitive rules
Many CSS rules that include a `left` or `right` keyword can be written with `start` or `end` instead:
left/right | begin/end | browser compatibility |
---|---|---|
text alignment | ||
text-align: left text-align: right |
text-align: start text-align: end |
|
padding, margin, border | ||
padding-left padding-right |
padding-inline-start padding-inline-end |
Gecko 41+ |
border-left border-right |
border-inline-start border-inline-end |
Gecko 41+ |
margin-left margin-right |
margin-inline-start margin-inline-end |
Gecko 41+ |
absolute positioning | ||
left right |
offset-inline-start offset-inline-end |
Gecko 41+ |
float positioning | ||
float: left float: right |
float: inline-start float: inline-end |
(not yet supported) |
Warning: in most cases, you don’t want to apply these direction-sensitive rules to HTML elements carrying a dir="auto"
attribute because the layout would be modified by the content direction.
margin, padding, border: do not use 4-value shorthands
Beware of the shorthands on margin/padding/border rules:
margin: 1rem; /* OK: start and end margins are set to 1rem */ margin: 1rem 2rem; /* OK: start and end margins are set to 2rem */ margin: 1rem 2rem 3rem; /* OK: start and end margins are set to 2rem */ margin: 1rem 2rem 3rem 4rem; /* direction-specific! */
Shorthands with 1, 2 or 3 values are BiDi-proof; shorthands with 4 values are not.
As an example, rather than using:
.myClass { padding: 1rem 2rem 3rem 4rem; }
you should use:
.myClass { padding: 1rem 2rem 3rem; padding-inline-start: 4rem; }
or, if the target element has a dir="auto"
attribute (or if your browser doesn’t support -inline-start):
.myClass { padding: 1rem 2rem 3rem; } html[dir="ltr"] .myClass { padding-left: 4rem; } html[dir="rtl"] .myClass { padding-right: 4rem; }