This paragraph has spaces in it.
many You can explicitly set this default behavior with the following declaration: p {white-space: normal;} This rule tells the browser to as browsers have always done: discard extra white space Given this value, linefeed characters (carriage returns) are converted into spaces, and any sequence of more than one space in a row is converted to a single space 34 | Text Properties www.it-ebooks.info Should you set white-space to pre, however, the white space in an affected element is treated as though the elements were XHTML pre elements; white space is not ignored, as shown in Figure 38: p {white-space: pre;}This paragraph has spaces in it.
many Figure 38 Honoring the spaces in markup With a white-space value of pre, the browser will pay attention to extra spaces and even carriage returns In this respect, and in this respect alone, any element can be made to act like a pre element The opposite value is nowrap, which prevents text from wrapping within an element, except wherever you use a br element Using nowrap in CSS is much like setting a table cell not to wrap in HTML with , except the white-space value can be applied to any element The effects of the following markup are shown in Figure 39:This paragraph is not allowed to wrap, which means that the only way to end a line is to insert a line-break element If no such element is inserted, then the line will go forever, forcing the user to scroll horizontally to read whatever can't be initially displayed in the browser window.
Figure 39 Suppressing line wrapping with the white-space property You can actually use white-space to replace the nowrap attribute on table cells: td {white-space: nowrap;} The contents of this cell are not wrapped. Neither are the contents of this cell. Nor this one, or any after it, or any other cell in this table. CSS prevents any wrapping from happening. Handling White Space www.it-ebooks.info | 35 CSS 2.1 introduced the values pre-wrap and pre-line, which were absent in earlier versions of CSS The effect of these values is to allow authors to better control white space handling If an element is set to pre-wrap, then text within that element has white space sequences preserved, but text lines are wrapped normally With this value, line-breaks in the source and those that are generated are also honored pre-line is the opposite of pre-wrap and causes white space sequences to collapse as in normal text but honors new lines For example, consider the following markup, which is illustrated in Figure 40:This paragraph has a great many s p a c e s content, but their preservation will not wrapping or line breaking
This paragraph has a great many s p a c e s content, but their collapse will not prevent wrapping or line breaking
Figure 40 Two different ways to handle white space Table summarizes the behaviors of white-space properties Table White-space properties Value White space Linefeeds Auto line wrapping pre-line Collapsed Honored Allowed normal Collapsed Ignored Allowed nowrap Collapsed Ignored Prevented pre Preserved Honored Prevented pre-wrap Preserved Honored Allowed 36 | Text Properties www.it-ebooks.info within its textual prevent line within line its textual Setting Tab Sizes Since white space is preserved in some values of white-space, it stands to reason that tabs (i.e., Unicode code point 0009) will be displayed as, well, tabs But how many spaces should each tab equal? That’s where tab-size comes in tab-size Values: | | inherit Initial value: Applies to: Block elements Inherited: Yes Computed value: The absolute-length equivalent of the specified value By default, any tab character will be treated the same as eight spaces in a row, but you can alter that by using a different integer value Thus, tab-size: will cause each tab to be rendered the same as if it were four spaces in a row If a length value is supplied, then each tab is rendered using that length For example, tab-size: 10px will cause a sequence of three tabs to be rendered as 30 pixels of white space The effects of the following rules is illustrated in Figure 41 Figure 41 Differing tab lengths Note that tab-size is effectively ignored when the value of white-space causes white space to be collapsed (see Table 1) The value will still be computed in such cases, of course, but there will be no visible effect no matter how many tabs appear in the source Handling White Space www.it-ebooks.info | 37 Currently, tab-size is supported in WebKit and Gecko (as –moz-tabsize) In both cases, only integer values are supported, not length values Wrapping and Hyphenation Hyphens can be very useful in situations where there are long words and short line lengths, such as blog posts on mobile devices and portions of The Economist Authors can always insert their own hyphenation hints using the Unicode character U+00AD SOFT HYPHEN (or, in HTML, ), but CSS also offers a way to enable hyphenation without littering up the document with hints hyphens Values: manual | auto | none | inherit Initial value: manual Applies to: All elements Inherited: Yes Computed value: As specified With the default value of manual, hyphens are only inserted where there are manuallyinserted hyphenation markers in the document, such as U+00AD or Otherwise, no hyphenation occurs The value none, on the other hand, suppresses any hyphenation, even if manual break markers are present; thus, U+00AD and are ignored The far more interesting (and potentially inconsistent) value is auto, which permits the browser to insert hyphens and break words at “appropriate” places inside words, even where no manually inserted hyphenation breaks exist This leads to interesting ques‐ tions like what constitutes a “word” and under what circumstances it is appropriate to hyphenate a word, both of which are highly language-dependent User agents are sup‐ posed to prefer manually inserted hyphen breaks to automatically determined breaks, but there are no guarantees An illustration of hyphenation, or the suppression thereof, in the following example is shown in Figure 42: 38 | Text Properties www.it-ebooks.info .cl01 {hyphens: auto;} cl02 {hyphens: manual;} cl03 {hyphens: none;}Supercalifragilisticexpialidocious antidisestablishmentarianism.
Supercalifragilisticexpialidocious antidisestablishmentarianism.
Supercalifragilisticexpialidocious antidisestablishmentarianism.
Supercalifragilisticexpialidocious antidisestablishmentarianism.
Figure 42 Hyphenation results Because hyphenation is so language-dependent, and because the CSS specification does not define precise (or even vague) rules regarding how user agents should carry out hyphenation, there is every chance that hyphenation will be different from one browser to the next Furthermore, if you choose to hyphenate, be careful about the elements to which you apply the hyphenation hyphens is an inherited property, so simply declaring body {hyphens: auto;} will apply hyphenation to everything in your document—including textareas, code samples, blockquotes, and so on Blocking automatic hyphenation at the level of those elements is probably a good idea, using rules something like this: body {hyphens: auto;} code, var, kbd, samp, tt, dir, listing, plaintext, xmp, abbr, acronym, blockquote, q, textarea, input, option {hyphens: manual;} It’s probably obvious why suppressing hyphenation in code samples and code blocks is desirable, especially in languages that use hyphens in things like property and value names (Ahem.) Similar logic holds for keyboard input text—you definitely don’t want a stray dash getting into your Unix command line examples! And so on down the line Wrapping and Hyphenation www.it-ebooks.info | 39 Of course, if you decide that you want to hyphenate some of these elements, just remove them from the selector (It can be kind of fun to watch the text you’re typing into a textarea get auto-hyphenated as you type it.) As of mid-2013, hyphens was supported by all major desktop brows‐ ers, albeit using vendor prefixes, as well as on many mobile brows‐ ers As noted, such support is always language-dependent Hyphens can be suppressed by the effects of other properties, such as word-break, which affects how soft wrapping of text is calculated in various languages word-break Values: normal | break-all | keep-all | inherit Initial value: normal Applies to: All elements Inherited: Yes Computed value: As specified When a run of text is too long to fit into a single line, it is “soft wrapped.” This is in contrast to “hard wraps,” which are things like linefeed characters and elements Where the text is soft-wrapped is determined by the user agent (or the OS it uses), but word-break lets authors influence its decision-making The default value of normal means that text should be wrapped like it always has been In practical terms, this means that text is broken between words, though the definition of a word varies by language In Latin-derived languages like English, this is almost always a space between letter sequences (e.g., words) In ideographic languages like Japanese, each symbol is a word, so breaks can occur between any two symbols In other CJK languages, though, the soft-wrap points may be limited to appear between sequen‐ ces of symbols that are not space-separated Again, that’s all by default, and is the way browsers have handled text for years If you apply the value break-all, then soft wrapping can (and will) occur between any two characters, even if they are in the middle of a word With this value, no hyphens are 40 | Text Properties www.it-ebooks.info shown, even if the soft wrapping occurs at a hyphenation point (see hyphens, earlier) Note that values of the line-break property (described next) can affect the behavior of break-all in CJK text keep-all, on the other hand, suppresses soft wrapping between characters, even in CJK languages where each symbol is a word Thus, in Japanese, a sequence of symbols with no white space will not be soft wrapped, even if this means the text line will exceed the length of its element (This behavior is similar to white-space: pre.) Figure 43 shows a few examples of word-break values, and Table summarizes the effects of each value Figure 43 Altering word breaking behavior Table Word-breaking behavior Value Non-CJK CJK Hyphenation permitted normal As usual As usual Yes break-all After any character After any character No keep-all As usual Around sequences Yes If your interests run to CJK text, then in addition to word-break you will also want to get to know line-break line-break Values: auto | loose | normal | strict | inherit Initial value: auto Applies to: All elements Wrapping and Hyphenation www.it-ebooks.info | 41 Inherited: Yes Computed value: As specified As we just saw, word-break can affect how lines of text are soft-wrapped in CJK text The line-break property also affects such soft wrapping: specifically how wrapping is handled around CJK-specific symbols as well as around non-CJK punctuation (such as exclamation points, hyphens, and ellipses) that appears in text declared to be CJK In other words, line-break applies to certain CJK characters all the time, regardless of the content’s declared language If you throw some CJK characters into a paragraph of English text, line-break will still apply to them, but not to anything else in the text Conversely, if you declare content to be in a CJK language, line-break will continue to apply to those CJK characters plus a number of non-CJK characters within the CJK text These include punctuation marks, currency symbols, and a few other symbols There is no authoritative list of which characters are affected and which are not, but the specification provides a list of recommended symbols and behaviors around those symbols The default value auto allows user agents to soft wrap text as they like, and more im‐ portantly lets UAs vary the line-breaking they based on the situation Thus, for ex‐ ample, the UA can use looser line-breaking rules for short lines of text and stricter rules for long lines In effect, auto allows the user agent to switch between the loose, normal, and strict values as needed, possibly even on a line-by-line basis within a single element Doubtless you can infer that those other values have the following general meanings: loose This value imposes the “least restrictive” rules for wrapping text, and is meant for use when line lengths are short, such as in newspapers normal This value imposes the “most common” rules for wrapping text What exactly “most common” means is not precisely defined, though there is the aforementioned list of recommended behaviors strict This value imposes the “most stringent” rules for wrapping text Again, this is not precisely defined 42 | Text Properties www.it-ebooks.info Wrapping Text After all that information about hyphenation and soft wrapping, what happens when text overflows its container anyway? That’s what overflow-wrap addresses overflow-wrap (neé word-wrap) Values: normal | break-word | inherit Initial value: - Applies to: All elements Inherited: Yes Computed value: - For once, this property couldn’t be more straightforward If the default value of normal is in effect, then wrapping happens as normal (obviously!); which is to say, between words or as directed by the language If break-word is in effect, then wrapping can happen in the middle of words Figure 44 illustrates the difference Figure 44 Overflow wrapping Note that overflow-wrap can only operate if the value of whitespace allows line wrapping If it does not (e.g., with the value pre), then overflow-wrap has no effect Where overflow-wrap gets complicated is in its history and implementation Once upon a time there was a property called word-wrap that did exactly what overflowwrap does The two are so identical that the specification specifically states that user Wrapping and Hyphenation www.it-ebooks.info | 43 agents “ must treat word-wrap as an alternate name for the overflow-wrap property, as if it were a shorthand of overflow-wrap.” Of course, browsers don’t always this As of mid-2013, IE, Firefox, and Safari honored word-wrap but not overflow-wrap; Blackberry, Opera, and Chrome (and, presumably, Blink) honored both For this reason, it’s actually better to use word-wrap, despite it being the vaguely deprecated version If you want to future-proof, use both: pre {word-wrap: break-word; overflow-wrap: break-word;} While overflow-wrap: break-word may appear very similar to word-break: breakall, they are not the same thing To see why, compare the second box in Figure 44 to the top middle box in Figure 43 As you can see, overflow-wrap only kicks in if content actually overflows; thus, when there is an opportunity to use white space in the source to wrap lines, overflow-wrap will take it By contrast, word-break: break-all will cause wrapping when content reaches the wrapping edge, regardless of any whitespace that comes earlier in the line Text Direction If you’re reading this book in English or any number of other languages, then you’re reading the text left to right and top to bottom, which is the flow direction of English Not every language runs this way, of course There are many right-to-left and top-tobottom languages such as Hebrew and Arabic, and CSS2 introduced a property to de‐ scribe their directionality direction Values: ltr | rtl | inherit Initial value: ltr Applies to: All elements Inherited: Yes Computed value: As specified The direction property affects the writing direction of text in a block-level element, the direction of table column layout, the direction in which content horizontally over‐ flows its element box, and the position of the last line of a fully justified element For 44 | Text Properties www.it-ebooks.info inline elements, direction applies only if the property unicode-bidi is set to either embed or bidi-override (See below for a description of unicode-bidi.) Before CSS3, CSS included no provisions in the specification for topto-bottom languages As of this writing, the CSS3 Text Module is a Candidate Recommendation, and it addresses this point with a new property called writing-mode, which was poorly supported as of mid-2013 Although ltr is the default, it is expected that if a browser is displaying right-to-left text, the value will be changed to rtl Thus, a browser might carry an internal rule stating something like the following: *:lang(ar), *:lang(he) {direction: rtl;} The real rule would be longer and encompass all right-to-left languages, not just Arabic and Hebrew, but it illustrates the point While CSS attempts to address writing direction, Unicode has a much more robust method for handling directionality With the property unicode-bidi, CSS authors can take advantage of some of Unicode’s capabilities unicode-bidi Values: normal | embed | bidi-override | inherit Initial value: normal Applies to: All elements Inherited: No Computed value: As specified Here we’ll simply quote the value descriptions from the CSS 2.1 specification, which a good job of capturing the essence of each value: Text Direction www.it-ebooks.info | 45 normal The element does not open an additional level of embedding with respect to the bidirectional algorithm For inline-level elements, implicit reordering works across element boundaries embed If the element is inline-level, this value opens an additional level of embedding with respect to the bidirectional algorithm The direction of this embedding level is given by the direction property Inside the element, reordering is done implicitly This corresponds to adding an LRE (U+202A; for direction: ltr) or an RLE (U+202B; for direction: rtl) at the start of the element and a PDF (U+202C) at the end of the element bidi-override This creates an override for inline-level elements For block-level elements, this creates an override for inline-level descendants not within another block This means that, inside the element, reordering is strictly in sequence according to the direction property; the implicit part of the bidirectional algorithm is ignored This corresponds to adding an LRO (U+202D; for direction: ltr) or RLO (U+202E; for direction: rtl) at the start of the element and a PDF (U+202C) at the end of the element Summary Even without altering the font face, there are many ways to change the appearance of text There are classic effects such as underlining, of course, but CSS also enables you to draw lines over text or through it, change the amount of space between words and letters, indent the first line of a paragraph (or other block-level element), align text in various ways, exert influence over the hyphenation and line-breaking of text, and much more You can even alter the amount of space between lines of text There is also support in CSS for languages other than those that are written left-to-right, top-to-bottom Giv‐ en that so much of the Web is text, the strength of these properties makes a great deal of sense Recent developments in improving text legibility and placement are likely only the beginnings of what we will eventually be able to with regards to text styling 46 | Text Properties www.it-ebooks.info About the Author Eric A Meyer has been working with the Web since late 1993 and is an internationally recognized expert on the subjects of HTML, CSS, and web standards A widely read author, he is a past member of the CSS&FP Working Group and was the primary creator of the W3C’s CSS1 Test Suite In 2006, Eric was inducted into the International Academy of Digital Arts and Sciences for “international recognition on the topics of HTML and CSS” and helping to “inform excellence and efficiency on the Web.” Eric is currently the principal founder at Complex Spiral Consulting, which counts among its clients a wide variety of corporations, educational institutions, and govern‐ ment agencies He is also, along with Jeffrey Zeldman, co-founder of An Event Apart (“The design conference for people who make websites”), and he speaks regularly at that conference as well as many others Eric lives with his family in Cleveland, Ohio, which is a much nicer city than you’ve been led to believe A historian by training and inclination, he enjoys a good meal whenever he can and considers almost every form of music to be worthwhile Colophon The animal on the cover of CSS Text is a salmon (Salmonidae family) The cover image is from Dover Pictorial Archive The cover font is Adobe ITC Gara‐ mond The text font is Adobe Minion Pro; the heading font is Adobe Myriad Condensed; and the code font is Dalton Maag’s Ubuntu Mono www.it-ebooks.info ... Vertically Aligning Text Word Spacing and Letter Spacing Word Spacing Letter Spacing Spacing and Alignment Text Transformation Text Decoration Weird Decorations Text Rendering Text Shadows Handling... first letter in a paragraph, which shoves the text over Thanks to CSS, there’s a much better way to indent text, called text- indent www.it-ebooks.info text- indent Values: | ... the lines of text in an element are aligned with respect to one another | Text Properties www.it-ebooks.info text- align CSS 2.1 values: left | center | right | justify | inherit CSS3 values: