Skip to content(if available)orjump to list(if available)

Customizable HTML Select

Customizable HTML Select

144 comments

·February 20, 2025

prmph

So after decades of developer pain, all we're getting is a better select?

Where is the native HTML datagrid (that supports sorting, filtering, paging, downloading, row/column freezing, column resizing and re-ordering)?

Where are the native HTML Tabs control? Image selector, resizer/cropper, and uploader? Toggle button? etc.

We can't even get text input to respect autocomplete directives properly. On the major browsers, giving your user id and password inputs nonsensical names seems to be required, along with numerous other hacks, to ensure that when a user is registering, the form is not auto-completed with saved passwords.

HTML is really holding us back right now.

dfabulich

Progress is very gradual in this space, but browser vendors are working on a lot of this stuff in the Open UI W3C community group. https://open-ui.org/

https://open-ui.org/components/combobox.explainer/ https://open-ui.org/components/switch.explainer/

> Where are the native HTML Tabs control?

You implement tabs today (aka accordions) with `<details name="tab">`. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/de... "This attribute enables multiple `<details>` elements to be connected, with only one open at a time. This allows developers to easily create UI features such as accordions without scripting."

You do have to write some CSS to align tabs horizontally, but it's fine.

> Image selector?

Use `<input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg" />`. Opens the OS photo picker on mobile. You can style it however you like.

> We can't even get text input to respect autocomplete directives properly.

"Properly" seems to be doing a lot of work there. "autocomplete" works fine, but it's annoying to get it right, and this kinda can't be fixed, because HTML is under a lot of backwards-compatibility constraints.

If you have autocomplete bugs to file, file them, and maybe convince the Interop group to focus on this issue. Their priorities for 2025 were just announced, but there's always next year. https://web.dev/blog/interop-2025

crabmusket

> it's annoying to get it right, and this kinda can't be fixed, because HTML is under a lot of backwards-compatibility constraints

Sorry, but this seems like a wild mischaracterisation, at least in regards to the problems I've had with users on Chrome. In our experience, Chrome aggressively shows an autofill prompt on almost every input it can. It also ignores the specced autocomplete=off attribute. We have observed Chrome showing a password prompt on an <input type=number> which is just bonkers. It is not hard NOT to do this.

The Chrome team thinks whatever heuristic they're using is better than allowing developers, or even end users, to control filling behaviour.

https://issues.chromium.org/issues/41163264 https://issues.chromium.org/issues/41239842

(By "autofill" I don't necessarily mean the input is automatically filled without user interaction, but sometimes a promotions shown with e.g. account login details or an address.)

The argument has been that developers are naughty and turn off autocomplete inappropriately, which worsenes accessibility. But I've never seen e.g. a tooltip option in a browser to let me, the user, fill in details when I know they're appropriate? I am merely at the whim of the Chrome algorithm.

streptomycin

Problem with autocomplete=off is some morons think they should use it on their login form for "security" or whatever, cause forcing users to type in passwords is "secure". So browsers wound up having to ignore it for actual security.

dfabulich

Yes, disabling autocomplete can be annoying, but it is possible. Usually it amounts to being more descriptive in the value of the `autocomplete` attribute, rather than simply applying `autocomplete=off`.

> We have observed Chrome showing a password prompt on an <input type=number> which is just bonkers.

"We have observed" it, but not filed a bug? Neither of the bugs you linked to exhibit that bug.

prmph

> Use `<input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg" />`. Opens the OS photo picker on mobile. You can style it however you like.

This just selects the image. 99 times out 100, you want to do the same things with the image data: adjust it in some way, and save it to object storage or something. The file input is too primitive for this. And this is the theme all over, HTML control remain too primitive to do any real world rih UI with, which leads to the proliferation of JS UI libraries.

> If you have autocomplete bugs to file, file them, and maybe convince the Interop group to focus on this issue. Their priorities for 2025 were just announced, but there's always next year. https://web.dev/blog/interop-2025

Autocomplete "bugs" abound aplenty, some of which will make your jaw drop. I've been testing with Chrome and Firefox. The length to which browsers will go in a misguided attempt to be clever with auto-complete is frankly absurd. So I'm not sure they are "bugs" so much as they are a wilful refusal by browser vendors to follow the spec.

dfabulich

> Autocomplete "bugs" abound aplenty

No, there's just the one "bug": browsers ignore autocomplete=off.

And, as you say, the browsers regard that not to be a bug, because when they honor developers request to prevent autocomplete, users keep filing bugs on the browsers, saying "why won't you autocomplete this??"

Put something descriptive in the autocomplete, instead of "off", and you're usually fine.

Consider the "State of HTML" survey of form pain points. https://2024.stateofhtml.com/en-US/features/forms/#forms_pai...

See also the "missing elements" section. https://2024.stateofhtml.com/en-US/usage/#html_missing_eleme...

An image cropper didn't make the list. Data table did! But it's pretty complicated, and, as I said, progress is slow. Partly that's for backwards compatibility reasons, and partly it's because you have to get Apple, Google, Microsoft, and Mozilla to all agree on anything, and that's really hard.

Autocomplete is on the list of pain points. But it's wayyy further down the list than having a customizable `<select>`. Styling & customization, validation, and `<input type=date>` are all bigger pain points than autocomplete.

filoeleven

> 99 times out 100, you want to do the same things with the image data: adjust it in some way, and save it to object storage or something.

That's kind of a bonkers expectation for the browser to fill. It's like expecting that <input type="audio" /> should let me crop the audio and add reverb to it. That's two specific manipulations out of untold thousands, and squarely within the purview of a different app. https://editor.audio/ (never used this, just an example)

rafram

> This just selects the image. 99 times out 100, you want to do the same things with the image data: adjust it in some way, and save it to object storage or something. The file input is too primitive for this.

That's not true at all. Obviously there's no `adjustinsomeway` or `savetoobjectstorage` attribute on the <input> element, but you can trivially grab the selected files, read them, and act on them with JavaScript: https://developer.mozilla.org/en-US/docs/Web/API/File_API/Us...

rikroots

> This just selects the image. 99 times out 100, you want to do the same things with the image data: adjust it in some way, and save it to object storage or something.

This is probably the reason why someone invented the <canvas> element?

cosmic_cheese

Datagrid is mysteriously missing on several newer desktop UI frameworks too, which effectively makes those frameworks ill-suited for a whole range of desktop applications. The only place reasonably batteries-included versions of those widgets can be found are in the old guard toolkits like AppKit, win32, MFC, Qt, GTK, etc.

sa46

> Where is the native HTML datagrid

Which parts of a datagrid should a browser provide? I'm familiar with AG Grid [1] and the API surface is enormous. Aligning browsers on a feature set would be challenging.

Maybe there's a core set of functionality, like Flutter's GridView or QML https://doc.qt.io/qt-6/qml-qtquick-gridview.html.

[1]: https://www.ag-grid.com/

crab_galaxy

The simplest would be to follow the aria role=“grid” spec, ideally with sortable columns. IMO it doesn’t need the kitchen sink AG Grid approach just a sane way to semantically build a data grid with proper accessibility.

https://www.w3.org/WAI/ARIA/apg/patterns/grid/examples/data-...

dimal

It has to handle every possible use case for a grid. You’re thinking of your use case. The spec needs to handle everything else. I don’t see how that’s manageable.

tisc

Imo it’s not html, it’s browser vendors. There’s a decent specification for the `autocomplete` attribute: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes...

kevincox

It is actually a reaction to websites doing stupid things to try and prevent password auto-fill. The sites are fighting against security in a misguided attempt to improve security, so the browser vendors added a bunch of heuristics to try and correct these situations and you end up with the mess we have.

petepete

Equally having to jump through extra hoops to prevent autocomplete where you don't want it is frustrating, like in admin interfaces where you might be updating someone else's name.

It's an arms race of stupidity.

crabmusket

RE autocomplete in Chrome. The only thing we've found to work reliably is ensuring that all inputs are in form elements. Any inputs outside forms are going to have inappropriate autocomplete prompts. It's extremely annoying but at least this works for now.

(I say "for now" because who knows when the Chrome team will change their heuristic?)

prmph

Nah, this does not work reliably. The weirdness I've found regarding autocomplete will fill a book.

martijnarts

I'd love to read a "Falsehoods programmers believe about..." post about this!

joshuacc

Why wouldn’t you put your inputs in a form element?

lelanthran

> Why wouldn’t you put your inputs in a form element?

Not all inputs are form-submission data.

For example a datalist-backed input to scroll to a specific page/chapter/section/subsection in a long document. You might populate the datalist with hundreds of entries so you don't have a long list of links that the user will have to scroll through in the sidebar. You can perform the scroll on the change event of the input.

That's a good UI for the user, instead of presenting a long list of links for the user to browse/search through, they simply have the input auto-suggest based on the populated datalist.

crabmusket

I mainly work on a large complex SPA with UX that does not often look like a form, but does have lots of inputs. These days I'm much bigger on semantic HTML, to the small extent it matters in our case, but there is a large burden of pages which were just div soup and loose inputs.

adam12

I'm just glad I don't have to support IE6 anymore.

arkh

> Where is the native HTML datagrid

Imagine a world where instead of letting IE die, microsoft decided to add a <XLS> tag in the early 2000. The most used nocode database in the world directly in the browser. In 2000.

nikeee

Internet Explorer had a native Data Grid with two-way data binding and much more.

https://schepp.dev/posts/today-the-trident-era-ends/#data-gr...

xnx

That's a great article about advancements in IE that still haven't all been matched.

endemic

If this will stop the proliferation of terrible JavaScript implementations of <select>, I'm here for it.

jjcm

I know LoC is a terrible metric, but it always shocks me that things like react-select require 30k LoC.

21% the size of the code of the Apollo Lander to configure/style a select dropdown.

streptomycin

react-select does a lot more than style the select though, so even after this new standard for customizable selects is supported everywhere, react-select will still have about the same level of complexity as it does now.

riwsky

But does it get even 21% of the way to landing on the moon?

drivingmenuts

I salute your optimism. Really, this just gives developers more options to make designers lives more miserable, and vice-versa.

layer8

My thought was it is giving designers more options to make users’ lives more miserable.

ocdtrekkie

I am honestly just blown away Google invested effort into a web standard that actually improves the web versus the dozens of web platform projects designed to let websites slurp more data.

This is something I actually look forward to being able to use when Firefox gets it.

jimbob45

There’s got to be a happy medium between using canvas to make the controls you actually want and browser-provided one-size-fits-nobody controls. I really thought MS was onto something with Silverlight’s with XAML but that died.

bityard

Ah, customizable for web developers, not end users.

(And yes, I'm still bitter about you all wrecking my scroll bars.)

jagged-chisel

You can override styling with user stylesheets. On desktop. Need the same for i{,Pad}OS.

macNchz

There are some iOS apps that work as Safari extensions and enable Greasemonkey scripts. I use one called Userscripts.

zzo38computer

I think that CSS is excessive, that I often disable it and that the excessive design means that sometimes the way to fix it is to add more stuff, which just makes it more messy. (In many cases, it would be helpful to put things that only the end user controls and that document author does not control. Yet, they don't really design them for that very well.)

deanc

I've been doing front-end since the days of IE5 and I'd be rich if I had a penny for every time I've had to do a custom "select". It's a pain to use third-party libraries for this, but it _is_ a solved problem and doesn't require that much extra code.

hassleblad23

I think we should welcome all efforts to have a standardized, modern select component in the HTML spec. Would save a lot of trouble.

bmk44

Even with an average software engineer compensation, you probably got paid a lot more than a penny for every custom "select" you implemented :)

crab_galaxy

Yeah the problem is when you need to create a custom select without using a 3rd party library, and you want to make sure the interactions are accessible and up to parity with native selects. Then you have to add tons of event handlers, aria attributes, refs for handling outside clicks, etc etc.

mopsi

Which libraries have solved this problem? I recently tried several of the most recommended standalone JS libraries for implementing a <select> with icons and a custom layout, but each single one of them was seriously lacking in some way.

troupo

It's not a solved problem. There are maybe two libraries out there that are customizable, performant, and don't break things like keyboard navigation and accessibility

asadotzler

This is the correct answer, if perhaps too optimistic on there being two of them.

CafeRacer

I spent days building this little perfect dropdown select thing, that is a hundreds lines of code and even more docs explaining what the hell is going on. Someone wasted the same amount of time before me. Someone else spent a lot of time before them. And so on.

I wish we have had more browser native implementations including some notion of virtual lists so the browser would not choke when rendering a lot of content.

---

Eventually, this would be same as border-radius. It will get implemented and we'll forget about that forever.

nine_k

I thought the promise of Web Components was also about this: make a control once, make it styleable, let everyone reuse it.

I wonder why is this not happening widely.

bastawhiz

It's not surprising, really: web components suck for having highly-customizable inputs.

1. You get HTML attributes to pass data in, or JavaScript properties. If you're in React, you'd just use a React component and skip web components. If you're in vanilla HTML, you can't just write HTML, you have to build the component with the DOM.

2. There's no real standard to making web components look the way you want them to. You can't just use CSS (you have to have the shadow root "adopt" the styles). Your point of "make it styleable" is actually one of web components' biggest weaknesses (IMO).

3. Web components are globally registered. React/Vue/Svelte/etc. components are objects that you use. You end up with a mess of making sure you registered all of the components you want before you use them (and not registering the ones you don't use) and hope no two packages you like use the same name.

rafram

> There's no real standard to making web components look the way you want them to. You can't just use CSS (you have to have the shadow root "adopt" the styles).

Not exactly. There’s the ::part() pseudo-element selector, which allows you to target an element in the shadow tree that has a matching part attribute.

https://developer.mozilla.org/en-US/docs/Web/CSS/::part

JimDabell

Web components are pretty terrible, and do not work as you would expect them to. Take this, for example

    <some-element>
        <input type="text">
    </some-element>
So <some-element> is a web component that adds extra features to the input. So it constructs a shadow DOM, puts the <input> into it, styles the input appropriately, etc. And before the web component finishes loading, or if it fails, or if web components aren’t supported in some way, it still works like a normal <input>.

Now take this:

    <some-element>
        <textarea>…</textarea>
    </some-element>
Same thing. You’ve got a normal <textarea>, and the web component adds its extra stuff.

Now take this:

    <some-element>
        <select>
            <option>…</option>
        </select>
    </some-element>
Same thing, right? Nope! This doesn’t work! Web components can only style their immediate children. So the first web component can style the <input> element, the second web component can style the <textarea> element, and the third web component can style the <select> element… but it can’t style the <option> element.

Web components are full of all of these random footguns.

rafram

> Web components can only style their immediate children.

This isn’t true at all. You’re doing something incorrect when creating your shadow root or adding your styles. (“Web components” aren’t really a thing - it’s a marketing term for a set of technologies - so I assume that you’re talking about custom elements with shadow roots here.)

troupo

Because web components themselves break even in the expected situations? And need 20+ new spec to make them work? And because they are neither low level enough nor high level enough to be useful for the use case you described?

akersten

- Why is picker a function like `::picker(select)`, and not a CSS pseudo class like `::before` to select the `select`'s `picker` component? I.e., `select::picker` makes a lot more sense to me.

- What about multi-choice (`multiple` attribute) `select`s?

smarkov

Because it's been trendy to introduce a new unintuitive syntax with every new CSS feature.

I am genuinely afraid for the future of CSS as it is becoming increasingly more complex, meanwhile most people haven't been able to properly utilize or understand it for the last decade even without all of that additional complexity.

gnuly

[dead]

Pesthuf

I don’t really see if there’s now an option to further improve the select with JavaScript to add, for example, a search textbox for filtering.

And what about the nearly unusable (on desktop) <select multiple>?

mjrpes

search textbox: would be supported under the even more customizable combobox element

select multiple: both the enhanced select and combobox plan to support this

Combobox: https://open-ui.org/components/combobox.explainer/

Enhanced Select: https://open-ui.org/components/customizableselect/

fiddlerwoaroof

I don’t understand the hatred for select multiple on desktop. It’s a list box that uses standard UI conventions that have been present for three or four decades now.

TeMPOraL

They're probably referring to it not being usable without keyboard, unlike regular select, or checkboxes, or anything else sans a text field. Specifically, to select elements one by one, you need to hold down Ctrl (on Windows; modifiers for other OSes are different).

For better or worse, this element is not obvious for those who didn't grow up using desktop computers 10+ years ago.

streptomycin

I use it in one place in my app, and even with me putting text right above it saying something like "ctrl+click to select multiple entries", I still periodically get emails from confused users. No idea what the actual % is, but it's gotta be some non-trivial fraction of people who just have no idea how to use that thing.

fiddlerwoaroof

The thing is, this is a catch-22 problem: if everyone used the default multiple select, people would know how to operate it (and they’d be able to transfer their knowledge from how the control works elsewhere in their os to the web: for example, if you know how to select multiple files in Finder, Windows Explorer or in a open file dialog, it works exactly the same way in the multiple select control). But, because web developers have decided to invent a 1,001 different multiple selects, the default control is inaccessible.

The real issue I have with the web is everyone has broken user interface consistency across the platform with custom web controls where the default controls would be fine.

LordShredda

How about the literally unusable <select multiple> on mobile? You can't select more than one option on a touch screen...

jacobsimon

Seems to work fine on iOS Safari and Chrome

no_wizard

They been talking about this for a long time.

In fact, I remember at some point, they were trying to sell the idea of exposing all the form inputs to use the `::part` API, since under the hood form inputs share the same general logic of custom elements, If I recall correctly.

From the looks of it, didn't work out that way though.

And I think its for the best. I like this proposal more, even though delivering the `::part` API to everyone (not just web component users) would have likely been faster

spankalee

Using ::part() was a bad idea. Part is for user-defined pseudo elements. The platform can just define real pseudo elements. I argued against using `::part()` in spec threads, and I haven't looked back recently, but I think that argument won over.

bushido

This is a very good start, I don't think it'll replace a lot of the custom code/comboboxes that are seen in react-land without search (unless I missed it).

sharlos201068

Maybe, but adding search to this element is still a lot easier than a fully custom one.

ashu1461

Wonder what is the point of this, all these functionalities are available in any third party libraries since ages.

paul_h

I've been griping about html's select for some tome - https://paulhammant.com/2013/01/31/appdev-glass-ceiling-revi... - great news

Sateeshm

What's the point of Chrome-only css.

err4nt

The point of Chrome-only CSS (vendor-prefixed features) would be to allow Chrome or any other vendor to expose styling functionality to CSS authors in valid CSS syntax in ways that won't impede future standardization efforts (like writing non-standard CSS would do) or interfere with that same CSS being processed by other vendors.

But this article isn't an example of Chrome-only CSS, this is about a change to the standard select element to make it customizeable in a standard way. It's not fully frozen yet, so they're seeking feedback and still working on it, so if you have input to give about this feature I think they'd welcome it. This blog post was about Chrome introducing experimental support for it, likely so developers can experiment with it and provide more valuable feedback towards its standardization!

chente

Reminds me of when we had to use browser hacks for IE.

zb3

So websites "look better in Chrome", that's what Google wants.. but it's ultimately not good for us, so I hope developers don't fall for this..

bitpush

Why dont you read the article and see for yourself.

> A customizable version of the select element is officially in Stage 2 in the WHATWG, with strong cross-browser interest and a prototype for you to test out from Chrome Canary 130.

zb3

This doesn't change the fact that it will only work in Chrome for a long time before it ships to firefox.

bitpush

[flagged]

LordDragonfang

https://news.ycombinator.com/newsguidelines.html

> Please don't comment on whether someone read an article. "Did you even read the article? It mentions that" can be shortened to "The article mentions that".

drivingmenuts

It's a middle finger to people who try to set some standards and maintain them for a while. Also, a middle finger to accessibility people.

naet

It's absolutely not that- it's an early implementation of a drafted WHATWG standard in the "iteration" phase, put behind a development build and a development flag so people know that it isn't stable and might change and nobody who doesn't explicitly opt in will be affected. This is literally made to allow "people who try to set some standards" to test their proposed standards and iterate on them before finalizing the proposal.

As far as accessibility, the native browser select is almost always going to be more accessible than someone making a custom input using JavaScript so they can add some styling control. Having the native version support basic styling is a big accessibility win IMO, because it disincentives developers from making a less accessible alternative for the sake of matching some design file.

bitpush

The middle finger is for people like you who didnt read the first paragraph.

> A customizable version of the select element is officially in Stage 2 in the WHATWG, with strong cross-browser interest and a prototype for you to test out from Chrome Canary 130.