web-html-css
Build accessible, semantic, and responsive web user interfaces using modern HTML5 and CSS3. Use when structuring semantic HTML markup, designing layouts with Flexbox, CSS Grid, and Container Queries,
Files1
View on GitHubSKILL.mdskills/web-html-css/SKILL.md
GitHubModern HTML5 and CSS3 Web Development
Modern frontend development prioritizes semantic HTML markup, accessible document outlines, responsive styling using CSS Grid and Flexbox, and maintainable design tokens via CSS Custom Properties. Never build websites out of generic <div> soup or sacrifice keyboard navigation and accessibility.
Core Rules
- Use Semantic HTML elements first: Use
<button>,<nav>,<main>,<article>,<section>,<aside>,<header>, and<footer>rather than generic<div>tags with click listeners. - Never remove focus outlines without providing an alternative:
outline: nonewithout a custom:focus-visiblestyle breaks keyboard accessibility and violates WCAG 2.1 AA. - Adopt Mobile-First Responsive Design: Use
min-widthmedia queries and fluid sizing withclamp()rather than rigid desktop-first breakpoints. - Use CSS Grid for 2D layouts and Flexbox for 1D alignments: Avoid float or table hacks.
- Always provide accessible names for interactive elements: Every button or link with only an icon must include an
aria-labelor visually hidden text. - Images must have
altattributes: Provide descriptive text oralt=""for purely decorative illustrations.
1. Semantic Document Architecture
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Analytics Dashboard - SaaS Platform</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main-content" class="skip-link">Skip to main content</a>
<div class="logo">Acme SaaS</div>
<nav aria-label="Main Navigation">
<ul class="nav-list">
<li><a href="/dashboard">Dashboard</a></li>
<li><a href="/reports">Reports</a></li>
<li><a href="/settings">Settings</a></li>
</ul>
</nav>
</header>
<main id="main-content">
<article class="report-card">
<header>
<h2>Monthly Recurring Revenue</h2>
</header>
<p class="metric-value">$42,500</p>
</article>
</main>
<footer class="site-footer">
<p>© 2026 Acme Corp. All rights reserved.</p>
</footer>
</body>
</html>
2. Modern CSS: Custom Properties and Fluid Typography
:root {
/* Design Tokens */
--font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--color-primary: #2563eb;
--color-primary-hover: #1d4ed8;
--color-surface: #ffffff;
--color-text: #1f2937;
--color-muted: #6b7280;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 2rem;
--radius-md: 0.5rem;
/* Fluid typography: scales smoothly from 1rem at 320px to 1.25rem at 1200px */
--text-base: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
}
@media (prefers-color-scheme: dark) {
:root {
--color-surface: #111827;
--color-text: #f9fafb;
--color-muted: #9ca3af;
}
}
body {
font-family: var(--font-sans);
font-size: var(--text-base);
color: var(--color-text);
background-color: var(--color-surface);
line-height: 1.5;
margin: 0;
}
3. Responsive Layouts: CSS Grid & Flexbox
Responsive Auto-Fit Grid (Zero Media Queries!)
Automatically wraps cards into multi-column layout based on card minimum width:
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
gap: var(--space-lg);
padding: var(--space-md);
}
Accessible Skip-Link Pattern
.skip-link {
position: absolute;
top: -999px;
left: -999px;
background: var(--color-primary);
color: #fff;
padding: var(--space-sm) var(--space-md);
z-index: 1000;
}
.skip-link:focus {
top: var(--space-sm);
left: var(--space-sm);
}
/* Explicit, accessible focus indicators */
a:focus-visible, button:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 3px;
}
4. Container Queries (Component-Driven Sizing)
Style components according to the width of their parent container rather than the global browser viewport:
.card-container {
container-type: inline-size;
}
.profile-card {
display: flex;
flex-direction: column;
}
/* When the card container has 450px or more space, switch to horizontal layout */
@container (min-width: 450px) {
.profile-card {
flex-direction: row;
align-items: center;
gap: var(--space-md);
}
}
5. Common Mistakes and Anti-Patterns
| Anti-Pattern | Accessibility / UI Bug | Correct Practice |
|---|---|---|
<div onclick="..."> for buttons |
Non-focusable by keyboard, not announced as button by screen readers | Use native <button type="button"> |
outline: none; without replacement |
Keyboard users cannot see what element is focused | Use :focus-visible { outline: 2px solid ... } |
| Poor color contrast (< 4.5:1 ratio) | Fails WCAG AA; unreadable for low-vision users | Test contrast ratios with Lighthouse / axe |
Fixed pixel widths (width: 1200px) |
Causes horizontal overflow on mobile screens | Use max-width and fluid units: max-width: 1200px; width: 100% |
| Missing viewport meta tag | Mobile browsers render desktop zoom-out layout | Add <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
6. Verification Checklist
- Validated with W3C HTML validator with 0 errors.
- Tab navigation works across all interactive elements (
tabindex >= 0). - Color contrast meets WCAG 2.1 AA (4.5:1 for normal text, 3:1 for large text).
- Page scales seamlessly from 320px mobile viewport to 2560px 4K without horizontal overflow.
- Lighthouse accessibility score >= 95.