The joy of handwriting CSS
==========================
2020-01-22
Today I came across PurgeCSS [1]: a tool that allows you to
rid your website of unused stylesheet rules. It seems to be
very useful if you're knee-deep in external CSS
dependencies, brought in by the various frameworks and
plugins used in websites these days. But preferably you
don't need a tool like this at all. This need is typical of
the way modern web development is often conducted. You're
slapdash gluing a bunch of tools and libraries together. Mix
it with your CSS framework of choice, say Bootstrap or
Tailwind and after a bit of development you end up with a
big ball of stylesheets, often 100kB or more. And that is
when you reach for CSS processors like Less, minifiers and,
yeah, PurgeCSS.
CSS was a godsend when I first started using it in the early
noughties. Before CSS I would design web pages by using
tables, cutting up a design document into small bits and
pieces and carefully fitting them inside the table's cells
and rows. Having CSS and a fixed idea on the size of
people's monitors allowed me to move much quicker. I assumed
a maximum screen width of 980 pixels and I just flew, easily
recreating pretty much any Photoshop design that was thrown
at me.
Unfortunately, or fortunately perhaps, the web grew and so
did the amount of devices and screen sizes I had to support.
At the advent of mobile browsers I could go by with simply
making a wholly separate website running under a "m."
subdomain, and fitting everything inside a much smaller 320
pixels box. This approach was of course not durable at all,
since mobile devices started getting higher and higher
resolutions. That's where the new feature of CSS media
queries came in handy. It allowed me to have one single
"responsive" web design that fitted any browser and things
were well for a while.
After some time web designs started getting even more
complex. Clients started wanting grid layouts, animations
and adaptive designs which offered different layout choices
depending on the screen size and rotation. Fitting all those
needs in the previously handwritten CSS was hard and often
required some JavaScript to assure things went nice and
smoothly. The pressure caused by this evolving web was even
harder on teams. Getting all the wood behind one arrow was
tough. You had to have meetings laying down rules and
approaches to how you would structure your stylesheets.
Thankfully CSS libraries such as Bootstrap started emerging.
They reset browser defaults and contained a large amount of
standards for design elements. Instead of building
everything from the ground up, you could simply reach for
Bootstrap and customize the bits you wanted.
The web however did not stop evolving. I needed to start
supporting parallax effects, nifty sliders with all kinds of
effects and widgets that pop in when you scroll down the
page. I started pulling in even more dependencies to do
these things. Slider libraries for the sliders, parallax
libraries for the parallax effects..etc. They all came with
their own bits of JavaScript and their own CSS. To be able
to fit this all into the overall design, more things had to
be customized. In the meantime the typical "Bootstrap" look
of websites started getting old. You could smell a
Boostrappy site from miles away and without major
modifications they could feel a bit bland.
The effect of all the extra dependencies was also that
load-times of web pages started to go up. Not immediately
noticeable on broadband connections, but surely a problem
when using your smartphone or in other places with lesser
connection speeds. This caused the need for minifiers. I
needed to reduce the amount of web requests done for a page
and this meant fusing all the CSS files into one big file
and minimizing it, making it impossible to read for viewers,
but much nicer to get across a network.
On another level web developers started using
CSS-preprocessors like Less, Sass and Stylus. This allowed
for easier development, adding variables and a better
separation of design parts. What used to be an activity of
simply adding your own styling sauce to a web page, evolved
into a very complex declarative programming of some sort.
The problem with the grown complexity is that CSS wasn't
originally designed for it. I don't blame the designers or
the web browser vendors, since they simply adapted it to the
quickly changing times, but CSS has grown to be a very
complex language. I wouldn't like to think how it would be
to be a junior frontend developer staring at the W3
specifications describing the positioning rules, flexible
box layouts, transforms..etc. I can only imagine this to be
a daunting, almost impossible task if you haven't lived
through the changes one by one.
The complexity of CSS lies in its originally simple design.
It allows you to make selections of HTML elements and states
to which certain styling rules apply. You can append to
earlier rules or override them. The way in which this works
and which rules take precedence is defined in the cascading
order. This cascade starts with browser defaults, appended
by user browser settings and moves up all the way to the
mighty hammer of !important, overriding most things in its
path. The problem with this cascade and the way this works
is that it's pretty hard to keep all the rulesets in your
head. Frankly, with most modern websites, this is utterly
impossible and you have to resort to debugger-driven
development. Using the "inspect element" tool of your web
browser you can figure out which rules apply to which
element and you can try to find out how you could add your
own modifications.
For a software developer this practice would be
unacceptable. Code needs to be understandable to a large
extent. You have to have a pretty good idea about the
effects of your work, otherwise it would drive you mad.
As I see it tools like PurgeCSS are a kind of admission of
defeat. There's so much CSS floating around in our websites
that we don't even know which rules apply anymore. Most of
it is probably brought in by the handy libraries we used and
there's no way of understanding their specific construction.
I really understand why you would reach for such a tool and
I have certainly wanted to use it in the past. Shocked by
the large amount of CSS used by a website and the poor
scores on PageSpeed Insights any sane person would try to
alleviate this.
However, there's also another way. You could scratch the
need for external CSS bloat altogether if you simply refuse
to use those and start writing your own code again. The
development of CSS hasn't stopped and in recent years has
amassed features that were previously either a fools-errand
to implement yourself, or cried out for libraries like
Bootstrap. Things like grids, flexible layouts, parallax
effects, animations, you name it. Pretty much all of those
are supported in CSS3 and you don't have to write hundreds
of lines to get them into your website. I feel that thanks
to the quick-evolving nature of web technology we can get
all the design niceties our clients desire without ending up
with big balls of minified glued stylesheets. That's exactly
the kind of approach I'm going for these days.
One of the many plus sides of being a freelance web
programmer is that I often have a large amount of freedom
picking the tools and languages I want. I'm usually hired to
make most tech decisions myself, not having to fit into the
steady drum beat of prescribed systems, frameworks and
dodging stimulating Scrum sessions with colleagues. Whenever
I can I like to use this freedom to handwrite the CSS for
websites I'm working and this is actually kind of fun.
Calling my own stylesheet shots gives me a very nice and
orderly feeling. I can get the design just right without
first having to go rounds fighting the assumptions of a big
framework. I can also keep the complexity in check, making
sure that I actually understand what the CSS is doing and
where I can find all the bits I need. Sure, cross-browser
compatibility can be a pain, especially when everything has
to show up nicely in Internet Explorer, but it's much easier
to fix the problems you come across when you actually own
the problems.
I like to use semantic HTML tags and pair those with clear
sectioning in my CSS file. Combined with all the nifty
tricks you can pull you can often reach your goals in much
less lines of code. Bootstrap was nice to have around when
building responsive grids yourself was like pulling teeth,
but when flying solo these days, you don't really need it
anymore.
CSS can be quite maddening and frustrating and its
evolutionary design brings a ton of unwanted baggage. Often
it seems like an ill-fit for the types of websites we're
making. However, since an alternative styling language isn't
in the cards and I don't really believe in moving all your
styling to JavaScript logic, we have to make do with the
tools we have if we want to stay in web development.
Instead of giving up and surrendering to the kinds of
Boostrap, Tailwind or Foundation, I believe it's much nicer
to travel this road alone.
So next time you're building a website put on your favorite
trainers and leave the marching bands of external CSS
libraries on the side of the road and you'll find it a much
nicer journey.
Hyperlinks:
[1]:
https://purgecss.com/
-----------------------------------------------------------
Tags: english