惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
月光博客
月光博客
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
人人都是产品经理
人人都是产品经理
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
The Cloudflare Blog
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
Last Week in AI
Last Week in AI

Adactio: Links

How I think Web Apps Should be Installed Native HTML and CSS Features That Replaced JavaScript · Ronalds Vilciņš On artificial intelligence We used to log off Little Websites Everywhere CSS is Still Awesome — jasonsantamaria.com What are we not talking about anymore? An fuireachas le Fleadh Cheoil na hÉireann In Praise of Libraries A website for everyone - The History of the Web Jeffrey Zeldman Presents - Ebb, Meet Flow: Intrinsic Design in a Nutshell - State of the Web Towards a personal online third-space Ordinary Abundance Why We Like Things Against Doomerism Styling the Navigation: Declarative Route and Navigation Matching in CSS Humans did not invent art. It was the other way around | Aeon Essays The Computer That Helped Win World War II Who Will Save the Internet From Disappearing? From human hands. HTMX and Web Components Instead of React Your ‘App’ Could Have Been a Webpage (so I fixed it for you…) The Descent — What Happened to the Frontend While You Weren't Watching Abject Praise - Infrequently Noted Talk: Let Jeffrey Zeldman Presents - Memories Can’t Wait—or, How I Learned to Keep Worrying About the Web - State of the Web The AI Resist List Holes Notes & Narratives Show your hands honor for the strange power they bring you
HTML Can Do That
Chris Burnell · 2026-08-20 · via Adactio: Links

HTML has been gobbling up swathes of what used to be JavaScript’s remit. This page lists a bunch of dynamic functionality that we can now achieve with just HTML.


popover

Available since January 2025
  • Chrome 114+
  • Edge 114+
  • Firefox 125+
  • Opera 100+
  • Safari 17+
  • Chrome Android 114+
  • Firefox for Android 125+
  • Opera Android 76+
  • Safari on iOS 17+
  • Samsung Internet 23+
  • WebView Android 114+

Light dismiss, Esc to close, no managing z-index to wrangle it onto a top later. All managed with popover and popovertarget attributes in HTML. (MDN)

No JavaScript, just modern browser magic, thanks to the wonderful folks speccing for the web and building our browsers!

<button popovertarget="example-popover">Toggle popover</button>
<div id="example-popover" popover>
	<p>No JavaScript, just modern browser magic, thanks to the wonderful folks speccing for the web and building our browsers!</p>
</div>

<dialog>

Available since March 2022
  • Chrome 37+
  • Edge 79+
  • Firefox 98+
  • Opera 24+
  • Safari 15.4+
  • Chrome Android 37+
  • Firefox for Android 98+
  • Opera Android 24+
  • Safari on iOS 15.4+
  • Samsung Internet 3+
  • WebView Android 37+

Similar thing going on as popover here, except this time with a dedicated element for modal dialog boxes. (MDN)

See command / commandFor below for another, more recently-landing feature that allows us to open and close dialog elements (and will be useful for lots of other non-JS functionality, one day!).

Once again the popover attribute is doing some heavy-lifting here!

<button popovertarget="example-dialog">Toggle popover</button>
<dialog id="example-dialog" popover>
	<p>Closed with just HTML via <code>&lt;form method="dialog"&gt;</code>, opened with the <code>popover</code> attribute.</p>
	<button popovertarget="example-dialog" popovertargetaction="hide">Close</button>
</dialog>

You can also control dialog elements with JavaScript like this:

This one is opened with .showModal() and closed with .close(), both called from JavaScript.

<button id="example-dialog-js-open">Open dialog</button>
<dialog id="example-dialog-js">
	<p>This one is opened with <code>.showModal()</code> and closed with <code>.close()</code>, both called from JavaScript.</p>
	<button id="example-dialog-js-close">Close</button>
</dialog>
document.getElementById("example-dialog-js-open").addEventListener("click", () => {
	document.getElementById("example-dialog-js").showModal()
})
document.getElementById("example-dialog-js-close").addEventListener("click", () => {
	document.getElementById("example-dialog-js").close()
})

Grouped <details>

Available since September 2025
  • Chrome 120+
  • Edge 120+
  • Firefox 130+
  • Opera 106+
  • Safari 17.2+
  • Chrome Android 120+
  • Firefox for Android 130+
  • Opera Android 80+
  • Safari on iOS 17.2+
  • Samsung Internet 25+
  • WebView Android 120+

A shared name attribute turns a group of <details> into an exclusive accordion. Open one and the others close automatically. Magic! (MDN)

First

Open the seond one and watch this close on its own.

Second

First one’s hidden now.

<details name="example-group">
	<summary>First</summary>
	<p>Open the seond one and watch this close on its own.</p>
</details>
<details name="example-group">
	<summary>Second</summary>
	<p>First one’s hidden now.</p>
</details>

command & commandfor

Available since December 2025
  • Chrome 135+
  • Edge 135+
  • Firefox 144+
  • Opera 120+
  • Safari 26.2+
  • Chrome Android 135+
  • Firefox for Android 144+
  • Opera Android 89+
  • Safari on iOS 26.2+
  • Samsung Internet 29+
  • WebView Android 135+

Separate HTML buttons controlling one popover. No scripting. (MDN)

Note: So far only show-modal, close, request-close, toggle-popover, show-popover, and hide-popover have landed stable in browsers. We can look forward to invokers supported in the future to increment/decrement values, interact with media elements, copy text, etc.

show-popover opens this and hide-popover closes it!

<button command="show-popover" commandfor="example-command-popover">Open</button>
<button command="hide-popover" commandfor="example-command-popover">Close</button>
<dialog id="example-command-popover" popover>
	<p><code>show-popover</code> opens this and <code>hide-popover</code> closes it!</p>
	<button command="hide-popover" commandfor="example-command-popover">Close</button>
</dialog>

Native input pickers

Available since March 2017
  • Chrome: Colour 20+, Range 4+, Date 20+
  • Edge: Colour 14+, Range 12+, Date 12+
  • Firefox: Colour 29+, Range 23+, Date 57+
  • Opera: Colour 12+, Range 11+, Date 11+
  • Safari: Colour 12.1+, Range 3.1+, Date 14.1+
  • Chrome Android: Colour 25+, Range 57+, Date 25+
  • Firefox for Android: Colour 27+, Range 52+, Date 57+
  • Opera Android: Colour 12+, Range 11+, Date 11+
  • Safari on iOS: Colour 12.2+, Range 5+, Date 5+
  • Samsung Internet: Colour 1.5+, Range 7+, Date 1.5+
  • WebView Android: Colour 4.4+, Range 4.4+, Date 4.4+

Colour, range, and date pickers, built right into the browser. (MDN: Color Input, MDN: Range Input, MDN: Color Input)

Note: Your mileage may vary with these elements; although, hand-written JS solutions also tend to vary wildly, and I think we can expect form elements to receive more love over the coming years. I would honestly tread very carefully with using some of these. Be wary of (the many) accessibility pitfalls!

Colour

Range

Date

<label>Colour <input type="color" value="#5f8aa6" autocomplete="off"></label>
<label>Range <input type="range" min="0" max="100" value="50" autocomplete="off"></label>
<label>Date <input type="date" autocomplete="off"></label>

<datalist>

Available since March 2019
  • Chrome 20+
  • Edge 12+
  • Firefox 4+
  • Opera 9.5+
  • Safari 12.1+
  • Chrome Android 33+
  • Firefox for Android 79+
  • Opera Android 20+
  • Safari on iOS 12.2+
  • Samsung Internet 2+
  • WebView Android 4.4.3+

Native autocomplete suggestions, no dropdown library required. (MDN)

Note: This isn’t yet supported across the board with all input types, e.g. colour or date inputs.

Note: Unfortunately, this also has a number of issues in its implementation in browsers. See Adrian Roselli’s Under-Engineered Comboboxen for more details.

Favourite HTML element
<label>Favourite HTML element <input type="text" id="example-datalist-input" list="example-datalist" autocomplete="off"></label>
<datalist id="example-datalist">
	<option value="a">
	<option value="abbr">
	<option value="address">
	<!-- ... -->
</datalist>

loading="lazy"

Available since March 2022
  • Chrome 77+
  • Edge 79+
  • Firefox 75+
  • Opera 64+
  • Safari 15.4+
  • Chrome Android 77+
  • Firefox for Android 79+
  • Opera Android 55+
  • Safari on iOS 15.4+
  • Samsung Internet 12+
  • WebView Android 77+

This image defers loading until it’s near the viewport. Not an IntersectionObserver in sight. (MDN)

Chris Burnell’s avatar.
<img src="/images/avatar@2x.jpeg" loading="lazy" width="200" height="200" alt="Chris Burnell’s avatar.">

hidden until-found

Available since December 2025
  • Chrome 102+
  • Edge 102+
  • Firefox 148+
  • Opera 88+
  • Safari 26.2+
  • Chrome Android 102+
  • Firefox for Android 148+
  • Opera Android 70+
  • Safari on iOS 26.2+
  • Samsung Internet 19+
  • WebView Android 102+

Navigating to the fragment link below reveals the hidden section. The browser automatically removes hidden="until-found". (MDN)

Again, this one’s still pretty new and only really plays nicely with browser default search, and not so well with screen reader search implementations, for example. Still, one to keep in the back pocket!

Jump to hidden content
<a href="#example-until-found">Jump to hidden content</a>
<div id="example-until-found" hidden="until-found">
	<p>Yahaha! You found me!</p>
</div>

Built by Chris Burnell for HTML Day 2026 during the Online Event run by Zachary Kai on .