My 2025 in CSS
- Published on:
- Categories:
- Year in Review 3, CSS 89, Personal 26
- Current music:
- Every Gentle Air —
Under Water, Under Ice
- Current drink:
- Yunnan tea
Intro
For me, 2025 was a much less productive year than 2024 and 2023. A mix of industry and world frustrations, personal issues, and just certain people being mean — all of that made me live on borrowed spoons for most of the year.
Oh well! I am not sure if I will recover fully in 2026, but I’ll try to do what I can. And it is not like 2025 was without its bright sides.
This post is a roundup of everything I wrote about CSS, so if you missed something — it is a good way to catch up!
My Articles and Techniques
Compared to the six articles I published in 2024, I managed to get out only two new ones — both at the beginning of the year. That said, I really like how both of them ended up, and if you missed them — I recommend finding time and reading them. You will likely need a lot of time — my articles do not become shorter — but, I promise, even beyond their premise, they contain many curiosities that I did not see anyone talk about.
-
“Pure CSS Mixin for Displaying Values of Custom Properties”
January 27. This was one of the most complex things I did. Even though it is not strictly practical, I still find myself using it while working on my experiments. It works! While it is based on my 2024’s “Indirect Cyclic Conditions: Prototyping Parametrized CSS Mixins” technique, there are many other small things to learn from the way I wrote this mixin.
-
“Passing Data into SVG: Linked Parameters Workaround”
March 24. In some way, this article was twelve years in the making. This is a topic that is still not solved in the Web Platform, and while there is a spec for it, no browser implemented it yet. There are many moving parts and approaches that I describe in this article. While the overall experimental technique is far from being practical, some of those details can be applied wider.
Some of My Blog Posts
I was unable to return to posting bookmarks, so I wrote fewer posts than in 2024. I still managed to do the whole November challenge, where I wrote one post every day for the whole month, making it the third year I completed it. I find this challenge pretty useful, as it allows getting out some of the things I could not find an opportunity to write about otherwise — especially this time, I managed to share many small but impactful things.
Here are some of these posts that I recommend you to read:
-
“Future-Proofing Indirect Cyclic Conditions”
May 31. This is a follow-up to my “Indirect Cyclic Conditions” article that I already mentioned, in which I had to find a way to fix it to work with the changes in the spec and implementation that broke my technique.
-
June 3. This is also a follow-up, now to my “Captured Custom Properties” post, but now looking at how we could use custom functions in CSS to achieve a similar capturing behavior.
-
November 3. A post in which I name and share a pattern I used for a few years. I continue using it, and highly recommend look at it if you’re planning to work with scroll-driven animations, anchor positioning, and other newer CSS features that require unique identifiers.
-
“Renaming Outer Variables in CSS Functions”
November 4. A post about hidden mini-feature of custom functions. It might not be something very useful in practice, but as we start to experiment with custom functions and mixins more, I believe this will find its use.
-
November 5. A post that names a problem that happens occasionally with CSS, especially when complex build steps are involved.
-
November 6. A post reminding about a not very common CSS property which is yet to become baseline in theory, but which can be already used for many use cases alongside its
-webkit-prefixed version. -
November 7. This one could’ve been an article on my main site, potentially. While the technique itself is not novel, I did not see many people write about it, and I find it returning to it year over year.
-
November 10. While I can’t say I am good at design, over the years I gathered a few barely noticeable design tweaks that, I thought, are worthy to be shared. This is one of them.
-
“Named Container Presence Check”
November 11. A post about how we can check for the presence of some named containers today, while the corresponding native CSS feature for this is not yet available in all browsers.
-
November 12. A fun way to use typed arithmetic for making the
tab-sizeproperty be responsive to some container’s width. -
“Styles For Secondary Interactive Elements”
November 13. Another design tweak, one that I also use for a while, and recommend you to try as well.
-
November 17. A very short post about a small tip for improving the formatting of your code.
-
“Anchoring to a Containing Block”
November 19. A post about one anchor positioning gotcha, where it is not possible to anchor an element to its containing block with absolute positioning, and a workaround that involves fixed positioning and
anchor-scope. -
November 20. A short post about an
@scopeuse case that I expect will be very popular, especially in blogs of those who write about CSS, as it simplifies creating examples for articles a lot! -
November 24. A post about how
inherit()function is now available for testing in Chrome Canary. I expect this function to be tremendously useful once it is in all browsers, as it unlocks some of the API designs and ways to write code that were not possible without complex hacks before. -
November 25. A post about a few ways of making some margins or gaps collapsible to zero without compromising the
max-contentdimension of the element they’re used in. -
November 26. A tiny “fun fact” about how
2px doubleborders are rendered. No interop in sight. -
November 28. Last design tweak I shared this year for increasing the contrast of links compared to the body text style.
CSS Working Group
A big part of my involvement with CSSWG this year was thinking about potential standardisation of the “fit to width” technique.
After my 2024’s article “Fit-to-Width Text: A New Technique”, in April of this year it was resolved to start working on a native CSS feature for it.
There was a lot of valuable feedback from the community, as well as a Google Chrome team’s explainer and experimental implementation, which were followed by more discussions and issues, some of which are still ongoing.
I wrote two blog posts about some of that:
-
“Fit-to-Width Discussions & Feedback”
May 1. A post with my critique of Google’s explainer and a proposal for fixing one of the accessibility issues.
-
“Fit-to-Width Status Update: Prototype and Issues”
October 2. A post with the status update and a list of new CSSWG issues I opened that are related to “fit to width”.
Aside from the above work, I opened a few new CSSWG issues about an array of topics.
-
February 19. In some way, a follow-up to my “Pure CSS Mixin for Displaying Values of Custom Properties” article, in which I did many hacks for trying to understand the type of some custom property.
-
“[css-scoping] Scoping of functions, other name-defining at-rules and custom idents”
February 27. I consider global scoping of idents in CSS to be one of the last issues that require external tooling. While this issue started from an attempt to use
@scopefor this, a more likely direction would be to use a dedicated lexical scoping at-rule, maybe even reuse the@namespace. -
“[css-contain-3] Container Variables”
August 13. We have an ability to name containers with the
container-nameproperty. We have an ability to query custom properties from such named containers. But what if we had an ability to use the values of such custom properties directly with something likecontainer-var()? -
“[css-mixins-1] Expose environmental variables inside apply’s contents block”
August 20. There is currently a lot of work dedicated to native CSS mixins. This issue is about one of their aspects for usage, with passing rules inside mixins when calling them.
-
“[css-inline-3] A property to exclude an element from the baseline calculation”
November 7. There are currently only indirect ways of adjusting the baseline participation of some element. As a part of writing my “Fixing Baselines” post, I opened this issue with a proposal to add a built-in way of handling this.
Aside from these, I participated in some other issues and discussions, and some of my older issues were resolved in CSSWG meetings.
My Browser Bug Reports
With this year not being as productive, there were not as many opportunities to stumble upon bugs. And, in the same way I had fewer spoons for actual experiments, I was unable to find them to report the issues I encountered.
That said, a fun fact: with fifteen bugs reported, they were distributed equally among all browser engines.
Plans for 2026
Since November, I am actively working on a new proper article for my website. It takes a while, mostly due to the necessity to come up with good examples, but I hope the result will be worth it.
I also have material for another big article, though it will likely need a bit more research.
It becomes harder and harder to find “unsolvable” problems and hack the solutions to them, but hey, you never know what you will stumble upon.