<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: progressive-enhancement</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/progressive-enhancement.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-11-30T14:32:11+00:00</updated><author><name>Simon Willison</name></author><entry><title>Quoting Rodrigo Arias Mallo</title><link href="https://simonwillison.net/2025/Nov/30/rodrigo-arias-mallo/#atom-tag" rel="alternate"/><published>2025-11-30T14:32:11+00:00</published><updated>2025-11-30T14:32:11+00:00</updated><id>https://simonwillison.net/2025/Nov/30/rodrigo-arias-mallo/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://dillo-browser.org/news/migration-from-github/"&gt;&lt;p&gt;The most annoying problem is that the [GitHub] frontend barely works without JavaScript, so we cannot open issues, pull requests, source code or CI logs in Dillo itself, despite them being mostly plain HTML, which I don't think is acceptable. In the past, it used to gracefully degrade without enforcing JavaScript, but now it doesn't.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://dillo-browser.org/news/migration-from-github/"&gt;Rodrigo Arias Mallo&lt;/a&gt;, Migrating Dillo from GitHub&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="github"/><category term="progressive-enhancement"/></entry><entry><title>Building Websites With Lots of Little HTML Pages</title><link href="https://simonwillison.net/2025/Mar/10/building-websites-with-llms/#atom-tag" rel="alternate"/><published>2025-03-10T00:38:32+00:00</published><updated>2025-03-10T00:38:32+00:00</updated><id>https://simonwillison.net/2025/Mar/10/building-websites-with-llms/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.jim-nielsen.com/2025/lots-of-little-html-pages/"&gt;Building Websites With Lots of Little HTML Pages&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jim Nielsen coins a confusing new acronym - LLMS for (L)ots of (L)ittle ht(M)l page(S). He's using this to describe his latest site refresh which makes extensive use of &lt;a href="https://developer.chrome.com/docs/web-platform/view-transitions/cross-document"&gt;cross-document view transitions&lt;/a&gt; - a fabulous new progressive enhancement CSS technique that's &lt;a href="https://caniuse.com/view-transitions"&gt;supported&lt;/a&gt; in Chrome and Safari (and hopefully soon &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1823896"&gt;in Firefox&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With cross-document view transitions getting broader and broader support, I’m realizing that building in-page, progressively-enhanced interactions is more work than simply building two HTML pages and linking them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jim now has small static pages powering his home page filtering interface and even his navigation menu, with CSS view transitions configured to smoothly animate between the pages. I think it feels really good - here's what it looked like for me in Chrome (it looked the same both with and without JavaScript disabled):&lt;/p&gt;
&lt;p&gt;&lt;img alt="Animated demo - clicking the tabs to swap between Latest, Trending and Hacker News Hits rearranges the list of posts in a smooth animation, then navigating to a post causes its title to enlarge and move to the top while the rest of the article loads in." src="https://static.simonwillison.net/static/2025/llms-demo.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Watching the network panel in my browser, most of these pages are 17-20KB gzipped (~45KB after they've decompressed). No wonder it feels so snappy.&lt;/p&gt;
&lt;p&gt;I poked around &lt;a href="https://blog.jim-nielsen.com/styles.css"&gt;in Jim's CSS&lt;/a&gt; and found this relevant code:&lt;/p&gt;
&lt;div class="highlight highlight-source-css"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;@view-transition&lt;/span&gt; {
  &lt;span class="pl-c1"&gt;navigation&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; auto;
}

.&lt;span class="pl-c1"&gt;posts-nav&lt;/span&gt; &lt;span class="pl-ent"&gt;a&lt;/span&gt;[&lt;span class="pl-c1"&gt;aria-current&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;"page"&lt;/span&gt;]&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;not&lt;/span&gt;(&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;last-child&lt;/span&gt;)&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;after&lt;/span&gt; {
  &lt;span class="pl-c1"&gt;border-color&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-en"&gt;var&lt;/span&gt;(&lt;span class="pl-s1"&gt;--c-text&lt;/span&gt;);
  &lt;span class="pl-c1"&gt;view-transition-name&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; posts-nav;
}

&lt;span class="pl-c"&gt;/* Old stuff going out */&lt;/span&gt;
::&lt;span class="pl-c1"&gt;view-transition-old&lt;/span&gt;(&lt;span class="pl-ent"&gt;posts-nav&lt;/span&gt;) {
  &lt;span class="pl-c1"&gt;animation&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; fade &lt;span class="pl-c1"&gt;0.2&lt;span class="pl-smi"&gt;s&lt;/span&gt;&lt;/span&gt; linear forwards;
  &lt;span class="pl-c"&gt;/* &lt;a href="https://jakearchibald.com/2024/view-transitions-handling-aspect-ratio-changes/"&gt;https://jakearchibald.com/2024/view-transitions-handling-aspect-ratio-changes/&lt;/a&gt; */&lt;/span&gt;
  &lt;span class="pl-c1"&gt;height&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;100&lt;span class="pl-smi"&gt;%&lt;/span&gt;&lt;/span&gt;;
}

&lt;span class="pl-c"&gt;/* New stuff coming in */&lt;/span&gt;
::&lt;span class="pl-c1"&gt;view-transition-new&lt;/span&gt;(&lt;span class="pl-ent"&gt;posts-nav&lt;/span&gt;) {
  &lt;span class="pl-c1"&gt;animation&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; fade &lt;span class="pl-c1"&gt;0.3&lt;span class="pl-smi"&gt;s&lt;/span&gt;&lt;/span&gt; linear reverse;
  &lt;span class="pl-c1"&gt;height&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;100&lt;span class="pl-smi"&gt;%&lt;/span&gt;&lt;/span&gt;;
}

&lt;span class="pl-k"&gt;@keyframes&lt;/span&gt; fade {
  &lt;span class="pl-k"&gt;from&lt;/span&gt; {
    &lt;span class="pl-c1"&gt;opacity&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;1&lt;/span&gt;;
  }
  &lt;span class="pl-k"&gt;to&lt;/span&gt; {
    &lt;span class="pl-c1"&gt;opacity&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;0&lt;/span&gt;;
  }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Jim observes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This really feels like a game-changer for simple sites. If you can keep your site simple, it’s easier to build traditional, JavaScript-powered on-page interactions as small, linked HTML pages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've experimented with view transitions for &lt;a href="https://datasette.io/"&gt;Datasette&lt;/a&gt; in the past and the results were very promising. Maybe I'll pick that up again.&lt;/p&gt;
&lt;p&gt;Bonus: Jim has a &lt;a href="https://lobste.rs/s/csr4mw/building_websites_with_lots_little_html#c_ncxssq"&gt;clever JavaScript trick&lt;/a&gt; to avoid clicks to the navigation menu being added to the browser's history in the default case.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://lobste.rs/s/csr4mw/building_websites_with_lots_little_html"&gt;lobste.rs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/view-transitions"&gt;view-transitions&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="progressive-enhancement"/><category term="view-transitions"/></entry><entry><title>Quoting GOV.UK service manual</title><link href="https://simonwillison.net/2024/Sep/29/govuk-service-manual/#atom-tag" rel="alternate"/><published>2024-09-29T00:32:10+00:00</published><updated>2024-09-29T00:32:10+00:00</updated><id>https://simonwillison.net/2024/Sep/29/govuk-service-manual/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://www.gov.uk/service-manual/technology/using-progressive-enhancement"&gt;&lt;p&gt;If you use a JavaScript framework you should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;be able to justify with evidence, how using JavaScript would benefit users&lt;/li&gt;
&lt;li&gt;be aware of any negative impacts and be able to mitigate them&lt;/li&gt;
&lt;li&gt;consider whether the benefits of using it outweigh the potential problems&lt;/li&gt;
&lt;li&gt;only use the framework for parts of the user interface that cannot be built using HTML and CSS alone&lt;/li&gt;
&lt;li&gt;design each part of the user interface as a separate component&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having separate components means that if the JavaScript fails to load, it will only be that single component that fails. The rest of the page will load as normal.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.gov.uk/service-manual/technology/using-progressive-enhancement"&gt;GOV.UK service manual&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gov-uk"&gt;gov-uk&lt;/a&gt;&lt;/p&gt;



</summary><category term="javascript"/><category term="progressive-enhancement"/><category term="gov-uk"/></entry><entry><title>Reckoning</title><link href="https://simonwillison.net/2024/Aug/18/reckoning/#atom-tag" rel="alternate"/><published>2024-08-18T16:37:41+00:00</published><updated>2024-08-18T16:37:41+00:00</updated><id>https://simonwillison.net/2024/Aug/18/reckoning/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://infrequently.org/series/reckoning/"&gt;Reckoning&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Alex Russell is a self-confessed &lt;a href="https://en.wikipedia.org/wiki/Cassandra"&gt;Cassandra&lt;/a&gt; - doomed to speak truth that the wider Web industry stubbornly ignores. With this latest series of posts he is &lt;em&gt;spitting fire&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The series is an "investigation into JavaScript-first frontend culture and how it broke US public services", in four parts.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://infrequently.org/2024/08/object-lesson/"&gt;Part 2 — Object Lesson&lt;/a&gt; Alex profiles &lt;a href="https://benefitscal.com/"&gt;BenefitsCal&lt;/a&gt;, the California state portal for accessing SNAP food benefits (aka "food stamps"). On a 9Mbps connection, as can be expected in rural parts of California with populations most likely to need these services, the site takes 29.5 seconds to become usefully interactive, fetching more than 20MB of JavaScript (which isn't even correctly compressed) for a giant SPA that incoroprates React, Vue, the AWS JavaScript SDK, six user-agent parsing libraries and &lt;a href="https://infrequently.org/2024/08/object-lesson/#fn-receipts-1"&gt;a whole lot more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It doesn't have to be like this! &lt;a href="https://www.getcalfresh.org/"&gt;GetCalFresh.org&lt;/a&gt;, the Code for America alternative to BenefitsCal, becomes interactive after 4 seconds. Despite not being the "official" site it has driven nearly half of all signups for California benefits.&lt;/p&gt;
&lt;p&gt;The fundamental problem here is the Web industry's obsession with SPAs and JavaScript-first development - techniques that make sense for a tiny fraction of applications (Alex &lt;a href="https://infrequently.org/2024/08/caprock/"&gt;calls out&lt;/a&gt; document editors, chat and videoconferencing and maps, geospatial, and BI visualisations as apppropriate applications) but massively increase the cost and complexity for the vast majority of sites - especially sites primarily used on mobile and that shouldn't expect lengthy session times or multiple repeat visits.&lt;/p&gt;
&lt;p&gt;There's so much great, quotable content in here. Don't miss out on the footnotes, like &lt;a href="https://infrequently.org/2024/08/caprock/#fn-omerta-as-market-failure-3"&gt;this one&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The JavaScript community's omertà regarding the consistent failure of frontend frameworks to deliver reasonable results at acceptable cost is likely to be remembered as one of the most shameful aspects of frontend's lost decade.&lt;/p&gt;
&lt;p&gt;Had the risks been prominently signposted, dozens of teams I've worked with personally could have avoided months of painful remediation, and hundreds more sites I've traced could have avoided material revenue losses.&lt;/p&gt;
&lt;p&gt;Too many engineering leaders have found their teams beached and unproductive for no reason other than the JavaScript community's dedication to a marketing-over-results ethos of toxic positivity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In &lt;a href="https://infrequently.org/2024/08/the-way-out/"&gt;Part 4 — The Way Out&lt;/a&gt; Alex recommends the &lt;a href="https://www.gov.uk/service-manual"&gt;gov.uk Service Manual&lt;/a&gt; as a guide for building civic Web services that avoid these traps, thanks to the policy described in their &lt;a href="https://www.gov.uk/service-manual/technology/using-progressive-enhancement"&gt;Building a resilient frontend using progressive enhancement&lt;/a&gt; document.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/accessibility"&gt;accessibility&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/alex-russell"&gt;alex-russell&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/government"&gt;government&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html"&gt;html&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-performance"&gt;web-performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gov-uk"&gt;gov-uk&lt;/a&gt;&lt;/p&gt;



</summary><category term="accessibility"/><category term="alex-russell"/><category term="government"/><category term="html"/><category term="javascript"/><category term="progressive-enhancement"/><category term="web-performance"/><category term="gov-uk"/></entry><entry><title>My approach to HTML web components</title><link href="https://simonwillison.net/2024/Apr/30/approach-to-html-web-components/#atom-tag" rel="alternate"/><published>2024-04-30T11:02:48+00:00</published><updated>2024-04-30T11:02:48+00:00</updated><id>https://simonwillison.net/2024/Apr/30/approach-to-html-web-components/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://adactio.com/journal/21078"&gt;My approach to HTML web components&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Some neat patterns here from Jeremy Keith, who is using Web Components extensively for progressive enhancement of existing markup.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The reactivity you get with full-on frameworks [like React and Vue] isn’t something that web components offer. But I do think web components can replace jQuery and other approaches to scripting the DOM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeremy likes naming components with their element as a prefix (since all element names must contain at least one hyphen), and suggests building components under the single responsibility principle - so you can do things like &lt;code&gt;&amp;lt;button-confirm&amp;gt;&amp;lt;button-clipboard&amp;gt;&amp;lt;button&amp;gt;...&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;He configures these buttons with &lt;code&gt;data-&lt;/code&gt; attributes and has them communicate with each other using custom events.&lt;/p&gt;
&lt;p&gt;Something I hadn't realized is that since the &lt;code&gt;connectedCallback&lt;/code&gt; function on a custom element is fired any time that element is attached to a page you can &lt;code&gt;fetch()&lt;/code&gt; and then &lt;code&gt;insertHTML&lt;/code&gt; content that includes elements and know that they will initialize themselves without needing any extra logic - great for the kind of pattern encourages by systems such as &lt;a href="https://htmx.org/"&gt;HTMX&lt;/a&gt;.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeremy-keith"&gt;jeremy-keith&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-components"&gt;web-components&lt;/a&gt;&lt;/p&gt;



</summary><category term="javascript"/><category term="jeremy-keith"/><category term="progressive-enhancement"/><category term="web-components"/></entry><entry><title>How we built JSR</title><link href="https://simonwillison.net/2024/Apr/12/how-we-built-jsr/#atom-tag" rel="alternate"/><published>2024-04-12T15:49:03+00:00</published><updated>2024-04-12T15:49:03+00:00</updated><id>https://simonwillison.net/2024/Apr/12/how-we-built-jsr/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://deno.com/blog/how-we-built-jsr"&gt;How we built JSR&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Really interesting deep dive by Luca Casonato into the engineering behind the new JSR alternative JavaScript package registry launched recently by Deno.&lt;/p&gt;

&lt;p&gt;The backend uses PostgreSQL and a Rust API server hosted on Google Cloud Run.&lt;/p&gt;

&lt;p&gt;The frontend uses Fresh, Deno’s own server-side JavaScript framework which leans heavily in the concept of “islands”—a progressive enhancement technique where pages are rendered on the server and small islands of interactivity are added once the page has loaded.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=40013620"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/postgresql"&gt;postgresql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rust"&gt;rust&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/deno"&gt;deno&lt;/a&gt;&lt;/p&gt;



</summary><category term="javascript"/><category term="postgresql"/><category term="progressive-enhancement"/><category term="rust"/><category term="deno"/></entry><entry><title>HTML Web Components: An Example</title><link href="https://simonwillison.net/2023/Nov/17/html-web-components-an-example/#atom-tag" rel="alternate"/><published>2023-11-17T16:33:24+00:00</published><updated>2023-11-17T16:33:24+00:00</updated><id>https://simonwillison.net/2023/Nov/17/html-web-components-an-example/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.jim-nielsen.com/2023/html-web-components-an-example/"&gt;HTML Web Components: An Example&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jim Nielsen provides a clear example illustrating the idea of the recently coined "HTML Web Components" pattern. It's Web Components as progressive enhancement: in this example a &lt;code&gt;&amp;lt;user-avatar&amp;gt;&lt;/code&gt; custom element wraps a regular image, then JavaScript defines a Web Component that enhances that image. If the JavaScript fails to load the image still displays.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=38298694"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-components"&gt;web-components&lt;/a&gt;&lt;/p&gt;



</summary><category term="javascript"/><category term="progressive-enhancement"/><category term="web-components"/></entry><entry><title>Responsive Components: a Solution to the Container Queries Problem</title><link href="https://simonwillison.net/2018/Feb/27/responsive-components/#atom-tag" rel="alternate"/><published>2018-02-27T13:21:27+00:00</published><updated>2018-02-27T13:21:27+00:00</updated><id>https://simonwillison.net/2018/Feb/27/responsive-components/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://philipwalton.com/articles/responsive-components-a-solution-to-the-container-queries-problem/"&gt;Responsive Components: a Solution to the Container Queries Problem&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Philip Walton uses Chrome’s new ResizeObserver API (best described as document.onresize for elements, currently a W3C Editor’s Draft, not yet supported by other browsers) to implement a media-query style mechanism for applying CSS based on the size of the parent container. This is really clever. In the absence of ResizeObserver (which can be polyfilled) it can fall back to showing the narrowest design, which is probably best for mobile anyway. Desktop browsers are better equipped to run the polyfill.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/philwalton/status/968418642613346306"&gt;@philwalton&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mediaqueries"&gt;mediaqueries&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/polyfill"&gt;polyfill&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="mediaqueries"/><category term="progressive-enhancement"/><category term="polyfill"/></entry><entry><title>What are all the advantages of jQuery?</title><link href="https://simonwillison.net/2010/Oct/27/what-are-all-the/#atom-tag" rel="alternate"/><published>2010-10-27T16:35:00+00:00</published><updated>2010-10-27T16:35:00+00:00</updated><id>https://simonwillison.net/2010/Oct/27/what-are-all-the/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-are-all-the-advantages-of-jQuery?no_redirect=1"&gt;What are all the advantages of jQuery?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;jQuery's API is astonishingly well designed. It's extremely consistent once you learn its rules (e.g. methods often take one argument to read a value and two arguments to set one, e.g. .css(), .attr(), .width(), .height()) and its functionality is so complete that the last few major releases of the library have hardly added any new methods at all.&lt;/p&gt;

&lt;p&gt;jQuery's performance improves noticeably with every release, with the API staying exactly the same.&lt;/p&gt;

&lt;p&gt;jQuery plays extremely well with other code. It doesn't extend any built-in JavaScript objects, and it only adds one symbol to the global namespace (the jQuery symbol) - it aliases $ as well, but you can undo that with jQuery.noConflict().&lt;/p&gt;

&lt;p&gt;Even discounting browser differences, jQuery is an enormous improvement on the DOM. It makes DOM manipulation extremely easy, which means it's much easier to implement things using progressive enhancement - taking existing DOM elements on the page and enhancing their behaviour.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="jquery"/><category term="progressive-enhancement"/><category term="quora"/></entry><entry><title>Official Google Webmaster Blog: A proposal for making AJAX crawlable</title><link href="https://simonwillison.net/2009/Oct/8/horrible/#atom-tag" rel="alternate"/><published>2009-10-08T17:52:31+00:00</published><updated>2009-10-08T17:52:31+00:00</updated><id>https://simonwillison.net/2009/Oct/8/horrible/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://googlewebmastercentral.blogspot.com/2009/10/proposal-for-making-ajax-crawlable.html"&gt;Official Google Webmaster Blog: A proposal for making AJAX crawlable&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
It's horrible! The Google crawler would map &lt;code&gt;url#!state&lt;/code&gt; to &lt;code&gt;url?_escaped_fragment_=state&lt;/code&gt;, then expect your site to provide rendered HTML that reflects that state (they even go as far as to suggest running a headless browser within your web server to do this). Just stick to progressive enhancement instead, it's far less hideous. It looks like the proposal may have originated with the GWT team.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crawling"&gt;crawling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gwt"&gt;gwt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/search-engines"&gt;search-engines&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/seo"&gt;seo&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="crawling"/><category term="google"/><category term="gwt"/><category term="javascript"/><category term="progressive-enhancement"/><category term="search-engines"/><category term="seo"/></entry><entry><title>Capital Radio's London Guide</title><link href="https://simonwillison.net/2008/Aug/29/londonguide/#atom-tag" rel="alternate"/><published>2008-08-29T01:48:30+00:00</published><updated>2008-08-29T01:48:30+00:00</updated><id>https://simonwillison.net/2008/Aug/29/londonguide/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.capitalradio.co.uk/london-guide/"&gt;Capital Radio&amp;#x27;s London Guide&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Worth pointing out: the search / map interface on this page is one of the best examples of progressive enhancement I’ve ever seen. Try disabling JavaScript and see what happens. It seems like most developers just can’t be bothered with this kind of attention to detail these days, which disappoints me.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/accessibility"&gt;accessibility&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/capitalradio"&gt;capitalradio&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-maps"&gt;google-maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/londonguide"&gt;londonguide&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/unobtrusive-javascript"&gt;unobtrusive-javascript&lt;/a&gt;&lt;/p&gt;



</summary><category term="accessibility"/><category term="capitalradio"/><category term="google-maps"/><category term="javascript"/><category term="londonguide"/><category term="progressive-enhancement"/><category term="unobtrusive-javascript"/></entry><entry><title>SWFUpload</title><link href="https://simonwillison.net/2007/May/16/upload/#atom-tag" rel="alternate"/><published>2007-05-16T16:12:45+00:00</published><updated>2007-05-16T16:12:45+00:00</updated><id>https://simonwillison.net/2007/May/16/upload/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://swfupload.mammon.se/"&gt;SWFUpload&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Fantastic Flash widget for handling multiple file uploads with progress indicators; degrades gracefully to a regular HTML upload field.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/flash"&gt;flash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gracefuldegradation"&gt;gracefuldegradation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/swfupload"&gt;swfupload&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/upload"&gt;upload&lt;/a&gt;&lt;/p&gt;



</summary><category term="flash"/><category term="gracefuldegradation"/><category term="progressive-enhancement"/><category term="swfupload"/><category term="upload"/></entry><entry><title>Neighbourhood Fix-It</title><link href="https://simonwillison.net/2007/Feb/17/fixit/#atom-tag" rel="alternate"/><published>2007-02-17T17:05:24+00:00</published><updated>2007-02-17T17:05:24+00:00</updated><id>https://simonwillison.net/2007/Feb/17/fixit/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.neighbourhoodfixit.com/"&gt;Neighbourhood Fix-It&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Report problems to your council across the UK. The most detailed Ordinance Survey maps anywhere online, and a superb example of progressive enhancement in action—the maps work without JavaScript, and the site even works without images!


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/barcamplondon2"&gt;barcamplondon2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/maps"&gt;maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/matthew-somerville"&gt;matthew-somerville&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mysociety"&gt;mysociety&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;&lt;/p&gt;



</summary><category term="barcamplondon2"/><category term="javascript"/><category term="maps"/><category term="matthew-somerville"/><category term="mysociety"/><category term="progressive-enhancement"/></entry></feed>