[HN Gopher] Conditional CSS ___________________________________________________________________ Conditional CSS Author : mooreds Score : 59 points Date : 2023-01-16 18:20 UTC (4 hours ago) (HTM) web link (ishadeed.com) (TXT) w3m dump (ishadeed.com) | danielvaughn wrote: | I've been writing CSS for well over a decade, and as much as I | love it, there's one thing I've always been irked about. The | language lacks an explicit if/else syntax because the authors | felt that the presentation layer shouldn't be responsible for | "behavior", which is how they think of logic. So what's funny | here is that this article perfectly illustrates why the lack of | an else/if is just pure silliness. There's "behavior" embedded | everywhere in CSS, it's just all so implicit that it almost goes | unnoticed. | sebazzz wrote: | CSS is reaching the point for me that it is becoming too | complex. I'm perfectly fine with complex backends though - CSS | though, there are now so many options and so many ways to do | things. It must probably be me though. | suprjami wrote: | It isn't just you. | | I work on systems software - kernel, daemons, networking, | debuggers, machine language disassembly - so I'm used to | looking at things which other people say are "hard". | | Nothing frustrates me more than writing a Stylus rule or | figuring out how to place an element on my Jekyll theme. | Every time I do this, my appreciation for modern well-made | websites doubles. | | CSS is so opaque and impossible, I wouldn't be a web | developer for any money. | marcosdumay wrote: | It may be time for CSS to consolidate, factor some | functionality, and deprecate some old stuff... | | But I can't point any functionality that could go through | that. Ok, there are a few functionalities that are not | independent, but they are still better designed than any | alternative I can think. | | I'm staying with the opinion that a universal formatting | language is inherently complex. And CSS is quite well fit to | function. | madeofpalk wrote: | What's an example of something you could do with an if/else, | that's not possible today? I think this article demonstrates | why an if-statement is not needed when you can declare rules of | how styles are applied. | danielvaughn wrote: | It's not about functionality, it's about being explicit and | clear. Had the authors decided to include an if/else | construct, it would have meant that none of those other | concepts were even necessary. You could have bundled all of | them together under one syntax. Much cleaner and easier to | understand. | psygn89 wrote: | I think part of the problem was that selectors that looked | inwards or outwards from an element was deemed too | expensive to parse. It only looked at the current element | or following adjacent ones (with + or ~). Now that it's | deemed doable without noticeably hurting performance, | :has/:not(:has()) basically comes around and allows you the | inward/outward selector lookups, e.g. | (`.container:has(input:checked) { border: 1px solid green | }` ). | | That said, I do agree it would've been nice if they had the | foresight to use `:has(:checked)` (or some kind of :if() | syntax), but it's all hindsight 20/20 and it was the wild | west on the web back when a lot of these features were | spec'd/implemented. Kinda wish there was a new css version | every 10 years or so to fix the inconsistencies (which you | would have to opt into). | madeofpalk wrote: | What's an example that's not explicit or clear enough? | | I think `p:empty { }` is a perfectly clear syntax. As the | article says it's already a conditional statement - just | imagine an invisible `if` in front of every selector or | media query. | | CSS is not a procedural language, so I think that if | statements could be less clear about how rules are applied. | glasss wrote: | I think you and the blog post make sense. If you present people | with a outside-in view of building a website, I wager they | would agree that form and presentation layers have a huge | impact of behavior, expected or implicit. | | With the inside-out view of HTML then CSS, it feels like that | same stance gets muddied because of the technical aspects of | the languages and their original intents. | gnull wrote: | The current syntax also makes it hard to characterize the class | of predicates that can be expressed with CSS. Kind of hurts my | sense of perfectionism, but I guess it wasn't their goal. | | I assume CSS was made very restrictive on purpose so that it | can be applied to the page elements and analyzed very | efficiently. | nine_k wrote: | So useful; thanks to the author. | | But a number of things are still Chrome-only, and even with that, | only available in the latest version. Will have to wait before I | can apply them. | grose wrote: | Great article. I am super excited for :has, I think it will open | up a lot of doors to truly declaritive UI with vanilla CSS and | HTML. | | One more handy feature is data attributes. You can use them to | introduce some state to your UI. | | Here's a quick and dirty example of a menu for an RPG game. | <ul id="menu" data-can=""> <li id="menu- | attack"><button>attack</button></li> <li id="menu- | magic"><button>magic</button></li> <li id="menu- | run"><button>run</button></li> </ul> | | We can use data attribute selectors to hide menu buttons that the | player can't use. #menu:not([data-can~=attack]) | #menu-attack, #menu:not([data-can~=magic]) #menu-magic, | #menu:not([data-can~=run]) #menu-run { display: none; | } | | Then all we need to update the menu UI is this single line of JS. | document.getElementById("menu").dataset.can = | getPossibleActions().join(" "); | | You can see a rough example here: | https://github.com/kawaiisolutions/tactics. It's very nice for | prototyping. | wildrhythms wrote: | Yes, I use data attributes all over! It lets me keep certain | data and certain states in the DOM, and I can actually use | querySelector to... you know, do a query based on data | attribute values. I've met many devs who didn't know that CSS | queries can actually string match within the values of | attributes! (i.e. [attribute~="value"] and the other | variations) | | https://css-tricks.com/almanac/selectors/a/attribute/ | throwaway744678 wrote: | This article has interesting points; I learned a few CSS | features. Yet the premise seem rather bland: of course CSS is | "conditional"! No need for fancy media queries and whatnot, a | basic selector is already a "condition". Styling different | elements in different ways is the whole point of CSS. | karaterobot wrote: | At first I assumed this was a blast from the past article about | having to feed special styles to older versions of IE using | syntax that was invalid in other versions. Like using `_` or `*` | characters in properties. I had to look up all those old tricks I | used to know by heart, from the bad old days. | swyx wrote: | could you use the :checked or :has selector for opening up mobile | menus? i currently use JS for that and feel a bit guilty about | it, yet i dont really know how to do it in pure CSS and hide the | checkbox somehow | cookie_monsta wrote: | You just hide the checkbox the way you normally would with CSS. | Search for CSS Hamburger Menu - there are plenty of examples | online. There's some other trick in there using target. It's | been a while since I did it but once you get your head around | it it's pretty simple. | zachrip wrote: | Be careful in this space, keep accessibility in mind when doing | things like this. JS is meant for interactivity, don't feel | guilty for using it for the right job. | chatmasta wrote: | Yes, this is what I do, with :checked and <details> and some | sibling selector trickery instead of :has (basically, the | checkbox is the last element, and <details> is an accessible | browser-native way to toggle visibility without javascript). | | I was able to make some complex hover menus and sidebar toggles | work like this entirely without JavaScript. It's also | accessible, _to the user._ The downside is that for the | developer, the resulting code is not easy to read nor maintain. | | I would link to it but it's in a private repository atm. One | day I'll open source this behavior as its own package... one | day... | Lisa_Novak wrote: | [dead] ___________________________________________________________________ (page generated 2023-01-16 23:00 UTC)