I have used Tailwind on various projects. I think for prototyping and quick proof of concepts, for one-off projects that never need to be updated, it has some advantages. But for code that you want to last; code that needs to be maintained; code that should have thought applied to it, Tailwind has issues. Jeff has done a great job of outlining what those issues are, pointing out that CSS is currently undergoing a CSS3-level reinvention that solves almost all of the issues Tailwind purportedly solves, but better, and offering some additional thoughts around the edges of why Tailwind seems to have been adopted so rapidly.
On how Tailwind causes long-term debugging headaches, particularly for those of us who build/debug in the browser (read: front-end specialists):
Yeah, you might have auto-completion in your editor, but the browser inspector is utterly neutered. You can't use the applied styles checkbox, because you'll wind up disabling a style for every usage of that tailwind class.
Due to the tailwind compiler, which was a solution to the "shipping massive amounts of CSS" problem, you don't have a guarantee that the class you're trying to poke into the inspector view will actually exist.
On the needless repetition of writing CSS via Tailwind (or any utility-class-only system):
You can't chain selectors. If you want your hover, focus, and active classes to be the same, you have to write them all.
On the issues with declaring "specificity is the devil" or "the cascade is too complex to scale" and refusing to use the language as designed:
Tailwind, and other utility frameworks, throw out the best and most often misunderstood aspects of CSS. CSS was explicitly designed with certain features, that, while complicated, are immensely useful once you can master them. The cascade, selector chaining (see above), and specificity are all very powerful tools. If you misunderstand them, yeah you can cut yourself. Just like if you don't use a saw properly you can cut yourself.
Selector chaining, particularly with the advent of new CSS selectors like
where, allows very clean reuse of common bits of CSS. You get to separate the properties that affect how something looks from what is being affected. It's obvious, but in tailwind, you don't get that.
And on how Tailwind still has specificity even if proponents like to argue it doesn't (a breed of specificity with no clear method to work around, no less, which often causes bigger headaches than the native cascade would have in the first place):
And it's a lie to say you don't have to worry about specificity in tailwind; tailwind has its own specificity. Classes are read left-to-right by the browser, and so if you do
b-1 bg-blue b-2, guess what? Your element gets both
b-2, and the browser will probably choose
b-2as your border, and throw away
@applyis a gigantic code-smell, it goes against everything tailwind supposedly stands for, and doesn't make writing your CSS any easier.
On who advocates the loudest for Tailwind:
The people I've seen who are most excited over tailwind are generally those that would view frontend as something they have to do, not something they want to do.
On how Tailwind's time (if it ever truly existed) may be coming to an end:
I've seen other engineers, of all levels, stuck in a mire of bad CSS, and so to them maybe Tailwind seems like a lifesaver. But CSS is better now. It's not perfect, but it's better than its ever been, and it's better than tailwind. Give it another try.