- Overview: Styling text
- Next
In this article we’ll start you on your journey towards mastering text styling with CSS. Here we’ll go through all the basic fundamentals of text/font styling in detail, including setting font weight, family and style, font shorthand, text alignment and other effects, and line and letter spacing.
Prerequisites: |
Basic computer literacy, HTML basics (study Introduction to HTML), CSS basics (study Introduction to CSS). |
---|---|
Objective: |
To learn the fundamental properties and techniques needed to style text on web pages. |
What is involved in styling text in CSS?
If you have worked with HTML or CSS already, e.g., by working through these tutorials in order, then you know that text inside an element is laid out inside the element’s content box. It starts at the top left of the content area (or the top right, in the case of RTL language content), and flows towards the end of the line. Once it reaches the end, it goes down to the next line and flows to the end again. This pattern repeats until all the content has been placed in the box. Text content effectively behaves like a series of inline elements, being laid out on lines adjacent to one another, and not creating line breaks until the end of the line is reached, or unless you force a line break manually using the <br>
element.
Note: If the above paragraph leaves you feeling confused, then no matter — go back and review our Box model article to brush up on the box model theory before carrying on.
The CSS properties used to style text generally fall into two categories, which we’ll look at separately in this article:
- Font styles: Properties that affect a text’s font, e.g., which font gets applied, its size, and whether it’s bold, italic, etc.
- Text layout styles: Properties that affect the spacing and other layout features of the text, allowing manipulation of, for example, the space between lines and letters, and how the text is aligned within the content box.
Note: Bear in mind that the text inside an element is all affected as one single entity. You can’t select and style subsections of text unless you wrap them in an appropriate element (such as a <span>
or <strong>
), or use a text-specific pseudo-element like ::first-letter (selects the first letter of an element’s text), ::first-line (selects the first line of an element’s text), or ::selection (selects the text currently highlighted by the cursor).
Fonts
Let’s move straight on to look at properties for styling fonts. In this example, we’ll apply some CSS properties to the following HTML sample:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
You can find the finished example on GitHub (see also the source code).
Color
The color
property sets the color of the foreground content of the selected elements, which is usually the text, but can also include a couple of other things, such as an underline or overline placed on text using the text-decoration
property.
color
can accept any CSS color unit, for example:
This will cause the paragraphs to become red, rather than the standard browser default of black, like so:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
Font families
To set a different font for your text, you use the font-family
property — this allows you to specify a font (or list of fonts) for the browser to apply to the selected elements. The browser will only apply a font if it is available on the machine the website is being accessed on; if not, it will just use a browser default font. A simple example looks like so:
p {
font-family: Arial;
}
This would make all paragraphs on a page adopt the arial font, which is found on any computer.
Web safe fonts
Speaking of font availability, there are only a certain number of fonts that are generally available across all systems and can therefore be used without much worry. These are the so-called web safe fonts.
Most of the time, as web developers we want to have more specific control over the fonts used to display our text content. The problem is to find a way to know which font is available on the computer used to see our web pages. There is no way to know this in every case, but the web safe fonts are known to be available on nearly all instances of the most used operating systems (Windows, macOS, the most common Linux distributions, Android, and iOS).
The list of actual web safe fonts will change as operating systems evolve, but it’s reasonable to consider the following fonts web safe, at least for now (many of them have been popularized thanks to the Microsoft Core fonts for the Web initiative in the late 90s and early 2000s):
Name | Generic type | Notes |
---|---|---|
Arial | sans-serif |
It’s often considered best practice to also add Helvetica as a preferred alternative to Arial as, although their font faces are almost identical, Helvetica is considered to have a nicer shape, even if Arial is more broadly available. |
Courier New | monospace |
Some OSes have an alternative (possibly older) version of the Courier New font called Courier. It’s considered best practice to use both with Courier New as the preferred alternative. |
Georgia | serif | |
Times New Roman | serif |
Some OSes have an alternative (possibly older) version of the Times New Roman font called Times. It’s considered best practice to use both with Times New Roman as the preferred alternative. |
Trebuchet MS | sans-serif |
You should be careful with using this font — it isn’t widely available on mobile OSes. |
Verdana | sans-serif |
Note: Among various resources, the cssfontstack.com website maintains a list of web safe fonts available on Windows and macOS operating systems, which can help you make your decision about what you consider safe for your usage.
Note: There is a way to download a custom font along with a webpage, to allow you to customize your font usage in any way you want: web fonts. This is a little bit more complex, and we will discuss it in a separate article later on in the module.
Default fonts
CSS defines five generic names for fonts: serif
, sans-serif
, monospace
, cursive
, and fantasy
. These are very generic and the exact font face used from these generic names can vary between each browser and each operating system that they are displayed on. It represents a worst case scenario where the browser will try its best to provide a font that looks appropriate. serif
, sans-serif
, and monospace
are quite predictable and should provide something reasonable. On the other hand, cursive
and fantasy
are less predictable and we recommend using them very carefully, testing as you go.
The five names are defined as follows:
Term | Definition | Example |
---|---|---|
serif |
Fonts that have serifs (the flourishes and other small details you see at the ends of the strokes in some typefaces). |
|
sans-serif |
Fonts that don’t have serifs. |
|
monospace |
Fonts where every character has the same width, typically used in code listings. |
|
cursive |
Fonts that are intended to emulate handwriting, with flowing, connected strokes. |
|
fantasy |
Fonts that are intended to be decorative. |
|
Font stacks
Since you can’t guarantee the availability of the fonts you want to use on your webpages (even a web font could fail for some reason), you can supply a font stack so that the browser has multiple fonts it can choose from. This involves a font-family
value consisting of multiple font names separated by commas, e.g.,
p {
font-family: "Trebuchet MS", Verdana, sans-serif;
}
In such a case, the browser starts at the beginning of the list and looks to see if that font is available on the machine. If it is, it applies that font to the selected elements. If not, it moves on to the next font, and so on.
It is a good idea to provide a suitable generic font name at the end of the stack so that if none of the listed fonts are available, the browser can at least provide something approximately suitable. To emphasize this point, paragraphs are given the browser’s default serif font if no other option is available — which is usually Times New Roman — this is no good for a sans-serif font!
Note: Font names that have more than one word — like Trebuchet MS
— need to be surrounded by quotes, for example "Trebuchet MS"
.
A font-family example
Let’s add to our previous example, giving the paragraphs a sans-serif font:
p {
color: red;
font-family: Helvetica, Arial, sans-serif;
}
This gives us the following result:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
Font size
In our previous module’s CSS values and units article, we reviewed length and size units. Font size (set with the font-size
property) can take values measured in most of these units (and others, such as percentages); however, the most common units you’ll use to size text are:
px
(pixels): The number of pixels high you want the text to be. This is an absolute unit — it results in the same final computed value for the font on the page in pretty much any situation.em
s: 1em
is equal to the font size set on the parent element of the current element we are styling (more specifically, the width of a capital letter M contained inside the parent element). This can become tricky to work out if you have a lot of nested elements with different font sizes set, but it is doable, as you’ll see below. Why bother? It is quite natural once you get used to it, and you can useem
to size everything, not just text. You can have an entire website sized usingem
, which makes maintenance easy.rem
s: These work just likeem
, except that 1rem
is equal to the font size set on the root element of the document (i.e.<html>
), not the parent element. This makes doing the maths to work out your font sizes much easier, although if you want to support really old browsers, you might struggle —rem
is not supported in Internet Explorer 8 and below.
The font-size
of an element is inherited from that element’s parent element. This all starts with the root element of the entire document — <html>
— the standard font-size
of which is set to 16px
across browsers. Any paragraph (or another element that doesn’t have a different size set by the browser) inside the root element will have a final size of 16px
. Other elements may have different default sizes. For example, an h1 element has a size of 2em
set by default, so it will have a final size of 32px
.
Things become more tricky when you start altering the font size of nested elements. For example, if you had an <article>
element in your page, and set its font-size
to 1.5 em
(which would compute to 24 px
final size), and then wanted the paragraphs inside the <article>
elements to have a computed font size of 20 px
, what em
value would you use?
<!-- document base font-size is 16px -->
<article>
<!-- If my font-size is 1.5em -->
<p>My paragraph</p>
<!-- How do I compute to 20px font-size? -->
</article>
You would need to set its em
value to 20/24, or 0.83333333 em
. The maths can be complicated, so you need to be careful about how you style things. It is best to use rem
where you can to keep things simple, and avoid setting the font-size
of container elements where possible.
Font style, font weight, text transform, and text decoration
CSS provides four common properties to alter the visual weight/emphasis of text:
font-style
: Used to turn italic text on or off. Possible values are as follows (you’ll rarely use this, unless you want to turn some italic styling off for some reason):normal
: Sets the text to the normal font (turns existing italics off).italic
: Sets the text to use the italic version of the font, if available; if not, it will simulate italics with oblique instead.oblique
: Sets the text to use a simulated version of an italic font, created by slanting the normal version.
font-weight
: Sets how bold the text is. This has many values available in case you have many font variants available (such as -light, -normal, -bold, -extrabold, -black, etc.), but realistically you’ll rarely use any of them except fornormal
andbold
:normal
,bold
: Normal and bold font weight.lighter
,bolder
: Sets the current element’s boldness to be one step lighter or heavier than its parent element’s boldness.100
–900
: Numeric boldness values that provide finer grained control than the above keywords, if needed.
text-transform
: Allows you to set your font to be transformed. Values include:none
: Prevents any transformation.uppercase
: Transforms all text to capitals.lowercase
: Transforms all text to lower case.capitalize
: Transforms all words to have the first letter capitalized.full-width
: Transforms all glyphs to be written inside a fixed-width square, similar to a monospace font, allowing aligning of, e.g., Latin characters along with Asian language glyphs (like Chinese, Japanese, Korean).
text-decoration
: Sets/unsets text decorations on fonts (you’ll mainly use this to unset the default underline on links when styling them). Available values are:none
: Unsets any text decorations already present.underline
: Underlines the text.overline
: Gives the text an overline.line-through
: Puts a strikethrough over the text.
You should note that
text-decoration
can accept multiple values at once if you want to add multiple decorations simultaneously, for example,text-decoration: underline overline
. Also note thattext-decoration
is a shorthand property fortext-decoration-line
,text-decoration-style
, andtext-decoration-color
. You can use combinations of these property values to create interesting effects, for example:text-decoration: line-through red wavy
.
Let’s look at adding a couple of these properties to our example:
Our new result is like so:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
html {
font-size: 10px;
}
h1 {
font-size: 5rem;
text-transform: capitalize;
}
h1 + p {
font-weight: bold;
}
p {
font-size: 1.5rem;
color: red;
font-family: Helvetica, Arial, sans-serif;
}
Text drop shadows
You can apply drop shadows to your text using the text-shadow
property. This takes up to four values, as shown in the example below:
text-shadow: 4px 4px 5px red;
The four properties are as follows:
- The horizontal offset of the shadow from the original text — this can take most available CSS length and size units, but you’ll most commonly use
px
; positive values move the shadow right, and negative values left. This value has to be included. - The vertical offset of the shadow from the original text. This behaves similarly to the horizontal offset, except that it moves the shadow up/down, not left/right. This value has to be included.
- The blur radius: a higher value means the shadow is dispersed more widely. If this value is not included, it defaults to 0, which means no blur. This can take most available CSS length and size units.
- The base color of the shadow, which can take any CSS color unit. If not included, it defaults to
currentcolor
, i.e. the shadow’s color is taken from the element’scolor
property.
Multiple shadows
You can apply multiple shadows to the same text by including multiple shadow values separated by commas, for example:
h1 {
text-shadow: 1px 1px 1px red, 2px 2px 1px red;
}
If we applied this to the h1 element in our Tommy The Cat example, we’d end up with this:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
html {
font-size: 10px;
}
h1 {
font-size: 5rem;
text-transform: capitalize;
}
h1 + p {
font-weight: bold;
}
p {
font-size: 1.5rem;
color: red;
font-family: Helvetica, Arial, sans-serif;
}
Text layout
With basic font properties out of the way, let’s have a look at properties we can use to affect text layout.
Text alignment
The text-align
property is used to control how text is aligned within its containing content box. The available values are listed below. They work in pretty much the same way as they do in a regular word processor application:
left
: Left-justifies the text.right
: Right-justifies the text.center
: Centers the text.justify
: Makes the text spread out, varying the gaps in between the words so that all lines of text are the same width. You need to use this carefully — it can look terrible, especially when applied to a paragraph with lots of long words in it. If you are going to use this, you should also think about using something else along with it, such ashyphens
, to break some of the longer words across lines.
If we applied text-align: center;
to the h1 in our example, we’d end up with this:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
html {
font-size: 10px;
}
h1 {
font-size: 5rem;
text-transform: capitalize;
text-shadow: 1px 1px 1px red, 2px 2px 1px red;
text-align: center;
}
h1 + p {
font-weight: bold;
}
p {
font-size: 1.5rem;
color: red;
font-family: Helvetica, Arial, sans-serif;
}
Line height
The line-height
property sets the height of each line of text. This property can not only take most length and size units, but can also take a unitless value, which acts as a multiplier and is generally considered the best option. With a unitless value, the font-size
gets multiplied and results in the line-height
. Body text generally looks nicer and is easier to read when the lines are spaced apart. The recommended line height is around 1.5 – 2 (double spaced). To set our lines of text to 1.6 times the height of the font, we’d use:
Applying this to the <p>
elements in our example would give us this result:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
html {
font-size: 10px;
}
h1 {
font-size: 5rem;
text-transform: capitalize;
text-shadow: 1px 1px 1px red, 2px 2px 1px red;
text-align: center;
}
h1 + p {
font-weight: bold;
}
p {
font-size: 1.5rem;
color: red;
font-family: Helvetica, Arial, sans-serif;
line-height: 1.6;
}
Letter and word spacing
The letter-spacing
and word-spacing
properties allow you to set the spacing between letters and words in your text. You won’t use these very often, but might find a use for them to obtain a specific look, or to improve the legibility of a particularly dense font. They can take most length and size units.
To illustrate, we could apply some word- and letter-spacing to the first line of each <p>
element in our HTML sample with:
p::first-line {
letter-spacing: 4px;
word-spacing: 4px;
}
This renders our HTML as:
<h1>Tommy the cat</h1>
<p>Well I remember it as though it were a meal ago…</p>
<p>
Said Tommy the Cat as he reeled back to clear whatever foreign matter may have
nestled its way into his mighty throat. Many a fat alley rat had met its
demise while staring point blank down the cavernous barrel of this awesome
prowling machine. Truly a wonder of nature this urban predator — Tommy the cat
had many a story to tell. But it was a rare occasion such as this that he did.
</p>
html {
font-size: 10px;
}
h1 {
font-size: 5rem;
text-transform: capitalize;
text-shadow: 1px 1px 1px red, 2px 2px 1px red;
text-align: center;
letter-spacing: 2px;
}
h1 + p {
font-weight: bold;
}
p {
font-size: 1.5rem;
color: red;
font-family: Helvetica, Arial, sans-serif;
line-height: 1.6;
letter-spacing: 1px;
}
Other properties worth looking at
The above properties give you an idea of how to start styling text on a webpage, but there are many more properties you could use. We just wanted to cover the most important ones here. Once you’ve become used to using the above, you should also explore the following:
Font styles:
font-variant
: Switch between small caps and normal font alternatives.font-kerning
: Switch font kerning options on and off.font-feature-settings
: Switch various OpenType font features on and off.font-variant-alternates
: Control the use of alternate glyphs for a given font-face.font-variant-caps
: Control the use of alternate capital glyphs.font-variant-east-asian
: Control the usage of alternate glyphs for East Asian scripts, like Japanese and Chinese.font-variant-ligatures
: Control which ligatures and contextual forms are used in text.font-variant-numeric
: Control the usage of alternate glyphs for numbers, fractions, and ordinal markers.font-variant-position
: Control the usage of alternate glyphs of smaller sizes positioned as superscript or subscript.font-size-adjust
: Adjust the visual size of the font independently of its actual font size.font-stretch
: Switch between possible alternative stretched versions of a given font.text-underline-position
: Specify the position of underlines set using thetext-decoration-line
propertyunderline
value.text-rendering
: Try to perform some text rendering optimization.
Text layout styles:
text-indent
: Specify how much horizontal space should be left before the beginning of the first line of the text content.text-overflow
: Define how overflowed content that is not displayed is signaled to users.white-space
: Define how whitespace and associated line breaks inside the element are handled.word-break
: Specify whether to break lines within words.direction
: Define the text direction. (This depends on the language and usually it’s better to let HTML handle that part as it is tied to the text content.)hyphens
: Switch on and off hyphenation for supported languages.line-break
: Relax or strengthen line breaking for Asian languages.text-align-last
: Define how the last line of a block or a line, right before a forced line break, is aligned.text-orientation
: Define the orientation of the text in a line.overflow-wrap
: Specify whether or not the browser may break lines within words in order to prevent overflow.writing-mode
: Define whether lines of text are laid out horizontally or vertically and the direction in which subsequent lines flow.
Font shorthand
Many font properties can also be set through the shorthand property font
. These are written in the following order: font-style
, font-variant
, font-weight
, font-stretch
, font-size
, line-height
, and font-family
.
Among all those properties, only font-size
and font-family
are required when using the font
shorthand property.
A forward slash has to be put in between the font-size
and line-height
properties.
A full example would look like this:
font: italic normal bold normal 3em/1.5 Helvetica, Arial, sans-serif;
Active learning: Playing with styling text
In this active learning session we don’t have any specific exercises for you to do. We’d just like you to have a good play with some font/text layout properties. See for yourself what you can come up with! You can either do this using offline HTML/CSS files, or enter your code into the live editable example below.
If you make a mistake, you can always reset it using the Reset button.
<div
class="body-wrapper"
style="font-family: 'Open Sans Light',Helvetica,Arial,sans-serif;">
<h2>HTML Input</h2>
<textarea
id="code"
class="html-input"
style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;">
<p>Some sample text for your delight</p>
</textarea>
<h2>CSS Input</h2>
<textarea
id="code"
class="css-input"
style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;">
p {
}
</textarea>
<h2>Output</h2>
<div
class="output"
style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;"></div>
<div class="controls">
<input
id="reset"
type="button"
value="Reset"
style="margin: 10px 10px 0 0;" />
</div>
</div>
const htmlInput = document.querySelector(".html-input");
const cssInput = document.querySelector(".css-input");
const reset = document.getElementById("reset");
let htmlCode = htmlInput.value;
let cssCode = cssInput.value;
const output = document.querySelector(".output");
const styleElem = document.createElement("style");
const headElem = document.querySelector("head");
headElem.appendChild(styleElem);
function drawOutput() {
output.innerHTML = htmlInput.value;
styleElem.textContent = cssInput.value;
}
reset.addEventListener("click", () => {
htmlInput.value = htmlCode;
cssInput.value = cssCode;
drawOutput();
});
htmlInput.addEventListener("input", drawOutput);
cssInput.addEventListener("input", drawOutput);
window.addEventListener("load", drawOutput);
Summary
We hope you enjoyed playing with text in this article! The next article will provide you with all you need to know about styling HTML lists.
- Overview: Styling text
- Next
Text spacing and placement in CSS is controlled using the letter-spacing
, word-spacing
, line-height
, and text-indent
properties. Learn how to set text spacing and placement in the following steps.
- The
letter-spacing
property is used to specify the amount of space between letters. The amount indicated is in addition to the default spacing. The amount is specified in units. For example:<div style="letter-spacing: 1em;">It's a wide wide word!</div>
- The
word-spacing
property is used to specify the amount of space between words. The amount indicated is in addition to the default spacing. The amount is specified in units. For example:<div style="word-spacing: 1em;">It's a wide wide sentence!</div>
- The
line-height
property is used to specify the amount of vertical space between lines of text. The line-height can be specified in number of units, percentage, or with a multiplier.<div style="line-height: 1.5;">
- The
text-indent
property is used to indent (or outdent) the first line of a block of text. The value can be specified in number of units or in percentage of the width of the containing block.<div style="text-indent: 50px;">
The following code sample shows all of these properties in use:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Spacing and Line Height</title>
</head>
<body>
<div style="margin-left: 300px;">
<h1>Spacing and Line Height</h1>
<h2>Letter Spacing</h2>
<div style="letter-spacing: 1em;">letter-spacing: 1em</div>
<div style="letter-spacing: -1em;">letter-spacing: -1em</div>
<h2>Word Spacing</h2>
<div style="word-spacing: 1em;">word-spacing: 1em</div>
<div style="word-spacing: 1em;">It's a wide wide sentence.</div>
<h2>Line Height</h2>
<div style="line-height: 1.5;">
line-height: 1.5<br>
line-height: 1.5<br>
line-height: 1.5
</div>
<div style="line-height: 150%;">
line-height: 150%<br>
line-height: 150%<br>
line-height: 150%
</div>
<div style="line-height: 1.5em;">
line-height: 1.5em<br>
line-height: 1.5em<br>
line-height: 1.5em
</div>
<h2>Text-Indent</h2>
<div style="text-indent: 50px;">
text-indent:50px - text-indent only applies to the first line of text.<br>
The next lines will not be indented.
</div>
<div style="text-indent: 10%;">
text-indent:10% - text-indent only applies to the first line of text.<br>
The next lines will not be indented.
</div>
</div>
</body>
</html>
The above code will render the following:
Интернет, как средство коммуникации, имеет ряд особенностей. Настолько ярко выраженных, что многие считают, что естественный и плавный переход к типографике это очень непростое дело.
Один и тот же сайт может отображаться по-разному на различных типах устройств, при различных разрешениях экрана, персональных настройках браузера, и т.д. Текстовые элементы могут задаваться различным цветом, размером, шрифтом, все это и многое другое дает нам представление об основной идее сайта и бренде.
Наш основной инструмент для управления видом текста в интернете — это CSS. Более подробное описание свойств CSS, которые я представлю в этой статье, вы можете найти в спецификации CSS Text Module.
Модуль описывает управление настройками шрифтов CSS; это свойства CSS, которые управляют переводом исходного текста в отформатированный, разбитый на строки текст.
Другими словами, CSS Text Module отвечает за отображение символов и слов в браузере и за то, как они располагаются, выравниваются, переносятся и т.д. с помощью CSS.
- Управление регистром букв
- Значение capitalize
- Значение uppercase
- Значение lowercase
- Значение full-width
- Еще несколько замечаний
- Как обрабатываются пустые диапазоны
- Значение pre
- Значение pre-wrap
- Значение pre-line
- Значение nowrap
- Контроль над разрывами строк внутри слов
- Свойство word-wrap/overflow-wrap
- Свойство hyphens
- Управление расстоянием между словами и буквами
- Свойство word-spacing
- Свойство letter-spacing
- Дополнительная информация
- Последние свойства CSS для выравнивания текста
- Свойство text-align-last
- Отступы текста
- Заключение
Что представляет собой основную единицу текста или слова, а также, где именно допускается разрыв слов в данной части текста, зависит от правил языка, используемого на сайте. Именно поэтому важно объявлять эту информацию в HTML-документе (как правило, в атрибуте lang элемента <html>).
В этой статье я рассмотрю две темы по типографике в дизайне:
- шрифты, которые являются визуальным представлением символов, т.е. знаков и их свойств;
- функции CSS, связанные с оформлением текста, таким как подчеркивание, тени и выделение.
Если вам интересно, вы можете найти самую свежую документацию по CSS-свойствам шрифтов и оформления текста в CSS Fonts Module Level 3 и CSS Text Decoration Module Level 3 соответственно.
Иногда текстовые элементы должны отображаться заглавными буквами, например, имя и фамилия. CSS предоставляет нам возможность управлять регистром букв с помощью свойства text-transform.
Значение по умолчанию для свойства text-transform — none, то есть, данное преобразование к буквам не применяется.
Если вы хотите, чтобы первая буква каждого отображаемого слова выводилась в верхнем регистре, при этом все остальные буквы оставались без изменений (независимо от их регистра в HTML-документе), используйте значение capitalize:
HTML:
<h2>alice's adventures in wonderland</h2>
CSS:
h2 { text-transform: capitalize; }
Обратите внимание, что capitalize не следует конвенции регистра заголовков: все первые буквы слов в приведенном выше примере выводятся с заглавной.
Чтобы все буквы выводились в верхнем регистре независимо от их регистра в HTML-документе, в экранной типографике используется значение uppercase:
HTML:
<h2>alice's adventures in wonderland</h2>
CSS:
h2 { text-transform: uppercase; }
Применение значения lowercase приведет к тому, что все буквы будут отображаться в нижнем регистре. Естественно, это не повлияет на вид букв, которые и так уже являются строчными в исходном документе.
HTML:
<h2>Alice's Adventures in Wonderland</h2>
CSS:
h2 { text-transform: lowercase; }
В спецификацию было добавлено новое значение full-width. Оно ограничивает вывод символов на определенном участке, и используется для идеографических символов, например, японских, китайских иероглифов и т.д. Это облегчает выравнивание латинских символов с идеографическими.
Не все символы имеют соответствующую ширину, при которой регистр символов не изменяется при использовании значения full-width.
HTML:
<h2>Alice's Adventures in Wonderland</h2>
CSS:
h2 { text-transform: full-width; }
Вот как символы будут выглядеть в Firefox при использовании значения full-width:
Свойство text-transform прекрасно поддерживается браузерами. Единственное исключение — это значение full-width, которое в настоящее время работает только в Firefox.
Кроме этого я заметила небольшое несоответствие при использовании значения capitalize для слов с дефисами в Firefox (V.39) и в других популярных браузерах.
Вот как это выглядит в Firefox:
Обратите внимание, что в Firefox первая буква после дефиса не переводится в верхний регистр. А вот как отображается тот же текст в Google Chrome:
В этом случае буквы, следующие сразу после дефисов, также отображаются с заглавной буквы. Я отмечала такое несоответствие в последних версиях всех наиболее популярных браузеров, кроме Firefox.
И, наконец, помните о наследовании! Если вы установите свойство text-transform для элемента контейнера, его значение наследуется всеми дочерними элементами. Чтобы избежать нежелательных результатов, установите для свойства text-transform дочерних элементов значение none.
Посмотрите демо-версию для значений свойства text-transform.
Когда вы нажимаете клавишу табуляции, пробела или переносите текст на новую строку (с помощью клавиши ENTER или тега </b>), вы создаете в исходном документе пустой диапазон.
По умолчанию, браузеры объединяют все пустые диапазоны в один пробел, разрывы строк удаляются, а строки текста переносятся, чтобы соответствовать контейнеру. Это удобно, потому что позволяет задавать отступы и разделять отдельные куски текста, чтобы сохранить исходный документ читабельным и поддерживаемым, не затрагивая при этом особенности отображения контента в браузере.
Но что если вы хотите сохранить в HTML-документе пустые диапазоны, которые создаете. Это нужно, когда мы пишем текст, который должен отображаться, как корректно размеченный фрагмент кода. Или вы хотите вывести текст, который будет отображаться одной строкой без разрывов.
В подобных случаях, когда вы хотите переопределить поведение браузера по умолчанию, свойство white-space предлагает нам несколько интересных вариантов.
Значение normal позволяет сбросить параметры браузера на значения по умолчанию: все дополнительные пробелы объединяются в один символ, а строки переносятся, когда достигают края контейнера.
Значение pre позволяет отображать текст, сохраняя пустые диапазоны и оставляя без изменений все пустые строки в исходном документе. Текст не будет переноситься на новую строку, когда выходит за пределы контейнера:
element { white-space: pre; }
Если вы используете табуляцию, чтобы создать пустые диапазоны, вы можете задавать их размер с помощью свойства tab-size, установив в качестве значения целое число:
element { white-space: pre; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; }
Свойство tab-size поддерживается не всеми браузерами, но если вас совсем не устраивает размер по умолчанию пустого диапазона, создаваемого при помощи табуляции, вы можете использовать этот сервис.
Допустим, вы хотите, чтобы пустые диапазоны в исходном документе сохранялись при выводе в окне браузера. Но вы также хотите, чтобы строки переносились при достижении края контейнера.
Значение pre-wrap поможет достичь нужного результата:
element { white-space: pre-wrap; }
Обратите внимание, что каждая строка, отображаемая в браузере, отражает принудительные разрывы в исходном коде, хотя контейнер имеет достаточно места, чтобы разместить больше текста:
Уменьшите окно браузера, и вы увидите, что строки переносятся, чтобы соответствовать размерам контейнера:
В отношении объединения пробелов и переноса строк оно сохраняет настройки браузера по умолчанию. Если в HTML документе присутствуют символ новой строки или тег <br>, они сохраняются при выводе в окне браузера:
element { white-space: pre-line; }
Посмотрите демо-версию на CodePen для значений pre, pre-wrap и pre-line.
Если для вашего дизайна требуется, чтобы часть встроенного контента никогда не переносилась, тогда вам нужно использовать white-space: nowrap;.
Следующие случаи использования этого значения:
На рисунке, приведенном выше, изображена ссылка, за которой следует символ ». В этом случае вам определенно не хотелось, чтобы при переносе символов на новую строку вы получили картину, приведенную на рисунке ниже:
В подобных случаях (думаю, для иконок, например), использовать значение nowrap очень удобно.
Также свойство white-space может быть применено к любому встроенному контенту, в том числе к изображениям.
Иногда оно используется со значением nowrap, чтобы создать горизонтальный список изображений в прокручиваемом элементе, предотвращая перенос изображений и делая так, чтобы они отображались одной строкой внутри контейнера.
Я пошла еще дальше в этом направлении и создала стандартную JQuery-карусель, используя white-space: nowrap. Ниже приводится ее демо-версия:
Посмотреть демо-версию
Иногда одно длинное слово не может быть обернуто в контейнер одной строки и выходит за рамки своего контейнера. Длинные URL-адреса или длинные слова в комментариях в блоге, например.
Следующие свойства предназначены для переноса длинных слов c помощью CSS.
Свойство word-wrap (ранее называлось overflow-wrap, полностью поддерживается и работает во всех основных браузерах, как устаревшее) вступает в силу, если свойство white-space позволяет перенос текста. Оно может принимать одно из двух значений: normal или break-word.
При использовании значения normal слова будут разрываться в указанных точках разрыва, например, пробелы, дефисы и т.д.
Значение break-word разрешает разрывать слова в произвольных местах, если слово не может быть разорвано и перенесено в установленных точках разрыва.
На рисунке ниже показан вывод длинного слова, которое выходит за границы контейнера:
Давайте установим свойство overflow-wrap, а также, чтобы все работало корректно, свойство word-wrap и зададим для них значение break-word:
element { word-wrap: break-word; overflow-wrap: break-word; }
В этом случае длинное слово разбивается на несколько строк, чтобы соответствовать размерам окна просмотра:
Разбивка длинных слов — это хорошо. Но в результате у нас может получиться искаженный текст, смысл которого вводит читателей в заблуждение. Лучшим вариантом является добавление дефисов в тех местах, где слово переносится на следующую строку. Таким образом, читателям сразу становится понятно, что они видят одно слово, перенесенное на другую строку. Для этого CSS предлагает свойство hyphens, которое вы можете использовать в сочетании с word-wrap: break-word.
Значение auto для свойства hyphens позволяет выводить дефисы в местах, где слова были перенесены на следующую строку, если правила языка документа позволяют это или переносы присутствует в HTML-источнике. Чтобы это работало, убедитесь, что вы установили в HTML-документе атрибут lang для соответствующего языка:
.break-word.hyphens-auto { -moz-hyphens: auto; -webkit-hyphens: auto; -ms-hyphens: auto; hyphens: auto; }
Вы также можете запретить перенос слов в CSS в и вывод символа дефиса. Для этого установите для свойства hyphens значение none:
.break-word.hyphens-none { -moz-hyphens: none; -webkit-hyphens: none; -ms-hyphens: none; hyphens: none; }
Также вы можете вывести дефисы в местах разрыва строк внутри слов, если дефисы указаны внутри слов и текст переносится на следующую строку. Это делается с помощью значения manual:
.break-word.hyphens-manual { -moz-hyphens: manual; -webkit-hyphens: manual; -ms-hyphens: manual; hyphens: manual; }
Благодаря вендорным префиксам, свойство hyphens поддерживается во всех основных браузерах, хотя и не без некоторых незначительных несоответствий. На момент написания данной статьи последние версии Chrome (V.44) и Opera (V.30) не поддерживают значение свойства auto.
Посмотреть пример на CodePen
В некоторых случаях увеличение или уменьшение расстояния между словами или отдельными буквами, то есть интервала, может существенно сказаться на читаемости текста.
CSS предлагает свойства word-spacing и letter-spacing, которые позволяют задавать расстояние между словами и буквами соответственно.
Ниже приведены значения для свойства word-spacing:
- normal;
- <length>;
- Percentage.
normal выводит пробелы между буквами по умолчанию. Конкретное значение зависит от используемого шрифта или браузера:
.normal { word-spacing: normal; }
<length> позволяет увеличить расстояние между словами в дополнение к значению интервала по умолчанию, определенному для шрифта или браузера:
.length { word-spacing: 0.5em; }
percentage работает так же, как <length>, но с использованием не абсолютных значений, а процентов. Существует вероятность, что оно будет удалено из следующих версий спецификации CSS:
.percentage { word-spacing: 1%; }
Вы можете задать для свойства letter-spacing одно из двух значений: normal или <length>.
При использовании значения normal расстояние между буквами остается по умолчанию для данного шрифта. В этом случае любые расстояния между буквами, заданные ранее с помощью свойства letter-spacing, сбрасываются к своим значениям по умолчанию. Например, если для родительского элемента вы указали значение letter-spacing в 1em, но хотите, чтобы для дочерних элементов использовалось значение по умолчанию, это можно сделать с помощью значения norma:
element { letter-spacing: normal; }
<length> позволяет задавать значение в единицах измерения, например пикселях или em. На это значение будет увеличен интервал между буквами в дополнение к интервалу по умолчанию:
element { letter-spacing: 1em; }
Свойство word-spacing применимо не только к словам. Вы можете использовать его для любого встроенного или блокового контента.
Также вы можете создавать кинетическую типографику на основе свойств word-spacing и letter-spacing. Но при использовании переходов CSS для свойства letter-spacing выяснилось, что значение normal не распознается текущей версии Firefox (V.39). Чтобы исправить это, замените normal на 0em.
Ниже приводится демо-версия анимированного текста с использованием word-spacing и letter-spacing:
Посмотреть демо- версию
Свойство text-align задает, как встроенный контент, такой как текст и изображения, выравнивается внутри блока контейнера. Значения left и right выравнивают встроенный контент по левому и правому краю соответственно. Установив для text-align значение center, вы выровняете контент по центру контейнера. Значение justify задает равномерное распределение контента таким образом, чтобы все строки имели одинаковую длину (за исключением последней строки, если она недостаточно длинна, чтобы достичь края контейнера).
В спецификацию CSS были введены два новых значения, которые могут быть весьма полезны для сайтов на языках, использующих систему письма справа-налево (RTL): start и end.
Для системы слева-направо (LTR), они соответствуют значениям left и right. Если сайт использует язык RTL, значение start соответствует right, значение end соответствует left:
element { text-align: start; } [IMG=http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2015/08/1440461375alignment-start.jpg] element { text-align: end; }
Применение text-align: match-parent для встроенного дочернего элемента обеспечивает, чтобы дочерний элемент наследовал тот же тип выравнивания, что и родительский элемент. Наследование значений start или end вычисляется по направлению написания языка родительского элемента и дает в результате либо left, либо right.
Также в CSS появилось новое свойство text-align-last. Оно задает выравнивание последней перед концом абзаца или тегом <br> строки распределенного по ширине текста. Данное свойство принимает те же значения, что и свойство text-align, за исключением значения auto, которое является значением по умолчанию. Оно позволяет выровнять последнюю строку текста в соответствии со значением свойства text-align, если оно задано. Если нет, применяется свойство text-align со значением по умолчанию start.
На момент написания данной статьи, свойство text-align-last поддерживалось браузерами довольно слабо. Поэтому лучше не использовать его вообще.
Посмотреть демо-версию, иллюстрирующую данное свойство в действии
Отступы первой строки абзаца встречаются на сайтах не так часто. Вместо этого используется пустая строка, как визуальный элемент, разделяющий два абзаца.
Тем не менее, отступы в первой строке абзаца иногда используется, чтобы задать классический вид, подходящий для конкретного дизайна.
Для красной строки в CSS существует свойство text-indent. Давайте рассмотрим его возможные значения.
Значение length обычно задается в пикселях или em:
element { text-indent: 2em; } Или в процентах: element { text-indent: 6%; }
Значение each-line задает отступ красной строки с помощью CSS для первой строки внутри блока контейнера, а также для каждой строки после принудительного разрыва строки, созданного с помощью нажатия клавиши enter или добавления тега <br>.
Однако отступ не применяется для каждой первой строки после разрыва с переносом, то есть переноса текста на новую строку, если он выходит за пределы контейнера.
Значение hanging задает вывод всех строк, кроме первой, с отступом.
Значения each-line и hanging являются экспериментальными, и на момент написания статьи не реализованы ни в одном браузере.
Посмотреть демо-версию, иллюстрирующую свойство text-indent в действии
В этой статье я подробно рассмотрела ряд свойств CSS, которые позволяют контролировать форматирование, переносы строк и выравнивание текста. Попробуйте поэкспериментировать с ними с помощью демо-версий.
С нетерпением жду ваших отзывов!