CSS interview questions, html css interview questions, and html and css interview questions appear in junior frontend, UI engineer, and full-stack screening rounds before JavaScript framework depth. Interviewers expect you to explain why a rule wins (cascade and specificity), choose flexbox vs grid with reasons, debug overflow and sticky bugs, and describe 2026-era CSS such as container queries, @layer, and :has(). This guide covers HTML structure and CSS layout together because most hiring loops treat them as one fundamentals block.
Below are 40+ HTML and CSS interview questions, covering semantics, cascade, layout, responsive design, modern CSS, and debugging. Pair with front end developer interviews for JavaScript, React, and Core Web Vitals breadth, TypeScript interview questions when roles type components, React interview questions for component styling patterns, Selenium interview questions for locator and DOM timing context, and full stack developer interviews when UI meets API design.
Interview context and how to prepare
What CSS and HTML interviews test
CSS and HTML interviews test whether you can structure pages correctly and predict layout behavior—not whether you memorized every property name.
| Layer | What interviewers probe |
|---|---|
| HTML | Semantics, forms, accessibility, document structure |
| Cascade | Specificity, inheritance, @layer, source order |
| Box model | box-sizing, margin collapse, overflow |
| Layout | Flexbox, grid, positioning, centering |
| Responsive | Media queries, container queries, fluid units |
| Modern CSS | :has(), logical properties, subgrid |
| Maintainability | BEM, avoiding specificity wars, critical CSS |
| Role | Emphasis |
|---|---|
| Junior | Box model, flex centering, semantic tags |
| Mid-level | Grid layouts, responsive nav, debugging cascade |
| Senior | Architecture, performance, design-system trade-offs |
Live exercises often ask you to debug specificity, choose flex vs grid, and build a responsive card layout.
Typical HTML/CSS interview loop
| Round | Duration | Focus |
|---|---|---|
| Screening | 30 min | Portfolio, stack, CSS comfort |
| HTML/CSS fundamentals | 45 min | Semantics, box model, flex/grid |
| Live layout exercise | 45–60 min | Navbar, card grid, centering |
| JavaScript / framework | 45–60 min | Often React—see dedicated guides |
| System / senior | 45 min | Design systems, performance, a11y |
Written rounds often start with the box model, specificity, and centering; live rounds add responsive navigation and sticky header debugging.
Realistic HTML/CSS prep plan
| Week | Focus | Output |
|---|---|---|
| 1 | Semantic HTML, forms, a11y basics | Rebuild a landing page structure |
| 2 | Box model, specificity, cascade, @layer |
Debug a conflicting stylesheet |
| 3 | Flexbox deep dive | Nav bar + centered hero |
| 4 | Grid + responsive patterns | Card gallery with auto-fit |
| 5 | Modern CSS + mock interview | Container queries, :has(), timed layout |
Build one portfolio layout you can whiteboard: explain every display choice aloud.
Junior vs senior CSS expectations
| Topic | Junior | Senior |
|---|---|---|
| Layout | Flex centering, basic grid | Composed flex+grid systems |
| Cascade | Class vs ID specificity | @layer, design tokens, isolation |
| Responsive | Media queries | Container queries + fluid type |
| Performance | max-width: 100% on images |
Critical CSS, layout thrashing |
| Architecture | Single stylesheet | BEM, CSS modules, utility trade-offs |
| Debugging | Toggle rules in DevTools | Stacking contexts, containing blocks |
Seniors are judged on maintainability and cross-browser judgment, not trick properties.
Why are HTML and CSS tested together?
What interviewers are testing: Whether you understand that semantic markup, accessibility, layout, responsive behavior, and styling are interdependent—and that CSS cannot fully compensate for incorrect HTML structure.
HTML provides meaning and structure; CSS provides presentation. Interviewers combine them because broken UI often starts with wrong markup.
| Concern | HTML role | CSS role |
|---|---|---|
| Accessibility | <button>, <label>, headings |
Focus styles, visible focus rings |
| SEO | <h1>–<h6>, landmarks |
None (content structure) |
| Layout | Wrapper elements | display, flex, grid |
| Forms | input types, name |
Spacing, error states |
| Responsive images | <picture>, srcset |
max-width: 100% |
A page with div soup may look fine until keyboard navigation, screen readers, or mobile reflow fail.
A strong answer is:
HTML defines the structure, semantics, and native behavior of the page; CSS controls presentation and layout. Interviewers test them together because good UI work depends on choosing the right markup before styling it.
HTML fundamentals
What is semantic HTML and why does it matter?
What interviewers are testing: Whether you choose semantic elements for meaning and accessibility, not div soup for styling.
Semantic HTML uses elements that describe meaning, not only appearance.
| Instead of | Prefer | Why |
|---|---|---|
<div class="button"> |
<button> |
Keyboard, focus, disabled state |
<div class="nav"> |
<nav> |
Landmark for assistive tech |
<b> for headings |
<h1>–<h6> |
Document outline, structure |
<span onclick> |
<button> or <a href> |
Accessible activation |
Benefits interviewers want to hear:
- Accessibility — browsers expose roles and keyboard behavior
- Document structure —
<h1>–<h6>and landmarks communicate hierarchy to browsers, assistive technology, and crawlers - Maintainability — less custom ARIA to remember
- Default styling — user-agent styles as baseline
A strong answer is:
Semantic HTML gives me correct behavior before CSS—buttons focus, headings outline, forms associate labels—and ARIA should enhance, not replace, the right tag.
Explain DOCTYPE and basic document structure.
What interviewers are testing: Whether you explain DOCTYPE, html/head/body and why invalid structure breaks parsing.
<!DOCTYPE html> tells the browser to use standards mode (HTML5). Without it, older quirks mode can change box model and layout math.
Minimal valid skeleton:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Page title</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>...</header>
<main>...</main>
<footer>...</footer>
</body>
</html>Key points:
langhelps screen readers pick pronunciationcharset=utf-8avoids mojibakeviewportmeta tells mobile browsers to use the device width as the layout viewport, so responsive breakpoints behave as intended- Use one visible
<main>element for the page's primary content
A strong answer is:
DOCTYPE enables standards mode; I set charset, lang, and viewport metadata so text, accessibility, and responsive layout behave predictably.
Block vs inline vs inline-block elements?
What interviewers are testing: Whether you predict layout and width behavior for block, inline, and inline-block.
| Display (default) | Layout behavior | Examples |
|---|---|---|
| Block | New line; width fills container | div, p, h1, section |
| Inline | Flows in text line; width from content | span, a, strong |
| Inline-block | Participates inline but accepts width/height and box sizing | Common for compact sized inline boxes |
CSS can override with display: block | inline | inline-block | flex | grid | none. Replaced elements and form controls have browser-specific default display behavior—do not treat img, button, or input as universally inline-block without checking computed styles.
Common interview trap: applying width and height to a default inline span has no effect until you change display.
A strong answer is:
Block elements stack vertically and accept full width; inline elements flow with text; inline-block is the bridge when I need sizing on an inline flow.
HTML forms — what should you know for interviews?
What interviewers are testing: Whether you know that form correctness starts with native controls, labels, names, input types, validation semantics, and accessible error handling—not styling alone.
Forms connect user input to servers and accessibility.
| Element | Purpose |
|---|---|
<form action method> |
Submission target and HTTP verb |
<label for="id"> |
Clickable label tied to control |
| `<input type="email | password |
<textarea> |
Multi-line text |
<select> / <option> |
Dropdown choices |
required, pattern, min, max |
Client-side validation attributes |
Interviewers check whether you use native input types (better mobile keyboards) and labels, not placeholder-only forms.
<label for="email">Email</label>
<input id="email" name="email" type="email" required autocomplete="email">A strong answer is:
I pair every input with a label, pick the right type for validation and mobile UX, and style error states in CSS without removing native focus rings.
Accessibility basics — ARIA vs semantic HTML?
What interviewers are testing: Whether you know that native semantic elements provide built-in keyboard and accessibility behavior, and use ARIA only when HTML cannot express the required state or relationship.
WCAG principles: Perceivable, Operable, Understandable, Robust.
| Practice | Detail |
|---|---|
| Semantic first | <button>, <nav>, <main> before ARIA roles |
| Keyboard | All interactive elements reachable via Tab |
| Focus visible | Never outline: none without replacement |
| Color contrast | Text meets 4.5:1 (normal) or 3:1 (large) |
| Alt text | Meaningful alt on informative images |
| ARIA when needed | aria-expanded, aria-live for dynamic widgets |
Rule of thumb: no ARIA is better than wrong ARIA when a native element exists.
A strong answer is:
I use semantic HTML for default a11y, add ARIA only for custom widgets, and keep focus styles visible—accessibility is part of HTML/CSS fundamentals, not a bonus round.
Important `<head>` tags for layout and SEO?
What interviewers are testing: Whether you know which document metadata affects parsing, responsive rendering, discoverability, and resource loading—and avoid cargo-culting preload tags.
| Tag | Role |
|---|---|
<meta charset="utf-8"> |
Character encoding |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
Mobile scaling |
<title> |
Tab title, search snippet |
<meta name="description"> |
Search summary |
<link rel="stylesheet"> |
CSS (render-blocking by default) |
<link rel="preload" as="font" crossorigin> |
Critical font loading |
<link rel="icon"> |
Favicon |
Missing viewport meta is a classic reason media queries never seem to work on phones—the page renders at desktop width then scales down.
A strong answer is:
The viewport meta tag makes responsive breakpoints behave as intended on mobile. I also set charset and document metadata correctly, and preload only resources that are genuinely critical.
CSS fundamentals — cascade and selectors
Explain the CSS cascade — what decides the winning rule?
What interviewers are testing: Whether you trace origin, importance, specificity, and order—not '!important' as first resort.
When multiple rules target the same element, the cascade compares candidates in this order:
- Relevance — whether the declaration applies
- Origin and importance — user-agent, user, and author styles, including
!important - Cascade layers —
@layerorder when used - Specificity — selector weight
- Scoping proximity —
@scopewhen used - Source order — later rule wins if still tied
Cascade layers participate within an origin/importance context; layer precedence is evaluated before selector specificity, so a lower-specificity declaration in a higher-priority layer can beat a more specific declaration in a lower-priority layer.
Origin nuance: For normal declarations, author styles generally beat user styles, which beat user-agent defaults. For !important declarations, that order reverses: user-agent !important can outrank user !important, which can outrank author !important.
Animations and transitions have special cascade precedence:
- Animations outrank normal declarations
!importantoutranks animations- Active transitions outrank even
!important
@layer reset, base, components, utilities;
@layer components {
.card { padding: 1rem; }
}
@layer utilities {
.p-0 { padding: 0; } /* wins over .card if layers ordered this way */
}Understanding cascade lets you fix bugs without random class renames.
A strong answer is:
The cascade first determines the winning origin, importance, and layer precedence; then it compares specificity, scoping proximity, and source order. Animations and active transitions have their own precedence in that process.
How is CSS specificity calculated?
What interviewers are testing: Whether you calculate specificity (IDs, classes, elements) and debug override wars.
Specificity is often written as (inline, IDs, classes/attributes/pseudo-classes, elements/pseudo-elements).
| Selector | Specificity (simplified) |
|---|---|
p |
0,0,0,1 |
.btn |
0,0,1,0 |
#nav .btn |
0,1,1,0 |
style="color:red" |
1,0,0,0 |
!important does not add specificity. It changes cascade importance and is resolved before specificity among competing declarations of different importance.
:not(.x) adds specificity of its argument; :where(.x) contributes zero specificity.
Interviewers ask you to compare:
div.card { } /* 0,0,1,1 */
.card.primary { } /* 0,0,2,0 — wins */A strong answer is:
I count IDs, classes, and elements—
:where()for resets with zero weight—and avoid ID selectors in components because they are painful to override.
What inherits in CSS and what does not?
What interviewers are testing: Whether you know what inherits (color, font) vs what does not (margin, border).
Inherited properties flow to children: color, font-family, line-height, visibility, and custom properties.
Non-inherited (each element defaults): margin, padding, border, width, height, background, display.
body {
font-family: system-ui, sans-serif;
color: #1e293b;
}
/* All text inherits font and color unless overridden */Resets vs normalize:
- Reset — strips margins/padding globally
- Normalize — preserves useful defaults, fixes browser bugs
Modern projects often use a small reset plus box-sizing: border-box globally.
A strong answer is:
Typography and color inherit; box model does not—I set font on
bodyand reset margins deliberately rather than fighting user-agent defaults per component.
Important CSS selector types?
What interviewers are testing: Whether you can explain important css selector types with correct definitions and one concrete example.
| Selector | Example | Use |
|---|---|---|
| Type | p, h1 |
Low specificity baselines |
| Class | .card |
Components (preferred) |
| ID | #header |
Avoid for styling (high specificity) |
| Attribute | [type="email"] |
Form styling |
| Descendant | .nav a |
Any nested link |
| Child | .nav > a |
Direct children only |
| Adjacent sibling | h2 + p |
First paragraph after heading |
| Pseudo-class | :hover, :focus-visible, :nth-child(2) |
State and position |
| Pseudo-element | ::before, ::after, ::placeholder |
Generated decoration |
Use :focus-visible when you want browser heuristics to show a visible focus indicator primarily when keyboard or other non-pointer interaction needs it. Do not remove useful focus indication unless an equivalent accessible style replaces it.
A strong answer is:
I use classes for component styling and
:focus-visiblewhen I want focus indication to follow the browser's input-modality heuristics, while ensuring keyboard users always have a visible focus state.
CSS units — px, rem, em, %, vh, fr?
What interviewers are testing: Whether you can explain css units — px, rem, em, %, vh, fr with correct definitions and one concrete example.
| Unit | Meaning | Typical use |
|---|---|---|
| px | CSS reference pixel (not necessarily one physical device pixel on high-DPI screens) | Borders, shadows, fine layout |
| rem | Root font-size multiple |
Spacing, typography (accessible scaling) |
| em | Parent font-size multiple |
Component-relative padding |
| % | Percent of parent | Width in fluid layouts |
| vh/vw | Viewport height/width | Full-screen sections (watch mobile URL bar) |
| fr | Grid fraction | grid-template-columns: 1fr 2fr |
| ch | Character width | max-width: 65ch for readable line length |
Interview tip: set html { font-size: 100%; } and use rem for scalable design systems.
A strong answer is:
I use rem for scalable typography, fr for grid tracks, and modern viewport units such as
dvhfor mobile full-height layouts, withvhwhere a compatibility fallback is needed.
CSS custom properties (variables)?
What interviewers are testing: Whether you can explain css custom properties (variables) with correct definitions and one concrete example.
Custom properties are live, inheritable values declared with --name:
:root {
--color-primary: #264de4;
--space-md: 1rem;
}
.button {
background: var(--color-primary);
padding: var(--space-md);
}
.card {
--color-primary: #e44d26; /* override in subtree */
}Unlike Sass variables, they cascade and work in the browser at runtime—ideal for theming and dark mode.
@media (prefers-color-scheme: dark) {
:root {
--color-bg: #0f172a;
--color-text: #f8fafc;
}
}A strong answer is:
Custom properties cascade for theming—I define tokens on
:rootand override in scopes like.darkorprefers-color-schemewithout rebuilding CSS.
`:is()`, `:where()`, and `:has()` — why do interviewers ask?
What interviewers are testing: Whether you understand the specificity behavior of :is(), :where(), and :has(), and can use relational selectors without creating overly broad or hard-to-maintain rules.
Modern functional pseudo-classes reduce selector bloat:
/* :is() — specificity = most specific argument */
:is(h1, h2, h3) { line-height: 1.2; }
/* :where() — zero specificity */
:where(ul, ol) { margin: 0; padding: 0; list-style: none; }
/* :has() — parent selector (supported in major browsers) */
.card:has(img) { padding-top: 0; }
.form-group:has(:invalid) { border-color: red; }:has() enables parent styling based on children—previously impossible without JavaScript.
A strong answer is:
I use
:where()when I need zero-specificity grouping,:is()to reduce selector repetition, and:has()for relational/parent-aware styling. I still keep selectors scoped and simple rather than treating:has()as a replacement for component state.
Box model, display, and positioning
Explain the CSS box model and box-sizing.
What interviewers are testing: Whether you explain content-box vs border-box and how padding affects measured size.
Every element is a rectangle with:
content → padding → border → margin
box-sizing |
Width includes |
|---|---|
content-box (default) |
Content only—padding and border add to total size |
border-box |
Content + padding + border inside stated width |
*, *::before, *::after {
box-sizing: border-box;
}
.box {
width: 200px;
padding: 16px;
border: 2px solid #333;
/* border-box: total width stays 200px */
}The box model—content, padding, border, and margin—is one of the first topics most interviewers ask about.
A strong answer is:
border-box makes width math predictable—padding and border stay inside the declared width, which is why global border-box resets are standard.
What is margin collapse?
What interviewers are testing: Whether you explain vertical margin collapse between siblings and parent-child blocks.
Adjacent vertical block margins can collapse. When both margins are positive, the resulting margin is typically the larger one rather than their sum; negative margins follow different rules.
h1 { margin-bottom: 24px; }
p { margin-top: 16px; }
/* Gap between h1 and p is 24px, not 40px */Prevention techniques:
- Parent padding or border can prevent parent/child margins from collapsing through that edge
display: flow-rootcreates a new block formatting context- Flex/grid layouts have different margin-collapsing behavior
Interviewers use this to test whether you understand unexpected whitespace bugs.
A strong answer is:
Vertical margins collapse between blocks—I use padding, flex/grid, or flow-root on parents when I need spacing that does not collapse unexpectedly.
Key `display` values and when to use them?
What interviewers are testing: Whether you can explain key display values and when to use them with correct definitions and one concrete example.
| Value | Effect |
|---|---|
block |
Stack, full width available |
inline |
Text flow, no width/height |
inline-block |
Inline flow with box model |
none |
Removed from layout (not same as visibility: hidden) |
flex |
One-dimensional flex formatting context |
grid |
Two-dimensional grid formatting context |
flow-root |
BFC root—contains floats, stops margin collapse |
visibility: hidden keeps layout space; display: none removes the element from layout entirely.
A strong answer is:
display: noneremoves an element from layout and normally from the accessibility tree;visibility: hiddenpreserves its layout space. I choose flex/grid when I need a layout formatting context rather than using display values only as visibility switches.
CSS positioning — static, relative, absolute, fixed, sticky?
What interviewers are testing: Whether you have depth on css positioning — static, relative, absolute, f...—mechanism, trade-offs, and production judgment.
| Value | Behavior |
|---|---|
static |
Default document flow |
relative |
Offset from normal position; creates positioning context for children |
absolute |
Removed from flow; positioned vs nearest positioned ancestor |
fixed |
Removed from normal flow and normally positioned relative to the viewport; certain transformed/containing ancestors can establish its containing block instead |
sticky |
Participates in normal flow, then is constrained relative to its scroll container once the specified inset threshold is reached |
.dropdown {
position: relative;
}
.menu {
position: absolute;
top: 100%;
left: 0;
}Sticky sticks relative to its relevant scrolling ancestor. An ancestor with overflow: hidden, auto, or scroll can therefore change the expected behavior relative to the viewport. top (or another inset) must be set.
A strong answer is:
absoluteis positioned relative to its containing block, commonly the nearest positioned ancestor.stickystays in normal flow but is constrained by its scroll container and needs an inset such astop; I inspect ancestors and overflow when it behaves unexpectedly.
z-index and stacking contexts?
What interviewers are testing: Whether you understand that z-index is scoped by stacking contexts and can diagnose why a very large z-index still loses to an element in another context.
z-index only compares elements in the same stacking context. A new context is created by:
position+z-index(notstatic)opacityless than 1transform,filter,isolation: isolate- Flex/grid items with
z-index
.modal-backdrop {
position: fixed;
inset: 0;
z-index: 100;
}
.modal {
position: fixed;
z-index: 101;
}
/* Values compare as expected only when elements share compatible stacking contexts */Interview fix for "my dropdown is behind the header": parent created a lower stacking context.
A strong answer is:
z-index is not global—these values are only comparable as expected when the elements participate in compatible stacking contexts. I find which ancestor creates a stacking context and fix that context, not random 9999 values on children.
Flexbox
Flex container properties you must know?
What interviewers are testing: Whether you debug flex container vs item properties without random overrides.
.nav {
display: flex;
flex-direction: row; /* row | column */
flex-wrap: wrap; /* nowrap | wrap */
justify-content: space-between; /* main axis */
align-items: center; /* cross axis */
align-content: center; /* multi-line cross axis */
gap: 1rem;
}| Property | Axis |
|---|---|
justify-content |
Main axis distribution |
align-items |
Cross axis alignment (single line) |
align-content |
Cross axis when wrapped multiple lines |
gap |
Space between items (preferred over margin hacks) |
Main axis follows flex-direction; default is row (horizontal).
A strong answer is:
justify-content distributes on the main axis, align-items on the cross axis—I set flex-direction first because it defines which axis is which.
Flex item properties — flex-grow, flex-shrink, flex-basis?
What interviewers are testing: Whether you debug flex container vs item properties without random overrides.
.sidebar { flex: 0 0 250px; } /* grow shrink basis */
.content { flex: 1 1 auto; } /* grow to fill */Shorthand flex: <grow> <shrink> <basis>:
| Part | Meaning |
|---|---|
flex-grow |
Share of free space (0 = do not grow) |
flex-shrink |
Shrink ratio when overflow |
flex-basis |
Initial size before grow/shrink |
In browsers, flex: 1 commonly expands to flex: 1 1 0%, so items start from a zero flex basis and share available space.
A strong answer is:
flex: 1 on content areas lets them absorb free space; fixed sidebars use flex: 0 0 250px so they do not shrink unexpectedly.
How do you center an element with flexbox?
What interviewers are testing: Whether you center with justify-content and align-items without absolute-position hacks.
.center-both {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
min-height: 100dvh; /* or parent with defined height */
}Other methods interviewers expect:
| Method | CSS idea |
|---|---|
| Grid | place-items: center on parent |
| Absolute + transform | top/left 50% + translate(-50%, -50%) |
| Margin auto | Block with width: margin: 0 auto (horizontal only) |
Flex/grid are preferred in 2026 over table-cell hacks.
A strong answer is:
For one-off centering I use flex with justify and align center on a parent with defined height; for page regions I might use grid place-items center.
flex-wrap and gap — practical use?
What interviewers are testing: Whether you debug flex container vs item properties without random overrides.
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}flex-wrap: wrap— items move to next line instead of overflowinggap— consistent spacing without negative margin tricks on containers
order can reorder visually but does not change tab order—accessibility caution in interviews.
A strong answer is:
I use flex-wrap plus gap for responsive rows. I avoid using order to create a visual sequence that differs from DOM reading and keyboard order.
Why is `min-width: 0` a common flex/grid fix?
What interviewers are testing: Whether you know flex items default min-width: auto and why that blocks shrinking.
Flex items—and many grid items through automatic minimum sizing—may refuse to shrink below intrinsic content size. Setting min-width: 0 on the affected item lets it shrink inside the available track/container.
.flex-child {
flex: 1;
min-width: 0; /* allow shrinking; pair with overflow hidden or text-overflow */
}A strong answer is:
min-width: 0 lets flex children shrink below content intrinsic width—essential for ellipsis sidebars and responsive dashboards.
CSS Grid
Flexbox vs CSS Grid — when do you use each?
What interviewers are testing: Whether you choose one-dimensional flex vs two-dimensional grid from layout intent.
| Use Flexbox | Use Grid |
|---|---|
| One-dimensional (row or column) | Two-dimensional (rows and columns) |
| Content-driven sizing | Layout-driven tracks |
| Nav bars, toolbars, card internals | Page layouts, card galleries |
| Alignment along one axis | Explicit areas and tracks |
They compose:
.page {
display: grid;
grid-template-columns: 240px 1fr;
min-height: 100vh;
}
.header nav {
display: flex;
justify-content: space-between;
}Interviewers often ask when you would pick flex versus grid for a given layout—state the axis and content flow, not just property names.
A strong answer is:
Grid for page skeleton and two-axis regions; flex inside components for alignment—I do not force everything into one system.
grid-template-columns, fr, and minmax?
What interviewers are testing: Whether you use grid tracks, areas, and placement for two-dimensional layout.
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
.responsive-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
}| Function | Role |
|---|---|
fr |
Fraction of free space after fixed tracks |
minmax(min, max) |
Clamp track size |
repeat(n, track) |
Avoid manual column lists |
auto-fit collapses empty tracks; auto-fill keeps empty columns—subtle interview difference.
A strong answer is:
auto-fit minmax makes responsive card grids without media queries—tracks grow and wrap based on container width.
grid-template-areas for readable layouts?
What interviewers are testing: Whether you use grid tracks, areas, and placement for two-dimensional layout.
.layout {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 200px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
header { grid-area: header; }
aside { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }Named areas make responsive reflow readable—change the string in one media query.
A strong answer is:
grid-template-areas documents layout intent in one place—I rewrite the area map at breakpoints instead of renumbering columns.
grid-column, grid-row, and implicit grid?
What interviewers are testing: Whether you use grid tracks, areas, and placement for two-dimensional layout.
Explicit placement:
.featured {
grid-column: 1 / -1; /* span full width */
}
.span-two {
grid-column: span 2;
}If items exceed defined tracks, the implicit grid creates extra rows/columns with grid-auto-rows defaults.
subgrid (nested grid inherits parent tracks) matters for design-system alignment in 2026 senior questions.
A strong answer is:
I use span and line numbers for featured cards; subgrid when nested components must align to the parent column tracks.
What is CSS subgrid?
What interviewers are testing: Whether you use grid tracks, areas, and placement for two-dimensional layout.
subgrid lets a nested grid align to parent grid lines:
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.card {
display: grid;
grid-template-rows: subgrid;
grid-row: span 3;
}subgrid only works for an axis where the nested grid spans tracks created by its parent grid; it inherits those parent track definitions instead of creating independent tracks.
Before subgrid, card internals misaligned across rows when titles varied in height.
Subgrid is supported across current major browser engines, but check your required browser matrix when targeting older enterprise versions.
A strong answer is:
subgrid syncs nested rows to the parent grid so card actions align across uneven content—I use it in card galleries and form sections.
Responsive design and modern CSS
Media queries and mobile-first CSS?
What interviewers are testing: Whether you can explain media queries and mobile-first css with correct definitions and one concrete example.
/* Mobile-first: base styles for small screens */
.nav { flex-direction: column; }
@media (min-width: 768px) {
.nav { flex-direction: row; }
}Common breakpoints are content-driven, not device lists—adjust when layout breaks.
| Query | Use |
|---|---|
min-width |
Mobile-first escalation |
max-width |
Desktop-first reduction |
prefers-reduced-motion |
Accessibility |
prefers-color-scheme |
Dark mode |
Pair with responsive images: srcset, sizes, <picture>.
A strong answer is:
I start mobile-first with min-width queries at points where the design breaks, not arbitrary iPhone widths.
Container queries vs media queries?
What interviewers are testing: Whether you contrast container queries and media queries with when each wins—not parallel definitions.
Media queries react to viewport; container queries react to parent container size:
.card-container {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 400px) {
.card { display: grid; grid-template-columns: 120px 1fr; }
}Use when a reusable component must adapt inside sidebar vs main column—viewport width is misleading.
A strong answer is:
Container queries style components by their slot width—media queries for page-level changes; container queries for reusable cards and widgets.
What is @scope in CSS?
What interviewers are testing: Whether you understand how @scope limits selector reach without increasing ordinary selector specificity, and how scoping proximity participates in cascade conflict resolution.
@scope limits which elements a stylesheet rule can match by defining a scope root and optional scope limit.
| Concept | Role |
|---|---|
| Scope root | Start of the subtree where rules apply |
| Scope limit | Optional boundary stopping selector reach |
| Cascade | Scoping proximity is part of the modern cascade algorithm |
Useful for component styles without global leakage or excessive specificity wars—pairs naturally with @layer for design systems.
@scope (.card) {
:scope { padding: 1rem; }
h2 { font-size: 1.25rem; }
}A strong answer is:
@scope confines selectors to a subtree and participates in cascade scoping proximity—I use it with layers when I need component-local styling without fighting global specificity.
Fluid typography with clamp()?
What interviewers are testing: Whether you can explain fluid typography with clamp() with correct definitions and one concrete example.
h1 {
font-size: clamp(1.5rem, calc(2vw + 1rem), 2.5rem);
}clamp(min, preferred, max) scales smoothly without dozens of breakpoints.
| Technique | Role |
|---|---|
clamp() |
Fluid size with bounds |
min() / max() |
Cap or floor values |
rem base |
Respects user font settings |
A strong answer is:
clamp()gives me fluid typography with minimum and maximum bounds. I prefer rem-based bounds so the design responds better to user font-size preferences while still scaling smoothly with the viewport.
Logical properties — margin-inline, padding-block?
What interviewers are testing: Whether you can explain logical properties — margin-inline, padding-block with correct definitions and one concrete example.
Logical properties map to writing direction instead of physical left/right:
| Physical | Logical |
|---|---|
margin-left |
margin-inline-start |
padding-top |
padding-block-start |
width |
inline-size |
height |
block-size |
border-left |
border-inline-start |
top |
inset-block-start |
Benefits for RTL languages and internationalized apps—interviewers test awareness, not memorization of every name.
.card {
padding-inline: 1rem;
padding-block: 0.75rem;
border-inline-start: 3px solid var(--accent);
}A strong answer is:
Logical properties keep spacing correct in RTL—I use margin-inline and padding-block instead of left/right in new code.
Overflow, images, and responsive media?
What interviewers are testing: Whether you can explain overflow, images, and responsive media with correct definitions and one concrete example.
img, video {
max-width: 100%;
height: auto;
display: block;
}
.scroll-panel {
overflow: auto;
max-height: 400px;
}| Issue | Fix |
|---|---|
| Image overflows container | max-width: 100% |
| Layout shift (CLS) | width/height attributes or aspect-ratio |
| Cropped hero | object-fit: cover with fixed aspect-ratio box |
.hero-img {
aspect-ratio: 16 / 9;
object-fit: cover;
width: 100%;
}A strong answer is:
max-width 100% on media plus aspect-ratio on heroes reduces overflow and CLS—I set dimensions in HTML when possible.
Architecture, performance, and animations
BEM and CSS architecture basics?
What interviewers are testing: Whether you can explain bem and css architecture basics with correct definitions and one concrete example.
BEM — Block, Element, Modifier:
.card { }
.card__title { }
.card--featured { }
/* Element modifier when needed: */
.card__title--large { }Goals:
- Predictable class names — no deep nesting in selectors
- Flat specificity — usually one class per rule
- Reusable blocks —
.cardworks across pages
Alternatives: CSS Modules, utility-first (Tailwind), CSS-in-JS—interviewers want trade-off awareness, not framework wars.
| Approach | Pros | Cons |
|---|---|---|
| BEM | Explicit, low specificity | Verbose class strings |
| Utilities | Fast prototyping | HTML noise |
| CSS Modules | Scoped by build | Build step |
A strong answer is:
BEM keeps specificity flat and namespaced—I pick CSS Modules or utilities when the team already standardized on them.
Specificity wars and when `!important` is acceptable?
What interviewers are testing: Whether you can explain specificity wars and when !important is acceptable with correct definitions and one concrete example.
Specificity wars happen when teams stack IDs, deep selectors, and overrides.
Prevention:
- Prefer single-class component rules
- Use
@layerfor utilities vs components - Avoid ID selectors for styling
- Document token changes instead of one-off overrides
!important is justified when importance is intentionally part of the cascade contract—for example accessibility/user overrides, tightly controlled utility layers, or overriding third-party CSS you cannot change.
A strong answer is:
I solve precedence with layers and low-specificity selectors first;
!importantis reserved for deliberate cascade contracts or external CSS I cannot control.
CSS performance — what matters in interviews?
What interviewers are testing: Whether you can explain css performance — what matters in interviews with correct definitions and one concrete example.
| Topic | Guidance |
|---|---|
| Selector cost | Modern engines are fast; avoid huge unused CSS bundles |
| Critical CSS | Reduce render-blocking CSS and unused CSS; critical-CSS inlining is one option when measurements show it improves rendering |
| Layout thrashing | Batch DOM reads/writes in JS (see front-end guide) |
| Animations | Prefer transform and opacity for compositor |
| will-change | Use sparingly; lets the browser prepare for an upcoming change and can consume extra resources |
Expensive painting or compositing during interactions can contribute to poor responsiveness. Profile animations and interaction frames rather than assuming a property is automatically slow.
A strong answer is:
I ship smaller CSS, animate transform/opacity, and avoid layout-triggering properties in loops—performance is measurable, not theoretical.
Transitions vs animations?
What interviewers are testing: Whether you contrast transitions and animations with when each wins—not parallel definitions.
.button {
transition: background-color 0.2s ease, transform 0.2s ease;
}
.button:hover {
transform: translateY(-2px);
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
.modal {
animation: fade-in 0.3s ease-out;
}| Feature | Use |
|---|---|
transition |
Simple A → B on property change |
@keyframes |
Multi-step or looping motion |
prefers-reduced-motion |
Disable or shorten motion |
Respect accessibility—do not rely on motion alone for critical feedback.
A strong answer is:
transitions for hover/focus states; keyframes for entrance effects—I gate motion with prefers-reduced-motion for accessibility.
Live scenarios and debugging
Scenario: Styles not applying — how do you debug?
What interviewers are testing: Whether you use DevTools to identify the winning declaration and distinguish selector mismatch, cascade precedence, inheritance, shorthand resets, and layout/overflow issues before adding overrides.
Checklist interviewers want spoken aloud:
- DevTools Styles panel — which rule wins and why (strikethrough losers)
- Specificity — compare competing selectors
- Cascade layers —
@layerorder - Typo — wrong class name or missing stylesheet link
- Source order — duplicate imports
- Inherited vs direct — property may not inherit
- Shorthand override —
backgroundresettingbackground-color - Parent overflow — clipping or sticky failure
A strong answer is:
I read DevTools computed styles, trace the winning rule through specificity and layers, and fix the selector—not sprinkle !important until I understand the conflict.
Final-week HTML and CSS interview checklist
Use the final week to rehearse layout and cascade patterns, not every CSS property.
Must revise:
- Semantic HTML — landmarks, forms, headings
- Box model — border-box, margin collapse
- Specificity — calculate winners; know
@layer - Flexbox — centering, wrap, gap, min-width: 0
- Grid — auto-fit minmax, areas, subgrid awareness
- Positioning — absolute containing block, sticky pitfalls
- z-index — stacking contexts
- Responsive — mobile-first, container queries
- Modern —
:has(),@scope, logical properties,clamp() - One live layout — navbar + card grid timed
- Front end developer interviews for JS and performance
- TypeScript interview questions if stack uses TS
- React interview questions for component styling next step
Good closing line for an interview:
I time-box one full page build weekly—semantic HTML, grid page, flex components—and explain every cascade conflict I fixed without !important.
Pattern cheat sheet (quick reference)
| Task | HTML/CSS approach |
|---|---|
| Page regions | CSS Grid + grid-template-areas |
| Nav / toolbar | Flexbox + gap |
| Responsive cards | repeat(auto-fit, minmax(280px, 1fr)) |
| Center child | Flex justify + align center |
| Flat specificity | BEM or @layer |
| Theme tokens | Custom properties on :root |
| Parent-aware style | :has() |
| Component-responsive | Container queries |
| Fluid headings | clamp() |
| Truncate in flex | min-width: 0 + text-overflow: ellipsis |
| Debug conflicts | DevTools → specificity → layers |
References
On-site prep
- Front end developer interview questions — JavaScript, browser behavior, accessibility, and Core Web Vitals
- TypeScript interview questions — typing component props, state, generics, and narrowing
- React interview questions — component rendering and styling patterns
- Angular developer interview questions — templates, component architecture, accessibility, and UI performance
- Selenium interview questions — DOM locators, browser interaction, and UI testing
Summary
CSS and HTML interviews test cascade mechanics, layout choices (flex vs grid), and responsive debugging—not property lists from memory. Rebuild a responsive layout, calculate specificity on paper, and compare your answers to each section. Pair with front end developer interviews, TypeScript, and React when the role continues into components.

