AMDE 355 · Advanced Web Design · Week 06
Typography, Motion & Composition.
Typography is more than choosing a font. It creates hierarchy, pace, tone, and movement across a page. This week, you’ll build a typographic system and use restrained motion to guide attention without distracting from the content.
01 / Typography is interface design
A strong typographic system makes a page easier to scan and gives it a recognizable voice. Instead of styling every heading independently, establish a small set of roles and use them consistently.
Hierarchy
Use size, weight, spacing, and contrast to show what matters first, second, and third.
Readability
Control line length, line height, and paragraph spacing. Small adjustments can make long text feel dramatically easier to read.
Personality
Choose typefaces that support the project’s tone, then use contrast deliberately rather than collecting too many fonts.
02 / Build a small type scale
Define reusable CSS custom properties for your type system. These tokens make it easier to adjust the overall design later.
clamp() do? It sets a minimum, a flexible preferred value, and a maximum. The headline can scale with the viewport without becoming tiny or enormous.03 / Tune the reading experience
Line length
Use a readable measure for paragraphs. The ch unit is useful for limiting text width based on character size.
Line height
Body text usually needs more vertical space than a large headline. Adjust each level for its role.
Responsive scale
Check your type at mobile, tablet, and desktop widths. A good scale adapts without breaking the hierarchy.
04 / Add motion that communicates
Motion can signal interactivity, provide feedback, and help users understand a change of state. Keep it brief, purposeful, and consistent. Avoid animating every element just because CSS makes it possible.
05 / In-class assignment — type in motion
Choose a short piece of content from your Week 4 visual direction or Week 5 composition. Turn it into a responsive typographic landing section with one purposeful motion interaction.
Define your type roles
Choose a display heading, subheading, body style, and small supporting label. Document the size, weight, and line height of each.
Create CSS tokens
Use custom properties for your type scale and colors. Include at least one fluid size using clamp().
Add one interaction
Apply a short transition to a link, button, or project card. Make the state change obvious but restrained.
Test three widths
Check desktop, tablet, and mobile. Confirm that the headline wraps intentionally and the text remains readable.
06 / Critique & self-check
Hierarchy
Can a viewer identify the headline, supporting information, and next action quickly?
Consistency
Are the type styles reused intentionally, or does every element feel unrelated?
Motion
Does the interaction communicate feedback? Is the page still understandable without motion?
- Type roles and CSS custom properties are defined.
- At least one type size uses
clamp(). - Paragraph measure and line height support comfortable reading.
- One purposeful transition or interaction is included.
- Reduced-motion preferences are considered.
- Desktop, tablet, and mobile views have been checked.
Instructor-only material · Remove before publishing to students
Instructor Layout Code — Step by Step
Use this demonstration to model how a designer develops a type system, tests it in context, and adds motion only when it improves the experience.
Start with content
Choose a short headline, one paragraph, and one action link. Ask students what should be noticed first and why.
Build the type scale
Define body, subhead, and display sizes as custom properties. Demonstrate how changing one token affects the whole page.
Use fluid type
Replace a fixed oversized heading with clamp(). Resize the browser and discuss minimum, preferred, and maximum values.
Adjust the reading measure
Apply a max-width using ch. Compare long lines with a narrower text column.
Add one transition
Animate a small interaction such as a link shifting upward on hover. Explain the duration and easing, then test keyboard focus as well.
Check accessibility and responsive behavior
Use the keyboard, test narrow widths, and demonstrate prefers-reduced-motion. Ask whether the design still communicates without animation.
Step 1A — Start with the content and semantic HTML
Begin with meaning before decoration. This sample gives students a headline, a supporting paragraph, and one action. Ask: What should the visitor notice first? What information supports that message? What is the action?
<!-- Start with the message. Do not style it yet. -->
<main class="poster">
<p class="eyebrow">Independent Design Journal</p>
<h1 class="headline">
Ideas move
the world.
</h1>
<p class="intro">
A journal about creative work, unexpected connections,
and the people who make things happen.
</p>
<a class="action" href="#stories">
Explore the stories <span aria-hidden="true">↗</span>
</a>
</main>Explain: the h1 is the primary message, the paragraph gives context, and the anchor is a real link. Classes let us style the roles without using HTML elements only because of how they look.
Step 2A — Create a type scale with CSS custom properties
Show students the hard-to-maintain version first: different font sizes scattered across selectors. Then replace the repeated values with named tokens. The names communicate intent and make global changes easier.
/* First, define a small and intentional type system. */
:root {
--type-small: 0.8rem;
--type-body: 1rem;
--type-subhead: 1.5rem;
--type-display: 3.5rem;
--leading-body: 1.65;
--leading-display: 0.98;
}
body {
font-size: var(--type-body);
line-height: var(--leading-body);
}
.eyebrow {
font-size: var(--type-small);
text-transform: uppercase;
letter-spacing: 0.12em;
}
.headline {
font-size: var(--type-display);
line-height: var(--leading-display);
letter-spacing: -0.045em;
}Demonstration: change --type-display from 3.5rem to 4rem. Then change it back. Point out that the selector remains the same while the token controls the visual system.
--type-display describes the role; 3.5rem is the current value. Students should avoid creating a separate token for every tiny difference.Step 3A — Make the headline fluid with clamp()
First show the fixed-size version, then replace it with the fluid version. Resize the browser slowly so students can observe the difference.
/* This can look oversized on a phone. */
.headline {
font-size: 3.5rem;
}.headline {
font-size: clamp(2.2rem, 6vw, 5.5rem);
line-height: 0.98;
}- 2.2rem: minimum size; the headline should not shrink below this.
- 6vw: preferred fluid size, based on viewport width.
- 5.5rem: maximum size; the headline stops growing beyond this cap.
Ask students to predict what will happen before resizing. Then have them test a narrow phone-width viewport, a tablet-width viewport, and a wide desktop viewport.
Step 4A — Control the reading measure and line length
Long lines are tiring to read. The ch unit roughly tracks the width of the “0” character in the current font, making it useful for setting a text column.
.intro {
max-width: 62ch;
font-size: var(--type-body);
line-height: 1.7;
}
.poster {
padding: clamp(1.25rem, 5vw, 4rem);
}Before/after exercise: temporarily remove max-width and stretch the paragraph across the full screen. Restore 62ch. Ask which version feels easier to scan and why.
Step 5A — Add motion to a meaningful interaction
Start with a static link. Then add a small movement that signals interactivity. Avoid large, constant, or distracting motion; the effect should support the action rather than compete with the headline.
.action {
display: inline-flex;
align-items: center;
gap: 0.5rem;
transition: transform 180ms ease, color 180ms ease;
}
.action:hover {
transform: translateY(-3px);
}
.action:focus-visible {
outline: 3px solid currentColor;
outline-offset: 4px;
}Test with a mouse, then press Tab to reach the link. Explain that hover feedback is not enough: keyboard users also need a visible focus state.
Try three values: change 180ms to 80ms, then 400ms. Ask which feels immediate, which feels sluggish, and whether the transition is noticeable without being distracting.
Step 6A — Respect reduced-motion preferences
Motion should not be required to understand the content. Add a reduced-motion rule so people who have requested less animation receive a calmer experience.
/* Keep the interaction understandable without movement. */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
scroll-behavior: auto;
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}Discuss: the headline, paragraph, and action still communicate the same information if movement is removed. Motion is an enhancement, not a substitute for structure or content.
Step 7A — Put the pieces together and inspect the result
Use this compact combined example to review the relationships between the tokens, fluid type, reading measure, and motion. Students do not need to memorize every value; they should learn to recognize what each rule controls.
:root {
--ink: #172033;
--accent: #b8f34b;
--space: 1.25rem;
}
body {
margin: 0;
color: var(--ink);
font-family: Arial, sans-serif;
}
.poster {
padding: clamp(1.25rem, 5vw, 4rem);
min-height: 70vh;
}
.headline {
max-width: 12ch;
font-size: clamp(2.2rem, 6vw, 5.5rem);
line-height: 0.98;
}
.intro {
max-width: 62ch;
line-height: 1.7;
}
.action {
background: var(--accent);
color: var(--ink);
padding: 0.8rem 1rem;
transition: transform 180ms ease;
}
.action:hover {
transform: translateY(-3px);
}Live demonstration prompts
- Change the accent token. Which parts of the composition update?
- Increase the headline’s minimum size. At what viewport does the layout begin to feel crowded?
- Remove the intro’s
max-width. Compare reading comfort. - Temporarily remove the transition. Does the link remain understandable and usable?
- Tab through the page. Can you always see where keyboard focus is?
- Turn on a reduced-motion preference and confirm the experience still makes sense.
Instructor quick reference — What each decision does
| Technique | Purpose | Question to ask students |
|---|---|---|
--type-display | Centralized display-size token | What happens when one value changes? |
clamp() | Fluid sizing with minimum and maximum bounds | What are the three arguments controlling? |
max-width: 62ch | Limits paragraph line length | Which version is easier to read? |
line-height | Controls vertical space between lines | Does the text feel cramped or disconnected? |
transition | Smoothly communicates a state change | Does the motion clarify the interaction? |
:focus-visible | Visible keyboard focus indicator | Can a keyboard user identify the current control? |
prefers-reduced-motion | Respects a user preference for less movement | Does the design still work without motion? |