HTML forms work in every browser since HTML 2.0. HTML5 form validation needs Chrome 10+, Firefox 4+, Safari 10.1+. See input types, attributes, and quirks.

Prince Dewani
May 6, 2026
An HTML form is a section of a web page, defined by the WHATWG <form> element, that collects user input and submits it to a server. It ships in every browser by default; HTML5 form validation works in Chrome 10, Firefox 4, Safari 10.1, Edge 12, Opera 10, Samsung Internet 4, and Android Browser 4.4.3.
This guide covers what an HTML form is, the browsers that support it, the key features, the known issues, and how to make forms cross-browser.
An HTML form is a <form> element that collects user input through controls like text fields, checkboxes, radio buttons, and submit buttons. The WHATWG HTML Living Standard owns the spec in section 4.10.3, and the element ships values to a server using the GET, POST, or dialog submission method.
The <form> element works in every browser as part of the original HTML 2.0 spec, so global support sits at near 100%. HTML5 form validation, new input types, and modern attributes have version-specific support that varies by browser and OS.
Chrome supports the <form> element from Chrome 1 on Windows, macOS, Linux, ChromeOS, and Android. HTML5 form validation works from Chrome 10 on, while Chrome 4 to 9 did not support constraint validation, the :invalid and :valid pseudo-classes, or the checkValidity() method. The email, url, tel, number, and range input types work from Chrome 5 on, and the date, time, datetime-local, month, and color input types work from Chrome 20 on.
Microsoft Edge supports the <form> element and HTML5 form validation from Edge 12 on Windows. EdgeHTML 12 to 18 covered core forms but lacked some pickers and the formdata event. Chromium-based Edge 79 and later inherits every Chrome forms feature, including the dialog form method, form-associated custom elements, and the full set of HTML5 input types on Windows, macOS, and Linux.
Firefox supports the <form> element from Firefox 1 on Windows, macOS, Linux, and Android. HTML5 form validation works from Firefox 4 on, while Firefox 2 to 3.6 did not support constraint validation. Firefox supports the date, time, month, datetime-local, number, range, and color input types from Firefox 57 on. The week input is still not supported in Firefox.
Safari supports the <form> element from Safari 1 on macOS. HTML5 form validation works from Safari 10.1 on macOS and from iOS Safari 10.3 on iPhone and iPad, while Safari 5 to 10 had partial support and did not style :invalid on submission. The date, time, datetime-local, and month input types work from Safari 14.1 on macOS Big Sur and from iOS Safari 5 on the iOS native picker. The color and week input types are still unsupported on Safari and iOS Safari and fall back to plain text.
Opera supports the <form> element from Opera 1 on Windows, macOS, and Linux. HTML5 form validation works from Opera 10 on, while Opera 9 to 9.6 did not support constraint validation. Chromium-based Opera 15 and later tracks every Chrome forms feature, including the dialog method and form-associated custom elements. Opera Mini renders forms but skips most HTML5 input pickers and falls back to text fields.
Samsung Internet supports the <form> element from Samsung Internet 1.0 on Galaxy phones and tablets. HTML5 form validation works from Samsung Internet 4 on. Samsung Internet inherits the Chromium forms stack, so the email, url, tel, number, range, date, time, datetime-local, month, and color input types use the native Android picker. Form-associated custom elements work from Samsung Internet 12 on.
The legacy Android Browser supports the <form> element from Android Browser 2.1 on. HTML5 form validation works from Android Browser 4.4.3 on, while Android Browser 2.1 to 3 did not support constraint validation and 4 to 4.4 had partial support. Modern Chrome for Android replaced the stock Android Browser on Android 4.4 and later, and Chrome for Android tracks every desktop Chrome forms feature.
Internet Explorer supports the <form> element from Internet Explorer 1 on Windows. HTML5 form validation works from Internet Explorer 10 on, while IE 5.5 to 9 did not support constraint validation, the required attribute, or the :invalid pseudo-class. IE 10 and 11 do not implement the date, time, color, datetime-local, week, or month input types, so they all fall back to plain text. Microsoft has retired Internet Explorer, so move IE-only forms to Chromium Edge for new work.
Note: HTML forms break across Safari pickers, iOS picker styling, and the autocomplete attribute. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
HTML forms wrap a set of attributes, input types, and a constraint validation API that work together to collect, validate, and submit user input. The headline features focus on submission control, type-aware inputs, and built-in validation.
HTML forms have small but painful cross-browser quirks that cluster around HTML5 input pickers, validation styling, and the autocomplete attribute. The fixes are mostly small tweaks once you know where the gap is.
In my experience, the loudest forms bug on real-device runs is iOS Safari refusing to honor autocomplete="off" on a credit-card form, because Apple Pay and the iCloud Keychain prompt anyway. The fix is to add an inputmode and a strict pattern, then accept that the keychain prompt is part of the iOS flow.
You ensure HTML forms work across browsers by feature-detecting modern input types, providing a graceful fallback, and validating on the server in addition to the client. The steps below walk you through that pipeline.
Paste this snippet into the DevTools console of any browser to see which HTML5 input types it supports and whether the constraint validation API is wired up.
// Paste this into the DevTools console to see which HTML5 input types your browser supports.
const types = ["date", "time", "datetime-local", "month", "week", "color", "email", "url", "tel", "number", "range", "search"];
types.forEach((type) => {
const probe = document.createElement("input");
probe.setAttribute("type", type);
const supported = probe.type === type;
console.log(type.padEnd(16), supported ? "supported" : "falls back to text");
});
// Also confirm constraint validation is wired up.
const sample = document.createElement("input");
console.log("checkValidity:", typeof sample.checkValidity === "function");
console.log("ValidityState :", "validity" in sample);All HTML form version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance