Just a nitpick, but querySelectorAll returns a NodeList.
This can bite at times, for example IE supports Array.forEach, but not NodeList.forEach
Yeah this gets me every time. You can .forEach a NodeList, but can't .map. I usually end up wrapping it in an array and calling map on it like [...theNodeList].map(...)
querySelectorAll returns a NodeList, which is even more limited than an array (e.g. no map or filter).
but [...querySelectorAll()] does return an array and is just as concise
Another jQuery advantage is pseudo-selectors which don't exist in CSS.
There are plenty of convenient one-liners in jQuery which will expand to plenty of lines in native API. That said, with modern API and JS features it's not that bad either.