Show HN: CSS ICON, an icon set crafted by pure CSS
cssicon.space
cssicon.space
Slightly OT, but the codepen highlighting of the various steps taken is incredibly intuitive, and does a great job of visualising how these icons are built up.
However, it does highlight (for me personally), the abuse of the before and after pseudo elements; Essentially it is giving you three layers, great. Want 4, add another sub-element in your html (<i>) and you get three more.
Whilst a neat trick, how this is better than having a contained icon in say SVG?
Is that really part of Codepen though? I thought it was something the author had done manually.
in the intro youtube video I said more about that. But to be honest, I just had a lot of fun dealing with the constraints that comes with css and loved the creating process, I spent a few weekends keeping designing and coding those tiny icons and skipped a lot of sleeping and still had fun.
CSS icons may be slightly slower than an optimized SVG due to the overhead of restyling and layout. Also, the browser-side painting may be a bit slower for CSS icons, because border painting involves fairly complex logic compared to drawing a path (and for example in Gecko you have to construct display list items for individual borders but not paths). But we're talking about really small differences: I highly doubt they matter in practice.
this is just not true. using svg you can have a single string describe an arbitrarily complex path.
> the code is more editable
also not true. they are both just text...
> and managable
how so? in svg you can group things, easily shuffle things around, save them in separate files and point to them.
> argumentably better performance (because i haven't tested it)
what does that even mean? loading time? rendering time? memory?
Congratulations, there is some pretty cool wizardry going on in there, and it's undoubtedly fun, I just find your rationale for it completely made up. You still got my upvote though, just please don't say such unsubstantiated silly things.
edit:formatting
this is just not true. using svg you can have a single string describe an arbitrarily complex path.
reply: unless you count code by lines, but that single line of string for paths feels really really long and not readable. see below
> the code is more editable
<svg id="beard" data-name="beard 1" xmlns="http://www.w3.org/2000/svg" width="14.096" height="4.063" viewBox="0 0 14.096 4.063"><title>Untitled-1</title><path d="M10.529,0.563a2.245,2.245,0,0,0-2.972,0,1.806,1.806,0,0,0,0,2.716c1.8,1.643,4.343.514,6.539-1.63C13.461,2.269,12.136,2.032,10.529.563Z" fill="#fff"/><path d="M3.567,0.563a2.245,2.245,0,0,1,2.972,0,1.806,1.806,0,0,1,0,2.716C4.741,4.922,2.2,3.793,0,1.649,0.635,2.269,1.959,2.032,3.567.563Z" fill="#fff"/></svg> vs. in css http://cssicon.space/#/icon/mustache-solid
to change its shape you need to use illustrator for SVG vs. in css just some property change. Yes they are just text, but are you really smart enough to edit the above SVG code by hand?
> and managable
managable as you can have clean html, all you need is a div, vs. svg you have to insert the whole chunk of svg code in your html.(Using <img/> won't give you flexibility, svg has to be inline) you can have package tool to insert svg programmatically but when you just prototyping, not gonna do that whole process to just get some icon showing up. CSS ICON is grab and go icons.
> arguably better performance (because i haven't tested it)
It is not true rendering time wise, as someone else analyzed CSS need more rendering time. But you have less HTTP request comparing to icon fonts or external SVG files. Download time is faster
Beyond that I have positioned it as an CSS learning tool. I spent more time making the web app than doing the icons, with angular.js, so that one can click on any icon and inspect and learn these css tricks within 10 mins or so. The easiest way to learn any programming language is to do a hands-on project, and I find cssicon is bite-sized project that give the learner some learning satisfaction within the ideal short time span. I hope this helps someone
Though the method I wanted to use would work if it weren't for the existing icons symbols inside of sprites, which seems to be only supported in Firefox's CSS.
For example: ``` <svg> <symbol id="helloworld">[... a bunch of paths]</symbol> <symbol id="anothersym">[...]</symbol> </svg> ```
``` label:before { background: url('/path/to/my.svg#helloworld') no-repeat; } ```
I could, of course, break the icons out of the symbol tags, as done here: https://css-tricks.com/svg-fragment-identifiers-work/
It's just disappointing that while referencing symbols works just fine with a <use xlink:href> tag, it doesn't work as a CSS url property value. I'm not sure why that would be.
EDIT: Yes, I'm sorry, I know this isn't Stack Overflow. Though I think the above(without symbol tags of course) may be the best alternative to pure-CSS icons if your graphics are more complicated.
[1] https://bugs.chromium.org/p/chromium/issues/detail?id=128055
Still the idea is very cool, you can basicly do anything with CSS (if anyone is interested check https://cssquests.com/ , the name is self-explanatory :)
From a performance perspective, how do those compare to using SVG icons?
I haven't tested it but I am guessing it has better rendering time, it has much less code than SVG (with their path, it is often quite long) and you can style it (such for hover state) and animate it more easily.
With SVG, you can do the same, but it has to be inline in HTML, no img tag embed SVG and such, so if you have 2 of the same icons on the same page, the code has be to repeatedly inserted twice in the html, but with css it just share the same classname.
But: I went through a lot of the simpler ones on the codepen (minus, plus, menu, etc.) and learned some awesome techniques that I didn't know, then recreated them from scratch and was able to create some of the more complicated things. tbh I probably learned more css in the last hour than in any other single hour of my life. Nice!
I present: crudely drawn "x" icon with a circle around it:
I tip my hat and raise a glass to you, you're a great artist.
The shortcoming is that you can't do any icon in the world with css. But if you already find this is equivalently appearance wise, the performance and code hygiene is much better than SVG or icon fonts.
also icon fonts are the worst way to do icon, here is the article about why: https://github.com/blog/2112-delivering-octicons-with-svg
if you want something found on a CDN and as a result more likely cached in browsers (or pre-loaded via an extension), font awesome is a safe bet
If you want the most pure option, SVG (hint, change the background of the css icon boxes to see why, the usage of background-colored boxes everywhere is pretty damaging if you want to use it on anything other than flat colors)
if you want the icon to interact with your content (want text in a speech bubble? changing numbers? etc?) or to be quickly tailorable, then probably CSS icons
I remember seeing similar projects [1][2] in the past and pondered usage of the `currentColor`.
Btw, there are several occurrences of white components [4]; they are necessary for "breaking" lines, but surprisingly there are very few of them and overall do't break much [3].
[1] http://cikonss.zzapdeveloped.it/ [2] http://one-div.com/ (warning, hugely ad infested currently) [3] console: document.styleSheets[0].insertRule('.iconWrapper,.iconViewer{background-color: #999 !important}',0)
Some of the icons don't look great at the small size, particularly the smilies (Chrome 53 on OS X)
Web technologies are funny though; Instead of a decent video solution, we get animated GIFs. Instead of a decent vector solution, we get CSS icons...