Rebuilding a featured news section with modern CSS: Vox news
ishadeed.com
ishadeed.com
That technique of using a style tag to set a CSS var (--horizontal) then using @container tags to shift the UI is really cool.
<div class="c-newspaper__item" style="--horizontal: true;">
<article class="c-card"></article>
</div>
.c-newspaper__item {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 300px) and style(--horizontal: true) {
.c-card {
display: flex;
gap: 1rem;
}
}
Also, as someone who learned CSS in the early 2000s, seeing grid layouts with `grid-template-columns:` etc make life so much easier. Web devs have it easier these days.If you use them, you'll need to show outdated browser warnings for basically all browsers older than September 2022. Your site will be horrifically broken without container query support.
I'm investigating if we want to even do that at my job. That's a pretty steep cost.
This might all be an acceptable trade off depending on one's user base, of course!
They’d also be pretty expensive on the client
<head>
...
<style>
.example {
container-type: inline-size;
}
@container (min-width: 200px) {
h1 {
font-size: 15cqw;
font-family: monospace;
}
}
</style>
</head>
<body>
<div class="example">
<h1>hello world</h1>
</div>
</body>Web dev is way easier now, if all you're trying to do is the same stuff we tried to do in the early 2000s. All the stuff that makes it harder is because we can do some much more now.
As someone who did webdev back in the 2000s and still does it now, I do not agree with this at all. Webdev is easy now. Especially with the development of simpler build systems (esbuild, vite, etc) in the couple of years.
Well you can still make websites with plain HTML and CSS today, and the layout modes (and other niceties like border-radius) that are available today so are much nicer than the ones that were available 20 years AND they work the same in every browser!
20 years ago you were cobbling together layout with tables and floats (you didn't even have `display: inline-block`). And people still wanted vaguely responsive layouts even though there weren't any media queries yet. Plus there were 3-4 major browser engines that you needed to test with, and there were often major differences in both feature support, bugs and layout between them. For example you had to deal with the fact that IE used what is now known as `box-sizing: border-box` while other browsers used `box-sizing: content-box`, and the fact that browsers didn't even parse HTML consistently you could easily end up with different node tree in different browsers.
That's because there's only one (alright, two) browsers.
Combine that with the fact that loops and objects don’t have fantastic support, if any, and it’s no wonder everyone and their mother has tried their hand at a templating framework. (WebComponents exist, but fall into a lot of the same traps; I didn’t like what I saw in the MDN tutorial.)
If you want to build something you build back in the 2000s, its so much easier than it was back then.
<div class="c-newspaper__item display-flex gap-1rem">
<article class="c-card"></article>
</div>
.display-flex {
display: flex;
}
.gap-1rem {
gap: 1rem;
}That sounds like using a feature for the sake of using a feature. Couldn't the same be done with a class on the container?
Whilst it works, and the presented code is certainly clean enough, it could be argued that such techniques are not really true modern CSS, something flex based would likely be the true modern way.
See, for example, the approach taken by Every Layout: https://every-layout.dev/layouts/sidebar/
Also, all browsers these days just do a fancy page zoom instead of directly manipulating font size. It's a much better setup than what we had to do in days of yore, e.g. using different units on different properties so that things didn't fall apart on size increase.
This is very not true. Hit Alt V Z T in Firefox, for example. It's even on WebAIM's accessibility checklist (https://webaim.org/resources/evalquickref/#scaling), which makes it important: that list is very selective.
Microsoft Edge on Windows 10 has at least three different kinds of zoom, depending on which input device you use to trigger it. (Multiple types of zoom: good. None of the keyboard / mouse / touchpad bindings doing the same? Bad.)
For good reason: using rems or ems in sizing values will cause "text only" zoom to do a good bit more than what's on the tin. WebAIM doesn't require it, and only recommends – which is more than I would say, at any rate. It's simply more trouble than it's worth.
Sometimes change for the sake of using the latest bleeding edge thing isn't really worth it.
The main goal of this is to explore the potential of modern CSS in building such a layout. I agree that some of the features aren't supported yet, but that will become better over time. The article shed light on things like container queries, fluid sizing.. etc.
• Container queries have less than a year’s support in any browser;
• Style container queries have only an incomplete implementation in Chromium for a month;
• :has() isn’t in Firefox yet and has been in other browsers for a year at most.
That is: you can’t actually depend on these features yet.
If you want to serve content to human people and not just to eyes or wallets then at least be aware that most modern browser share statistics collected with JS don't reflect the reality you'd see in your webserver logs.
I don't think the demographic is realistically relevant.
Of humans that deliberately disable JS, certainly going to be under 0.1%. (I’m one of them, incidentally, because on average it makes the web much better, lighter and faster.)
Of humans where various JS doesn’t run, due to having an older browser, a corporate proxy that blocks some things, a content blocker like uBlock Origin that incidentally blats your script, unreliable network conditions, and more things… well, that number is regularly quite a lot higher than 0.1%, often above 1%.
As for something like the Statcounter tracker, which these specific stats are built from, their methodology is obviously stupidly broken and has been for many years: ad blockers will tend to block it. (uBlock Origin does by default, and I expect others to as well.) And that number is generally agreed to be well above 10% (some say as high as 40%, though I’m sceptical of that), and heavily overrepresents users of less common browsers like Firefox.
97.23% of internet users do not care.
If you are arguing to not use Working Draft mechanisms in production environments (and you probably are), yes you have a point. Better safe than sorry, it's called a Working Draft for a reason.
But if you are arguing to not use something because Firefox (and only Firefox) does not support it, you are going to have a fun time trying to convince most webdevs to care about just 2.77% of all internet users.
You're essentially saying "I want to use this months old API, and fuck you if you still have a browser from last year." People used to respect some amount of backward compatibility.
There's no reason to "respect" backwards compatibility in an inherently online product that auto-updates.
There's nothing ideological here, it's just about being practical.
And neither Firefox nor Chrome self-updated beyond a certain point on my few years old Android tablet, which is still generally very usable for browsing and YouTube.
And the browser on one of my phones stopped updating, once the OS stopped getting upgrades, for about 2 years before I stopped using that phone (because there was nothing as good as it to upgrade to).
Non-latest browsers are a small percentage of users, but it's a myth some site designers believe that all Chrome, Firefox and Safari installs auto-update to latest versions except where the user decided for themselves to block updates.
To the owner of devices in generally great shape, that work fine with alnost all sites, sites designed with the bleeding-edge assunption can feel a bit "unnecessarily buy a new version of the exact same electronics with your copious spare cash and litter some e-waste landfill to view our content today!".
Site designer's choice of course.
But it's a myth that the current mainstrean browsers stay up to date by default for everyone who doesn't disable it. Some users can't update. This should particularly be in the awareness of designers wanting sites to be readable by people without much disposable income, or some accessibility issues.
So users in that situation should not be punished by web devs who only support the bleeding edge browser versions.
When 90% of users are on the newest version within a couple weeks, that's not "bleeding edge". It's mainstream.
You're also opening yourself up to security vulnerabilities as you browse.
If you turn off auto update, it's up to you to accept the consequences of both security risks and of sites breaking.
you say that like I am the only person who does this.
> When 90% of users are on the newest version within a couple weeks, that's not "bleeding edge".
[citation needed]
Essentially, yes: https://caniuse.com/usage-table
But in this day and age of browsers being Chrome and Chrome and Chrome and Chrome and Safari, all with forced autoupdates, there's little practical weight behind "browser <X> doesn't support it!". If Chrome supports it, the internet supports it whether any of us like it or not.
I think, regrettably, that 2023 might be roughly the time where the "old browser" support consideration is finally put to bed.
For example, you no doubt have to perform all sorts of code contortions to make things work in old Internet Exploder. It means you have to use old coding methods compared to things that are quicker and easier to implement and get working cross-browser & cross-platform in modern CSS. It also means you are writing more LOC, which means more scope for weird little bugs and time-consuming troubleshooting.
Secondly (and perhaps more importantly), making things work in old browsers means you are removing further incentive for people to upgrade. Given the increasing prevalence of browser-based attacks where people can be pwned simply by visiting a website that contains "specially crafted code", I think the quicker everyone gets onto modern browsers the better...
Unsurprisingly we’ve had 0 issues asking our customers to use recent versions of Chrome/Edge/Firefox/Safari. Obviously not using super new APIs like @container before they are fully read on these 4 but still that’s still basically every modern feature.
Isn't it a deliberate choice to have that experience?
Unless you're in an industry that requires not upgrading, backward compatibility is great, up until a point.
But this means my glibc is also an old version. And this OS was released before docker existed in repos (and has no docker support). So I'm using an older brower with JS completely disabled. It displays HTML, text, images, etc pretty well. It's just the for-profit sites that used to cause problems. But now everyone is cargo culting the for-profit stacks, devs are expecting updates to browsers every 2 weeks, and it's getting harder for me.
So yeah, I expect it to be hard. But also, people have legitimate reasons for using old software.
Its not. Its just that many developers have stopped caring about it. Google is releasing new APIs at a ridiculous pace, many of which are not needed for a huge chunk of websites. if developers want, they can avoid using newer APIs, or use them but add fallbacks for older browsers.
> for anything other than Opera.
sure, if you look at the current version of major browsers, support is pretty good for everything. but some users are locked to an old version, either out of personal preference, or work mandates. so its helpful if web developers dont use assume everyone is one the latest browser version. they dont need to support every version of every browser, but I think its reasonable to expect a two year old browser to work with most current websites, and more and more that is not the case.
Worse is that Google demonstrably has no qualms about leaving beta-quality implementations of new APIs in place for months or even years or about forcibly retiring APIs it decides shouldn't be there any more. It has done both of those things many times including with widely used functionality. Don't like it? Sorry guys but you should have been on the pre-alpha-might-release-it-one-day channel so you had a few weeks of notice to rewrite your entire style sheet.
Following one dominant browser at the expense of open standards is exactly how we got years of stagnation with IE6. Those of us who remember that period have no desire to see another like it. But those who do not learn from history...
I just went thru a similar page redesign and your layout experience resonate with mine. totally agree flex is probably the most overkilling choice here.
I end up not go with grid but old pal float in 3 col view, mainly bc my use case is not typical [L, M, R] -> [L, M/R] -> [L/M/R] layout pattern, but more complex [L1/L2, M, R1/R2] -> [L1/R1/L2/M/R2], and the variable height of each part make the height attribute very difficult to manage in 3 col view.
The last thing is mixins/functions, but not sure if there's an RFC for that.
Then we went through 25 years of dark ages where there were plenty of really great ideas for layout which were completely lost to horrible and competing and half-assed executions.
We are now finally in the golden age of layout where I can make something that looks great on all displays if I have the time and talent to do it. Sadly that is in short supply.
I think we have Chrome to thank for modern web design. Once the browser competition was completely and utterly crushed and everyone was forced to sign on to The One True Layout Engine the benevolent dictators at Google set things on the right path.
There are still edges cases (which JPEG replacement will win?!), but they are now blessedly few and far between.
I think it's less the dominance of Chrome itself and more the demise of Internet Explorer. The problem was that it didn't get updated like normal software, it was somehow tied to the OS, so old outdated versions lingered around for far too long, limiting what technologies web developers could use.
> There are still edges cases (which JPEG replacement will win?!), but they are now blessedly few and far between.
Last I heard was that the Benevolent Dictators at Google decided that AVIF shall win.
Now that mantle is taken up by Safari, especially on mobile.
There's perfectly functional iPads out there that are stuck on an iOS version and are thus e-waste as more and more Internet becomes inaccessible to them.
And let me take the opportunity to diss the failure that is mixing your styles into your layout with Tailwind and it's endless and illegible bloat of unreadable html.
Reading the bloated HTML is less painful than dealing with all the cascading crap.
Not to beat a dead horse, but:
Separation of concerns != separation of languages
If you want to change a button, ideally you go to your one BUTTON FILE.
Same applies doubly so when using Tailwind. You should not be looking around CSS files
Extra strong bold headline with super thin text for the body.