The Problem

On iOS Safari, <input type="date"> opens a native UIDatePicker — a spinning drum-wheel interface that pops up from the bottom of the screen. This is familiar iOS UX, but it's completely impossible to style with CSS. Any custom design system that relies on a consistent date picker widget across platforms will look different (or broken) on iOS.

Check-in date
2026-07-15
CancelSelect DateDone
June
July
Aug
Sep
Oct
13
14
15
16
17
2024
2025
2026
2027
2028
CSS styling: none

Native iOS drum picker — not styleable

Root Cause

Safari on iOS renders <input type="date"> as a native UIKit component — aUIDatePicker in "wheels" style. This is controlled at the OS level and WebKit delegates rendering entirely to native UIKit, bypassing CSS styling hooks. The value format is also normalised by iOS before being exposed to JavaScript, which can differ from other platforms.

Option 1 — Accept native behaviour, style the trigger field

The simplest approach: accept the native picker (it provides good UX for iOS users) and style only the input field itself — the visible trigger before the picker opens.

date-input.css
/* Style the input trigger field (not the picker) */
input[type="date"],
input[type="datetime-local"],
input[type="time"] {
  appearance: none;
  -webkit-appearance: none;
  border: 1px solid #ccc;
  border-radius: 8px;
  padding: 12px 16px;
  font-size: 16px; /* prevent auto-zoom on iOS */
  font-family: inherit;
  width: 100%;
  background: #fff;
  color: #000;
}

/* Focus state */
input[type="date"]:focus {
  outline: none;
  border-color: #007aff;
  box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.2);
}

Option 2 — JavaScript date picker library

For a fully consistent cross-platform UI, use a JS library that suppresses the native picker and renders its own calendar. Flatpickr is lightweight (~16kb gzipped), zero-dependency, and works identically on all platforms.

datepicker.html
<!-- Flatpickr: fully custom, works on iOS -->
<link rel="stylesheet" href="flatpickr.min.css">
<script src="flatpickr.min.js"></script>

<input type="text" id="datepicker" placeholder="YYYY-MM-DD">

<script>
  flatpickr("#datepicker", {
    dateFormat: "Y-m-d",
    allowInput: true,
    // Prevents iOS from showing native keyboard for the text field
    disableMobile: false,
  });
</script>

Option 3 — text input with inputmode

For simple cases, use a text input with the inputmode attribute to show a numeric keyboard and a regex pattern for validation. No picker at all.

text-date.html
<label for="date">Date (YYYY-MM-DD)</label>
<input
  type="text"
  id="date"
  name="date"
  inputmode="numeric"
  placeholder="2026-07-15"
  pattern="\d{4}-\d{2}-\d{2}"
  title="Enter a date in YYYY-MM-DD format"
>
Recommendation by use case:
Simple forms with familiar UX: Option 1 (native picker, styled trigger).
Design-system components needing pixel-perfect cross-platform consistency: Option 2 (Flatpickr).
Admin tools or power-user interfaces: Option 3 (text + inputmode).

Browser Support

BrowserMin VersionStatusNotes
Safari iOSAllPartialRenders as native drum-wheel picker — not styleable with CSS
Chrome iOSAllPartialSame WebKit engine — same native picker
Chrome AndroidAllPartialNative Android date picker (Material) — different but also hard to style
FirefoxAllSupportedCustom styleable date picker; -moz-appearance: none supported
Safari macOSAllPartialRenders inline — minimal styling via appearance:none
Chrome macOS/WindowsAllSupportedCustom styleable date widget

Further Reading