Topic 3: Element Design (Based on the picture/requirement)
📖 11 min read · 🎯 beginner · 🧭 Prerequisites: tables-row-span-col-span-misc-tags-heading-tagh1h2-h6, echo-if-condition-task-on-if-echo
Why this matters
Here's the thing — in real projects, you won't be handed a blank page and told "make something nice." You'll get a design file, a screenshot, or a client saying "make it look like this." Your job is to look at that image and translate it into actual CSS — the right colors, spacing, sizes, and effects. That's exactly what we practice here. You'll learn to read a visual requirement and write the CSS that brings it to life, from basic styling all the way to transforms and animations.
What You'll Learn
- Apply foundational CSS properties —
color,background-color,margin,padding,width,height,font-size, andfont-family— to match a visual design - Use
transformto rotate and reposition elements dynamically - Build smooth
transitioneffects that respond to state changes - Write
@keyframesanimations and attach them to elements with theanimationshorthand
The Analogy
Think of CSS as a traditional painter's toolkit placed in front of a blank canvas. The color and background-color properties are your pigments — they decide the mood before a single shape is drawn. margin and padding are the mat and frame around each artwork: margin keeps pieces from crowding each other on the gallery wall, while padding breathes life into the space inside the frame itself. width and height size your canvas, font-family is your choice of calligraphy pen, and transform is that dramatic tilt you give a frame to make it look dynamic. When you add transition and animation, the painting starts to move — colors shift at sunset, stars begin to twinkle. You are not writing code; you are directing a living exhibition.
Chapter 1: Colors and Backgrounds
Every design starts with mood, and mood starts with color. CSS gives you two foundational color properties:
color— sets the foreground (text) color of an elementbackground-color— fills the element's background area
Both accept named colors (navy, peachpuff), hex values (#1a1a2e), rgb(), and hsl().
body {
color: navy; /* Text color */
background-color: peachpuff; /* Canvas background color */
}
Choosing these two properties first anchors every design decision that follows.
Chapter 2: Margin and Padding — Crafting Space
White space is not empty — it is intentional. Two properties control it:
margin— space outside the element's border (pushes neighbors away)padding— space inside the element's border (breathes room into content)
.gallery {
margin: 25px; /* Space around each section */
padding: 10px; /* Space within each section */
}
Both properties accept one to four values following the top / right / bottom / left clockwise pattern. margin: 25px sets all four sides equally; margin: 10px 20px sets top/bottom to 10 px and left/right to 20 px.
Chapter 3: Width and Height — Sculpting Dimensions
Controlling how large an element renders is essential for matching a mockup exactly.
width— sets an element's horizontal size (absolutepx, or relative%of parent)height— sets the vertical size;autopreserves the original aspect ratio
img {
width: 80%; /* Image takes 80% of its container */
height: auto; /* Keeps the original aspect ratio */
}
Using height: auto with a percentage width is the safest way to keep images proportional across different screen sizes.
Chapter 4: Typography — The Dance of Fonts
Text is design. Two properties control how text looks at the character level:
font-size— the rendered size of text, commonly inpx,em, orremfont-family— the typeface stack; list fallbacks from most-preferred to generic
p {
font-size: 16px; /* Legible text size */
font-family: 'Comic Sans MS', cursive; /* Fun and casual font */
}
The second value (cursive) is the generic fallback used when the named font is unavailable on the visitor's device. Always include at least one generic: serif, sans-serif, monospace, cursive, or fantasy.
Chapter 5: Transform — Twisting Elements into Life
The transform property lets you rotate, scale, skew, and translate elements without disturbing the document flow around them.
.box {
transform: rotate(-30deg); /* Tilt the box for a dynamic effect */
}
Common transform functions:
| Function | Effect |
|---|---|
rotate(deg) | Rotates the element clockwise (positive) or counter-clockwise (negative) |
scale(x, y) | Resizes the element relative to its center |
translate(x, y) | Moves the element without affecting layout flow |
skew(x, y) | Slants the element along one or both axes |
Multiple transforms can be chained in a single declaration: transform: rotate(-30deg) scale(1.2);
Chapter 6: Transitions — Smooth State Changes
transition tells the browser to animate a property change smoothly instead of jumping instantly.
.button {
transition: background-color 1s ease; /* Changes color smoothly over 1 second */
}
The shorthand syntax is: transition: <property> <duration> <timing-function> <delay>
- property — which CSS property to animate (
background-color,opacity,transform, orall) - duration — how long the animation takes (
1s,300ms) - timing-function — the acceleration curve:
ease,linear,ease-in,ease-out,ease-in-out - delay — optional pause before the animation starts
Transitions activate whenever the targeted property changes — typically via :hover, :focus, or a JavaScript class toggle.
Chapter 7: Animations — Bringing the Stars to Life
While transition reacts to a state change, @keyframes animations run on a loop or play automatically.
Step 1 — Define the keyframes:
@keyframes twinkle {
from { opacity: 0.5; }
to { opacity: 1; }
}
Step 2 — Attach the animation to an element:
.star {
animation: twinkle 2s infinite alternate; /* Makes the star twinkle */
}
The animation shorthand breaks down as:
| Part | Value | Meaning |
|---|---|---|
| name | twinkle | Which @keyframes block to use |
| duration | 2s | One cycle takes 2 seconds |
| iteration count | infinite | Loops forever |
| direction | alternate | Plays forward, then backward, then forward… |
You can also use percentage-based keyframes for finer control:
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.1); }
100% { transform: scale(1); }
}
Chapter 8: Putting It Together — A Twilight Sky
Here is a complete worked example that combines every technique from this lesson into a twilight sky scene:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Twilight Sky</title>
<style>
body {
color: white;
background-color: #1a1a2e; /* Deep night sky */
margin: 0;
padding: 20px;
font-family: Georgia, serif;
font-size: 18px;
}
.sky {
width: 100%;
height: auto;
padding: 40px;
background-color: #16213e;
}
.moon {
width: 80px;
height: 80px;
background-color: #e2d9c5;
border-radius: 50%;
margin: 20px auto;
transition: background-color 1s ease;
}
.moon:hover {
background-color: #fffde7; /* Glows on hover */
}
.star {
display: inline-block;
transform: rotate(-30deg);
animation: twinkle 2s infinite alternate;
}
@keyframes twinkle {
from { opacity: 0.5; }
to { opacity: 1; }
}
</style>
</head>
<body>
<div class="sky">
<div class="moon"></div>
<span class="star">★</span>
<span class="star" style="animation-delay: 0.5s;">★</span>
<span class="star" style="animation-delay: 1s;">★</span>
</div>
</body>
</html>
Notice how animation-delay staggers each star so they twinkle out of sync — a small trick that makes a constellation feel alive.
🧪 Try It Yourself
Task: Build your own twilight sky page.
- Create an HTML file with a
<div class="sky">element. - Give
bodyabackground-colorof#0d0d2b(deep midnight) andcolorofwhite. - Inside
.sky, add at least three<span>elements with the classstarcontaining the★character. - Write a
@keyframes twinkleanimation that fades opacity from0.4to1. - Attach it:
animation: twinkle 2s infinite alternate; - Add a
.moondiv styled as a circle (useborder-radius: 50%), and give it atransition: background-color 1s easeso it glows on:hover.
Success criterion: Opening the file in a browser should show twinkling stars that fade in and out at different rates, and hovering the moon should smoothly change its color.
Starter snippet:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>My Twilight Sky</title>
<style>
body {
background-color: #0d0d2b;
color: white;
font-family: sans-serif;
padding: 20px;
}
/* Add .sky, .moon, .star, @keyframes twinkle here */
</style>
</head>
<body>
<div class="sky">
<div class="moon"></div>
<span class="star">★</span>
<span class="star">★</span>
<span class="star">★</span>
</div>
</body>
</html>
🔍 Checkpoint Quiz
Q1. What is the difference between margin and padding in CSS?
A) margin is inside the border; padding is outside
B) margin is outside the border; padding is inside
C) They are interchangeable
D) margin applies only to block elements
Q2. Given this CSS, what happens when you hover the button?
.button {
background-color: steelblue;
transition: background-color 1s ease;
}
.button:hover {
background-color: tomato;
}
A) The button immediately turns tomato-red on hover
B) The button slowly transitions from steelblue to tomato over 1 second
C) The transition only works on opacity, not background-color
D) Nothing — transition requires JavaScript to activate
Q3. What does animation: twinkle 2s infinite alternate; mean?
A) Run the twinkle keyframe once, then stop
B) Run the twinkle keyframe for 2 seconds, then loop forever, reversing direction each cycle
C) Delay the animation by 2 seconds before it starts
D) Run the twinkle keyframe twice, then play it in reverse
Q4. You receive a mockup showing an image that must be 80% of its container's width but must never distort. Which CSS rules achieve this?
A) width: 80%; height: 80%;
B) width: 80%; height: auto;
C) width: auto; height: 80%;
D) max-width: 80%;
A1. B — margin is the space outside the element's border (pushing other elements away); padding is the space inside the border (between the border and the content).
A2. B — The transition property tells the browser to interpolate the background-color change over 1 second with an ease curve, so the color change is gradual, not instant.
A3. B — 2s is the duration of one cycle, infinite means it loops forever, and alternate reverses direction on each even cycle (forward → backward → forward…), which creates the natural fade-in/fade-out twinkle effect.
A4. B — width: 80% constrains the image to 80% of its container, and height: auto lets the browser calculate the height proportionally, preserving the original aspect ratio without distortion.
🪞 Recap
colorandbackground-colorset mood;margincontrols outer spacing whilepaddingcontrols inner spacing.widthandheightsize elements precisely; useheight: autowith a percentagewidthto keep images proportional.font-sizeandfont-familycontrol typographic expression; always include a generic fallback family.transform: rotate()(and other functions) repositions elements visually without breaking document flow.transitionsmoothly animates a property change triggered by a state switch (:hover, class toggle, etc.).@keyframesdefines a named animation sequence; theanimationshorthand attaches it with duration, iteration count, and direction.
📚 Further Reading
- MDN CSS Reference — the source of truth on every CSS property with live examples
- MDN Using CSS Animations — deep dive into
@keyframesand the fullanimationshorthand - CSS Tricks — A Complete Guide to CSS Transitions — covers timing functions, browser support, and common patterns
- ⬅️ Previous: echo, if condition (task on if & echo)
- ➡️ Next: iframe (embed, Albums-embed, video-embed, maps, Input tag introduction)