CSS Editor

Fully customise the look of your quiz with your own CSS — change colours, fonts, spacing, sizes and animations without needing !important.

Updated: April 2026

Comfort+ Available on Comfort and Premium plans.

What is the CSS Editor?#

The CSS Editor lets you write arbitrary CSS that is injected directly into your public quiz page. Change colours, fonts, padding, border-radius, animations — anything possible in CSS.

Unlike other quiz builders that require !important on every rule, Qwizoo is built around CSS custom properties (variables). Change --qz-primary once and every button, selection highlight and progress bar updates automatically.

🎨

CSS Variables

Override colours, border-radius, fonts and shadows globally with a single line — no !important needed.

🎯

Stable selectors

Target exact elements with data-quiz-* attributes that never change, unlike Tailwind class names.

Ready snippets

Dark mode, gradient buttons, Google Fonts, custom cards — one click to insert.

📋

Variable reference

Built-in panel shows all CSS variables with their current values and a copy button.


How to Open the CSS Editor#

  1. 1Open your quiz in the builder.
  2. 2Click the Design tab in the right-hand panel.
  3. 3Switch to the CSS sub-tab (fourth tab, after Layout).
  4. 4Write or paste your CSS into the editor.
  5. 5Changes are saved automatically — open your quiz in a new tab to preview.
💡

The editor has CSS syntax highlighting, bracket auto-close and supports the Tab key for indentation.


CSS Variables#

These variables are set on the quiz root element and cascade to all child components. Override them in :root or directly on [data-quiz="container"].

VariableDefaultWhat it controls
--qz-primary#FF7A00Buttons, selected choice highlight, progress bar, links
--qz-bg#F4F5F7Page background (outside the card)
--qz-card-bg#FFFFFFCard / content area background
--qz-text#111827Main text colour
--qz-fontInter, sans-serifFont family for the entire quiz
--qz-btn-radius14pxBorder-radius of all buttons (0 = square, 9999px = pill)
--qz-q-size18pxFont size of question titles
--qz-shadow0 24px 60px …Card drop shadow
💡

Copy any variable name from the CSS Variables panel inside the editor — it copies as var(--qz-primary) ready to paste.


Targeting Elements — data-quiz-* Selectors#

Every key element in the quiz has a stable data-quiz or data-quiz-btn attribute. Attribute selectors have higher CSS specificity than class selectors, so they override Tailwind utility classes without !important.

Layout & Navigation

SelectorElement
[data-quiz="container"]Outermost wrapper — root of all CSS vars
[data-quiz="page"]Page area — vertical centering & padding
[data-quiz="wrapper"]Max-width wrapper (max-w-lg / 1000px split)
[data-quiz="card"]White content card
[data-quiz="columns"]CSS Grid container for split layout
[data-quiz="cover-image"]Cover panel (split layout only)
[data-quiz="cover-video"]Cover video iframe (split layout)
[data-quiz="cover-image-img"]Cover image element (split layout)
[data-quiz="hero-image"]Mobile hero image/video (split layout)
[data-quiz="bottom-nav"]Bottom navigation bar in split layout
[data-quiz="logo"]Quiz logo image
[data-quiz="branding-link"]Qwizoo branding link
[data-quiz="step-header"]Row with the back button and step counter
[data-quiz="step-counter"]Step counter label (e.g. 2 / 6)
[data-quiz="step-content"]Inner content padding wrapper
[data-quiz="step"]Step root element (all step types)
[data-quiz-btn="next"]All Continue / Next / Submit buttons
[data-quiz-btn="back"]All Back buttons

Progress bar

SelectorElement
[data-quiz="progress"]Progress bar wrapper
[data-quiz="progress-fill"]Fill bar (bar style)
[data-quiz="progress-dot"]Individual dot (dots style)
[data-quiz="progress-step"]Step circle (steps style)
[data-quiz="progress-line"]Connector line between steps

Welcome step

SelectorElement
[data-quiz="welcome-media"]Image / video wrapper
[data-quiz="welcome-video"]Video iframe
[data-quiz="welcome-image"]Image element
[data-quiz="welcome-content"]Text & button area
[data-quiz="title"]Step title — Welcome, Lead form, Thank you
[data-quiz="description"]Step description paragraph — all step types

Question & Choices

SelectorElement
[data-quiz="question"]Question title (h2)
[data-quiz="question-media"]Question image / video wrapper
[data-quiz="question-video"]Question video iframe
[data-quiz="question-image"]Question image
[data-quiz="choices"]Choices list wrapper
[data-quiz="choice"]Answer choice button — the whole row
[data-quiz-choice="indicator"]Radio / checkbox circle inside a choice
[data-quiz-choice="label"]Label text inside a choice
[data-quiz-choice="explanation"]Explanation text under a choice label
[data-quiz="picture-grid"]Picture choice 2-column grid
[data-quiz-choice="image"]Image inside a picture choice
[data-quiz-choice="placeholder"]Placeholder when picture choice has no image
[data-quiz-choice="badge"]Checkmark badge on a selected picture choice
[data-quiz="text-input"]Text, email, number, date, and address inputs
[data-quiz="slider"]Slider root wrapper
[data-quiz-slider="labels"]Min / current / max labels row
[data-quiz-slider="min"]Min value label
[data-quiz-slider="current"]Current value label (large, coloured)
[data-quiz-slider="max"]Max value label
[data-quiz-slider="track"]Range <input> track — style with ::webkit-slider-thumb etc.
[data-quiz="rating"]Rating input wrapper (stars, numbers, emoji)
[data-quiz="rating-button"]Individual star / number button inside rating
[data-quiz="tags"]Tags input root wrapper
[data-quiz="tags-count"]Tags selection count label
[data-quiz="tags-list"]Tags buttons row wrapper
[data-quiz="tag"]Individual tag button

Lead form

SelectorElement
[data-quiz="lead-form"]Lead form <form> element
[data-quiz="form-progress"]Multi-step form progress dots
[data-quiz="lead-field"]Field wrapper (label + input)
[data-quiz="lead-label"]Label above each field
[data-quiz="lead-input"]Text input field
[data-quiz="field-error"]Validation error message below a field
[data-quiz="otp-block"]SMS OTP verification section
[data-quiz-btn="otp-send"]Send OTP code button
[data-quiz-btn="otp-resend"]Resend OTP code button
[data-quiz-btn="otp-verify"]Verify OTP button
[data-quiz="captcha-container"]Turnstile captcha widget wrapper
[data-quiz="captcha-alert"]Captcha expired / not verified alert
[data-quiz="submit-error"]Submission error alert banner
[data-quiz="privacy-notice"]Privacy policy consent text
[data-quiz="privacy-link"]Privacy policy link inside consent text

Result step

SelectorElement
[data-quiz="result-body"]Result root content wrapper
[data-quiz="result-media"]Result image / video wrapper
[data-quiz="result-video"]Result video iframe
[data-quiz="result-image"]Result image element
[data-quiz="result-icon"]Result emoji icon (🎉)
[data-quiz="result-title"]Result headline
[data-quiz="result-description"]Result description paragraph
[data-quiz="score-badge"]Score badge (total points)
[data-quiz="ai-result"]AI-generated result text block
[data-quiz="ai-result-text"]AI result text content div
[data-quiz-btn="ai-retry"]Retry AI analysis button
[data-quiz="formula-results"]Formula results wrapper
[data-quiz="formula-result"]Individual formula result card
[data-quiz="formula-label"]Formula result label (above the number)
[data-quiz="result-value"]Formula result value (the large coloured number)
[data-quiz="formula-breakdown"]Formula inputs breakdown table
[data-quiz="conditional-message"]Conditional message block inside formula result
[data-quiz="conditional-cta"]CTA link inside conditional message
[data-quiz="benchmark"]Benchmark comparison bar wrapper
[data-quiz="benchmark-fill"]Benchmark bar fill element
[data-quiz="formula-narrative"]AI narrative text inside formula result
[data-quiz="result-actions"]Result action buttons wrapper
[data-quiz-btn="pdf"]PDF download button

Formula calculator

SelectorElement
[data-quiz="formula-fields"]Formula step fields group wrapper
[data-quiz="formula-field"]Individual formula field (slider or number)
[data-quiz="formula-field-header"]Formula slider: label + value row
[data-quiz="formula-field-label"]Formula field label
[data-quiz="formula-field-value"]Formula slider current value display
[data-quiz="formula-slider"]Formula slider <input type=range>
[data-quiz="formula-extent"]Formula slider min/max extent labels
[data-quiz="formula-prefix"]Currency / unit prefix inside number field
[data-quiz="formula-number-input"]Formula number <input>
[data-quiz="formula-suffix"]Unit suffix inside number field
[data-quiz="range-field"]Two-handle range field root wrapper
[data-quiz="range-labels"]Range field label + display row
[data-quiz="range-label"]Range field label
[data-quiz="range-display"]Range field min–max value display
[data-quiz="range-track"]Range field background track
[data-quiz="range-fill"]Range field filled bar
[data-quiz="range-thumb-min"]Range field min thumb input
[data-quiz="range-thumb-max"]Range field max thumb input
[data-quiz="range-extent"]Range field min/max extent labels

Thank You & Share

SelectorElement
[data-quiz="step-divider"]Decorative dots divider on Thank You step
[data-quiz="share-row"]Share section on Thank You step
[data-quiz="share-label"]Share section heading
[data-quiz="share-icons"]Social share icon buttons row
[data-quiz-btn="share-native"]Native share button (mobile)
[data-quiz-btn="share-platform"]Individual social platform share button (X, FB, etc.)
[data-quiz-btn="share-copy"]Copy link button in share row

Video & Calendar

SelectorElement
[data-quiz="video-embed"]Video step iframe wrapper
[data-quiz="video-iframe"]Video step iframe element
[data-quiz="video-media"]Video step image (fallback)
[data-quiz="video-image"]Video step image element
[data-quiz="video-content"]Video step title & description area
[data-quiz="video-placeholder"]Video step placeholder (no URL set)
[data-quiz="calendar-embed"]Calendar iframe wrapper
[data-quiz="calendar-iframe"]Calendar iframe element

Code Examples#

Change brand colour

css
:root {
  --qz-primary: #7B61FF;
}

Dark mode

css
:root {
  --qz-bg: #1A1A2E;
  --qz-card-bg: #16213E;
  --qz-text: #F9FAFB;
  --qz-shadow: 0 24px 60px rgba(0,0,0,0.40);
}

Pill-shaped buttons

css
:root {
  --qz-btn-radius: 9999px;
}

Gradient Next button

css
[data-quiz-btn="next"] {
  background: linear-gradient(135deg, #FF7A00, #FF4500) !important;
  letter-spacing: 0.04em;
}

Custom card

css
[data-quiz="card"] {
  border-radius: 24px;
  border: 2px solid var(--qz-primary);
  padding: 40px;
}

Custom Google Font

css
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;700&display=swap');

:root {
  --qz-font: Montserrat, sans-serif;
}

Larger question text

css
:root {
  --qz-q-size: 26px;
}

Style text inputs

css
[data-quiz="text-input"] {
  border-radius: 8px;
  border: 2px solid var(--qz-primary);
  font-size: 16px;
}

Style step titles

css
[data-quiz="title"] {
  font-size: 2rem;
  letter-spacing: -0.02em;
}
[data-quiz="result-value"] {
  font-size: 3rem;
}

Built-in Snippets#

Click any snippet in the right-hand panel to insert it. Snippets are appended to existing CSS — they never overwrite what you have already written.

  • Dark mode — dark background and card with light text
  • Purple accent — switches the primary colour to purple
  • No card shadow — removes the card drop shadow
  • Larger question text — increases question font size to 26px
  • Google Font — Montserrat — imports and applies Montserrat
  • Gradient Next button — orange-to-red gradient on the continue button
  • Custom card — rounded card with a coloured border and extra padding

Tips & Limitations#

  • Copy selectors from the panel — the Element Selectors panel inside the editor lists all 16 selectors with a one-click copy button, so you never have to type them manually.
  • CSS variables override inline styles — even though colours are set with inline styles internally, they use var(--qz-primary), so changing the variable overrides them everywhere.
  • Attribute selectors beat Tailwind classes [data-quiz="card"] has specificity (0,1,0,0) vs a Tailwind class (0,0,1,0), so spacing and size overrides just work.
  • Choice selection tint uses hex-alpha (e.g. #FF7A0012) — use !important if you need to change it.
  • 50 000 character limit — more than enough for any real-world use.
  • @import for Google Fonts works — the style tag is injected into the page head, so @font-face is also fully supported.
⚠️

CSS Editor is a Comfort+ feature. On the Standard plan the tab is visible but locked — upgrade to unlock it.