Web (HTML / CSS / JS)
The three languages of the browser — HTML for document structure, CSS for styling and layout, JavaScript for behaviour — together with the substantial Web platform APIs (DOM, Events, Fetch, Storage). The conventional substrate of front-end development.
- Paradigms
- imperative · OOP · functional · declarative
- Typing
- dynamic
- Memory
- gc
- Version
- ES2025 / CSS Snapshot 2025 / HTML Living Standard
- First released
- 1991
The Web is the universal application substrate of the contemporary internet. A working web page is the composition of three distinct languages, each with its own purpose: HTML (HyperText Markup Language) provides document structure — the elements, their hierarchy, and the relationships between them; CSS (Cascading Style Sheets) provides presentation — colour, typography, spacing, layout, animations; JavaScript (the language standardised as ECMAScript) provides behaviour — the dynamic logic that responds to user interaction and manipulates the structure and presentation at runtime. Browsers expose this triad through the DOM (Document Object Model) and a substantial set of Web platform APIs — fetch, storage, events, workers, timers, cryptography, and many more. Together these constitute the most-deployed application platform in computing history.
History
The three languages emerged on overlapping timelines through the 1990s. HTML was proposed by Tim Berners-Lee at CERN in 1989 and described in his 1991 paper HTML Tags; the first publicly available description appeared in 1991. The language was standardised through W3C from 1995 onwards, with HTML 4.01 in 1999 and HTML5 as a substantial modernisation in 2014; the contemporary specification is the HTML Living Standard maintained by WHATWG. CSS was proposed by Håkon Wium Lie in 1994 and standardised as CSS1 in 1996; substantial revisions followed (CSS2, CSS2.1) and the language was modularised from CSS3 onwards into separate specifications progressing independently. JavaScript was created by Brendan Eich at Netscape in May 1995 and submitted to Ecma International for standardisation as ECMAScript (ECMA-262) in 1996. ECMAScript has been revised on an annual cadence since 2016; ES2025 is the current edition. The substantial Web platform APIs — DOM, fetch, the URL API, IndexedDB, the various sensor and capability APIs — are standardised through W3C and WHATWG working groups.
Hello world
The minimal page combining all three:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
<style>
h1 { color: #336; font-family: system-ui, sans-serif; }
</style>
</head>
<body>
<h1>Hello, world!</h1>
<button id="greet">Greet</button>
<script>
document.getElementById("greet").addEventListener("click", () => {
console.log("Hello, world!");
});
</script>
</body>
</html>
The example shows the three languages composed: the HTML defines the structure (heading, button), the CSS styles the heading, the JavaScript wires up an event handler. The browser parses the HTML to construct the DOM, applies the CSS to compute styles, and runs the JavaScript to set up the interactive behaviour.
The three layers
The conventional discipline keeps the layers separated — HTML and CSS in the document, JavaScript loaded separately. The principal motivations are caching (a single CSS or JavaScript file admits being cached across pages and visits), maintainability (separation of concerns admits substantial editing in isolation), performance (the browser parses HTML, fetches CSS in parallel, and defers JavaScript appropriately), and accessibility (substantial markup is admitted by assistive technologies before styling and scripts apply). The contemporary tooling — bundlers (Vite, esbuild, Rollup, webpack), package managers (npm, pnpm, yarn, bun), transpilers (Babel, TypeScript, swc), test runners (Vitest, Jest, Playwright) — admits substantial productivity for substantial applications.
Browsers and runtimes
The principal browser engines: Blink (V8 + Blink rendering) for Chrome, Edge, Opera, Brave; Gecko (SpiderMonkey + Gecko rendering) for Firefox; WebKit (JavaScriptCore + WebKit rendering) for Safari and all iOS browsers. Server-side and embedded JavaScript runtimes — Node.js, Deno, Bun — admit substantial server-side and tooling work. The conventional contemporary front-end stack uses Vite with TypeScript (treated separately on this reference) plus a framework (React, Vue, Svelte, Solid).
A note on the boundaries
The three languages have substantial boundaries. HTML is not a programming language — admit no logic, no variables, no control flow; the structural markup is consumed by the browser to build the DOM. CSS is declarative — admit substantial computation through selectors, cascade, and inheritance, but no imperative control flow until Houdini APIs (substantial work-in-progress). JavaScript is the imperative layer — admit substantial logic, manipulation of HTML and CSS at runtime through the DOM and CSSOM APIs. The discipline is to use each language for its purpose: HTML for structure, CSS for presentation, JavaScript for behaviour. Substantial mixing — CSS-in-JS libraries, JSX (HTML-in-JS), inline styles — admits substantial component-style frameworks at the cost of the conventional separation.