The scripting media feature detects whether JavaScript (or other client-side scripting) is available. Style no-JS fallbacks and enhanced states with @media (scripting) queries.
01
@media
Media query.
02
enabled
JS on.
03
none
JS off.
04
initial
Load only.
05
noscript
HTML pair.
06
fallback
Defaults.
Fundamentals
Introduction
Many websites depend on JavaScript for navigation toggles, form validation, and interactive widgets. But some users disable scripting, and some environments block it entirely. Your site should still be usable.
The CSS scripting media feature lets you apply different styles depending on whether scripting is enabled or unavailable — without writing any JavaScript yourself.
Definition and Usage
Write @media (scripting: none) for no-JavaScript fallbacks and @media (scripting: enabled) for enhanced styling when scripting works. A third value, initial-only, matches rare cases where scripting runs only during the initial page load.
💡
Beginner Tip
CSS scripting queries are a progressive enhancement layer. Always build working HTML first, add <noscript> messages, and use scripting media queries for visual polish — not for hiding essential content.
Foundation
📝 Syntax
Use (scripting: value) inside @media:
syntax.css
/* Scripting disabled or unavailable */@media(scripting:none){/* No-JS fallback styles */}/* Scripting fully enabled */@media(scripting:enabled){/* Enhanced JS-available styles */}/* Scripting only during initial page load (rare) */@media(scripting:initial-only){/* Initial-load-only styles */}
Accepted Values
none No scripting available. JavaScript disabled or blocked.
enabled Scripting fully available. Normal browser with JS on.
initial-only Scripting during page load only. Rare edge case.
scripting vs noscript
@media (scripting: none) CSS media query — applies styles when scripting is off. Hides or shows elements visually.
<noscript>…</noscript> HTML element — inserts fallback content when scripting is disabled. Works in all browsers.
scripting vs .no-js class
@media (scripting: enabled) Native CSS detection — no JavaScript needed to set a class.
<html class="no-js"> Classic pattern — JS removes the class on load. Works everywhere but requires a tiny script.
The classic pattern from the reference tutorial, cleaned up with correct media feature terminology and hidden-by-default messages.
Tips
🛠 Usage Tips
HTML first — Build pages that work without JavaScript; add scripting queries for polish.
Use noscript — Pair CSS with <noscript> for universal no-JS messaging.
Hide by default — Set display: none on status elements, reveal per query.
Test with JS off — Disable JavaScript in browser dev tools to verify fallbacks.
Nav fallbacks — Always expose links when hamburger menus cannot function.
Watch Out
⚠️ Common Pitfalls
Calling it a property — scripting is a media feature, not a CSS property.
Only CSS detection — Not all browsers support scripting queries; use noscript too.
Hiding essential content — Never require scripting: enabled to see critical information.
Assuming JS = enabled — Some privacy tools block scripts after page load (initial-only).
Replacing progressive enhancement — Scripting queries complement good HTML; they don’t replace it.
A11y
♿ Accessibility
Works without JS — Core content and navigation must be accessible with scripting off.
Clear no-JS messages — Tell users when features need JavaScript, don’t silently fail.
Keyboard navigation — Expose all links in the DOM when scripting is unavailable.
Do not trap users — Hidden nav menus without fallbacks block users who disable JS.
Screen reader support — Use semantic HTML; CSS scripting queries only adjust presentation.
🧠 How scripting Works
1
Browser checks scripting state
Reports whether client-side scripting is none, enabled, or initial-only.
Detect
2
scripting value is matched
Compares your query value against the browser’s scripting capability.
Match
3
@media rules apply
Fallback or enhanced styles update visibility, layout, and colors.
Apply
=
♿
Usable with or without JS
Your site stays functional regardless of scripting settings.
Compatibility
🖥 Browser Compatibility
The scripting media feature has growing but incomplete browser support. Chrome 120+ supports it; many browsers do not yet. Always use <noscript> and semantic HTML as primary fallbacks.
⚠ Growing · Use HTML fallbacks
Scripting media queries
Supported in Chrome 120+. Pair with noscript for reliable no-JS coverage everywhere.
PartialBrowser reach
scripting media featurePartial support
Bottom line: Learn the syntax for progressive enhancement, but rely on <noscript> and working HTML for production no-JS support.
Wrap Up
🎉 Conclusion
The scripting media feature lets CSS respond to JavaScript availability with (scripting: none), (scripting: enabled), and (scripting: initial-only) queries.
Use it for no-JS warnings, navigation fallbacks, and progressive enhancement — but always build on solid HTML and <noscript> so every user can access your content.
The scripting media feature detects whether client-side scripting (such as JavaScript) is available in the browser. Use @media (scripting: none) for no-JS fallbacks and @media (scripting: enabled) when scripting is active.
What values does scripting accept?
Three keyword values: none (scripting unavailable or disabled), enabled (scripting fully available), and initial-only (scripting available only during initial page load — a rare edge case).
Is scripting the same as the HTML noscript element?
No. noscript is HTML that renders when scripting is disabled. The scripting media feature is CSS that applies styles based on scripting state. Use both together for robust no-JS experiences.
When should I use scripting in CSS?
Use it to show fallback navigation, warnings, or simplified layouts when JavaScript is off. Pair with semantic HTML so the page works without JS. Do not hide essential content behind scripting queries alone.
Is the scripting media feature widely supported?
Support is growing but not universal. Chrome 120+ and some other modern browsers support it. Always provide HTML fallbacks with noscript and progressive enhancement — never rely on scripting queries alone for critical functionality.