Table of Contents
- What is CSS?
- How CSS Works: The Cascade, Specificity, and Inheritance
- Adding CSS to HTML: Inline, Internal, and External Styles
- CSS Syntax: Selectors, Declarations, Properties, and Values
- Core CSS Selectors
- The Box Model: Content, Padding, Border, and Margin
- Typography: Fonts, Sizes, and Text Styling
- Colors and Backgrounds
- Layout Basics: Display, Positioning, and Flexbox
- Responsive Design Fundamentals
- CSS Best Practices
- Conclusion
- References
What is CSS?
CSS (Cascading Style Sheets) is a stylesheet language used to describe the presentation of a document written in HTML or XML. It separates content (HTML) from design (CSS), making websites easier to maintain and update. With CSS, you can:
- Change colors, fonts, and spacing.
- Control layout (e.g., arrange elements in rows or columns).
- Add animations and transitions.
- Make websites responsive (adapt to different screen sizes).
A Brief History
CSS was first proposed by Håkon Wium Lie in 1994 to solve the problem of inconsistent styling across browsers. Since then, it has evolved through multiple versions:
- CSS1 (1996): Basic styling (colors, fonts, margins).
- CSS2 (1998): Added positioning, tables, and media queries.
- CSS3 (2011–present): Modular updates (Flexbox, Grid, animations, variables).
How CSS Works: The Cascade, Specificity, and Inheritance
To use CSS effectively, you need to understand three core principles:
1. The Cascade
The “Cascading” in CSS refers to how styles are applied when multiple rules target the same element. Styles cascade in three priority levels:
- Importance:
!important(highest, but avoid overusing). - Specificity: How specific a selector is (e.g., ID selectors > class selectors > type selectors).
- Source Order: Later styles override earlier ones if specificity is equal.
2. Specificity
Specificity determines which CSS rule “wins” when conflicting styles target the same element. It’s calculated using a points system:
- ID selectors: 100 points (e.g.,
#header). - Class, pseudo-class, attribute selectors: 10 points (e.g.,
.nav,:hover,[type="text"]). - Type selectors (HTML tags): 1 point (e.g.,
p,h1). - Universal selector (
*): 0 points.
Example: #nav .link (100 + 10 = 110 points) overrides p .link (1 + 10 = 11 points).
3. Inheritance
Some CSS properties are inherited from parent elements to child elements. For example:
- Text properties (
color,font-family) are inherited. - Box properties (
margin,padding) are not inherited.
You can control inheritance with:
inherit: Force inheritance from the parent.initial: Reset to the browser’s default value.unset: Useinheritif the property is inheritable; otherwise,initial.
Adding CSS to HTML: Inline, Internal, and External Styles
There are three ways to add CSS to an HTML document:
1. Inline Styles
Styles applied directly to an HTML element using the style attribute.
Example:
<p style="color: blue; font-size: 20px;">This is an inline-styled paragraph.</p>
Pros: Quick for one-off styles.
Cons: Mixes content and style; hard to maintain for large sites.
2. Internal (Embedded) Styles
Styles defined in the <head> section using a <style> tag.
Example:
<!DOCTYPE html>
<html>
<head>
<style>
p {
color: blue;
font-size: 20px;
}
</style>
</head>
<body>
<p>This paragraph uses internal styles.</p>
</body>
</html>
Pros: Styles apply to the entire page; cleaner than inline.
Cons: Styles are limited to one page; not reusable across multiple pages.
3. External Stylesheets
Styles stored in a separate .css file and linked to HTML using the <link> tag.
Example:
-
Create
styles.css:p { color: blue; font-size: 20px; } -
Link it in HTML:
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="styles.css"> </head> <body> <p>This paragraph uses external styles.</p> </body> </html>
Pros: Reusable across multiple pages; easy to maintain; cached by browsers (faster load times).
Cons: Requires an extra HTTP request (minimal impact with modern browsers).
Best Practice: Use external stylesheets for most projects.
CSS Syntax: Selectors, Declarations, Properties, and Values
CSS syntax consists of rulesets (selectors + declarations):
selector {
property: value; /* Declaration */
another-property: another-value;
}
Components:
- Selector: Targets HTML elements to style (e.g.,
p,.class,#id). - Declaration Block: Wrapped in
{}; contains one or more declarations. - Declaration: A
property: valuepair (e.g.,color: red). - Property: The style attribute to modify (e.g.,
font-size,margin). - Value: The setting for the property (e.g.,
16px,blue,flex).
Core CSS Selectors
Selectors target HTML elements to apply styles. Here are the most common types:
1. Type Selector
Targets all elements of a specific HTML tag.
p { /* Styles all <p> tags */
color: gray;
line-height: 1.6;
}
2. Class Selector
Targets elements with a specific class attribute (reusable across multiple elements).
<p class="highlight">This is highlighted.</p>
<div class="highlight">This is also highlighted.</div>
.highlight { /* Styles elements with class="highlight" */
background: yellow;
padding: 5px;
}
3. ID Selector
Targets a single element with a unique id attribute (use only once per page).
<nav id="main-nav">Main Navigation</nav>
#main-nav { /* Styles the element with id="main-nav" */
background: #333;
color: white;
}
4. Universal Selector
Targets all elements on the page (use sparingly for resetting styles).
* { /* Applies to every element */
margin: 0;
padding: 0;
box-sizing: border-box; /* More on this later! */
}
5. Combinators
Combine selectors to target elements based on their relationship.
-
Descendant Combinator (
space): Targets child elements (direct or indirect)..container p { /* Styles <p> inside .container (any level) */ color: darkblue; } -
Child Combinator (
>): Targets direct children..container > p { /* Styles <p> that are direct children of .container */ font-weight: bold; } -
Adjacent Sibling Combinator (
+): Targets the element immediately after another.h2 + p { /* Styles <p> directly after an <h2> */ margin-top: 0; }
6. Pseudo-Class Selector
Targets elements in a specific state (e.g., hover, active, first child).
a:hover { /* Styles <a> when mouse hovers over it */
color: #ff0000;
text-decoration: underline;
}
li:first-child { /* Styles the first <li> in a list */
font-weight: bold;
}
input:focus { /* Styles <input> when focused (e.g., typing) */
border: 2px solid #007bff;
}
7. Pseudo-Element Selector
Targets a specific part of an element (e.g., first line, before/after content).
p::first-line { /* Styles the first line of <p> */
font-size: 1.2em;
font-weight: bold;
}
blockquote::before { /* Adds content before <blockquote> */
content: """; /* Inserts a quote mark */
font-size: 2em;
color: #666;
}
The Box Model: Content, Padding, Border, and Margin
Every HTML element is treated as a rectangular “box” in CSS. The box model defines how these boxes are structured:

(Image source: MDN Web Docs)
Components:
- Content: The actual content (text, images, etc.).
- Padding: Space between content and border (transparent).
- Border: A line around the padding (can have color, width, style).
- Margin: Space outside the border (transparent; pushes other elements away).
Box Sizing
By default, the width/height of an element only includes the content. To include padding and border in the total size, use box-sizing: border-box:
.box {
width: 200px;
padding: 20px;
border: 5px solid black;
box-sizing: border-box; /* Total width = 200px (includes padding + border) */
}
Best Practice: Set box-sizing: border-box globally to avoid layout headaches:
* {
box-sizing: border-box;
}
Typography: Fonts, Sizes, and Text Styling
Typography is critical for readability and user experience. Here are key properties:
1. font-family
Defines the font for text. Use a “font stack” to specify fallbacks.
body {
font-family: "Helvetica Neue", Arial, sans-serif; /* Sans-serif fonts for readability */
}
h1 {
font-family: Georgia, "Times New Roman", serif; /* Serif fonts for headings */
}
- Web-Safe Fonts: Pre-installed on most devices (Arial, Georgia, Verdana).
- Custom Fonts: Use
@font-faceor Google Fonts (e.g., Google Fonts).
2. font-size
Controls text size. Use relative units (e.g., rem, em) for responsiveness:
body {
font-size: 16px; /* Base font size (1rem = 16px) */
}
h1 {
font-size: 2.5rem; /* 40px (2.5 * 16px) */
}
p {
font-size: 1rem; /* 16px */
}
3. font-weight
Sets text boldness (e.g., normal, bold, 400–900).
strong {
font-weight: 700; /* Equivalent to "bold" */
}
.light-text {
font-weight: 300; /* Light weight */
}
4. line-height
Controls spacing between lines (improves readability; use unitless values).
p {
line-height: 1.6; /* Optimal for body text */
}
5. text-align
Aligns text horizontally (left, center, right, justify).
.hero-title {
text-align: center;
}
.article-body {
text-align: justify;
}
6. color
Sets text color (use hex, RGB, HSL, or named colors).
.error-text {
color: #ff0000; /* Hex */
/* Or: color: rgb(255, 0, 0); */
/* Or: color: hsl(0, 100%, 50%); */
}
Colors and Backgrounds
1. Color Values
CSS supports multiple color formats:
- Named Colors:
red,blue,aqua(limited; use for simplicity). - Hex Codes:
#ff0000(red),#00ff00(green),#0000ff(blue); add#rrggbbaafor transparency (e.g.,#ff000080= 50% transparent red). - RGB/RGBA:
rgb(255, 0, 0)(red),rgba(255, 0, 0, 0.5)(50% transparent red). - HSL/HSLA:
hsl(0, 100%, 50%)(red),hsla(0, 100%, 50%, 0.5)(50% transparent red).
2. Background Properties
-
background-color: Sets the background color of an element..card { background-color: #f5f5f5; /* Light gray */ } -
background-image: Adds an image (supportsurl(), gradients, or multiple images)..hero { background-image: url("hero.jpg"); /* Image from file */ background-image: linear-gradient(to right, #ff0000, #0000ff); /* Gradient */ } -
background-repeat: Controls image repetition (no-repeat,repeat-x,repeat-y)..hero { background-image: url("pattern.png"); background-repeat: no-repeat; /* Image appears once */ } -
background-position: Positions the image (e.g.,center,top left,50% 50%)..hero { background-position: center; /* Centers the image */ } -
background-size: Scales the image (cover= fill container;contain= fit without cropping)..hero { background-size: cover; /* Image covers container, may crop */ }
Layout Basics: Display, Positioning, and Flexbox
Layout determines how elements are arranged on the page. Here are the essentials:
1. display Property
Controls how an element behaves in the layout. Common values:
block: Takes full width of parent; starts on a new line (e.g.,div,p,h1).inline: Takes only as much width as needed; doesn’t start on a new line (e.g.,span,a,strong).inline-block: Mix of inline and block (takes content width but allowswidth/heightand margins).none: Hides the element (removes it from the layout).flex: Enables Flexbox layout (modern, powerful for row/column alignment).
2. Flexbox
Flexbox is a one-dimensional layout model for aligning items in rows or columns. It’s ideal for navigation bars, cards, and centering content.
Example: Center a div vertically and horizontally:
<div class="container">
<div class="box">I'm centered!</div>
</div>
.container {
display: flex; /* Enables Flexbox on the container */
justify-content: center; /* Horizontally centers items */
align-items: center; /* Vertically centers items */
height: 100vh; /* Takes full viewport height */
}
.box {
width: 200px;
height: 100px;
background: blue;
color: white;
}
3. Positioning
The position property controls how elements are positioned in the layout:
static(default): Elements follow normal flow.relative: Positioned relative to its normal position (usetop,right,bottom,leftto offset).absolute: Positioned relative to the nearest positioned ancestor (not static); removed from normal flow.fixed: Positioned relative to the viewport (stays in place when scrolling).sticky: Toggles betweenrelativeandfixedas the user scrolls.
Example: Fixed Header
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
background: white;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
Responsive Design Fundamentals
Responsive design ensures websites look good on all devices (phones, tablets, desktops). Key tools:
1. Viewport Meta Tag
Tells the browser to scale the page to the device’s width. Add this to your HTML <head>:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
2. Media Queries
Apply styles based on device characteristics (e.g., screen width, orientation).
/* Default styles (mobile-first) */
body {
font-size: 16px;
}
/* Styles for tablets and up */
@media (min-width: 768px) {
body {
font-size: 18px;
}
}
/* Styles for desktops and up */
@media (min-width: 1024px) {
body {
font-size: 20px;
}
}
3. Relative Units
Use units that scale with the viewport or parent elements:
rem: Relative to the root (<html>) font size (e.g.,1.5rem= 1.5 × root font size).em: Relative to the parent element’s font size.%: Relative to the parent’s width/height.vw/vh: Viewport width/height (1vw = 1% of viewport width).
CSS Best Practices
- Use External Stylesheets: Keep CSS in separate
.cssfiles for reusability and maintainability. - Avoid
!important: It breaks the cascade and makes debugging harder. - Consistent Naming: Use a convention like BEM (Block__Element—Modifier) for classes (e.g.,
card__title--large). - Comment Your CSS: Explain complex logic or sections (e.g.,
/* Navigation styles - mobile */). - Optimize for Performance: Minify CSS (remove whitespace), use
@importsparingly, and avoid overly complex selectors. - Test Across Browsers: Use tools like Can I Use to check property support.
Conclusion
CSS is the backbone of web styling, enabling you to transform plain HTML into beautiful, functional websites. By mastering fundamentals like selectors, the box model, typography, layout, and responsive design, you’ll have the tools to create engaging user experiences. Remember, practice is key—experiment with different properties, build small projects, and refer to documentation when stuck.
Happy styling!
References
- MDN Web Docs: CSS
- CSS-Tricks (Guides on selectors, Flexbox, Grid, etc.)
- W3Schools CSS Tutorial
- Book: CSS: The Definitive Guide by Eric Meyer and Estelle Weyl
- Google Fonts (Free web fonts)
- Can I Use (Browser support checker)