[HN Gopher] An interactive guide to Flexbox ___________________________________________________________________ An interactive guide to Flexbox Author : brandrick Score : 475 points Date : 2022-11-23 12:47 UTC (10 hours ago) (HTM) web link (www.joshwcomeau.com) (TXT) w3m dump (www.joshwcomeau.com) | jdthedisciple wrote: | This is a beautiful, immensely valuable resource - straight into | my bookmarked notes. Thank you! | tuukkah wrote: | To make complete layouts, you still need to creatively combine | (nested) Flexbox with other CSS features. Flexbox was a huge | improvement, but I continue to see the need for "tricks" articles | that give you well thought-out solutions to practical layout | cases. | ricardobayes wrote: | This is really good, the language, the examples, just everything. | It's right up my alley. | justin_oaks wrote: | As someone who does more back-end work in my job, I love learning | about this kind of front-end stuff that I don't get to use as | often. | | Flexbox has been great to work with because it's much easier to | control your responsive design. You can choose what lengths stay | fixed, which expand and shrink, etc. | | When I learned how to use flexbox I went searching for how to add | tools to my responsive-design toolbox. I learned about how to use | media queries so that different CSS rules are applied based on | the width of the page. | | Flexbox, grid, and media queries are some of the heavy hitters in | responsive design these days, but wanted to know more about | effective use of things like CSS functions like calc, min, max, | clamp, minmax (grid only) and when to use them. I can find | reference material, but I haven't found any good resources that | explain when you'd use them instead of something else. | | Does anyone have a good resource for responsive design that | covers use of CSS functions too? It's no good to have a tool in | your toolbox if you don't know you should be using it. | bobthepanda wrote: | I don't have a good resource, but min, max, minmax are good if | you have a responsive layout where elements change (under a | parent container in vh, vw, %) but you also want to have a | threshold that is not exceeded. Like min-width or max-width, | but as a value instead of the explicit css property, which | means you can set properties to equal that value. | | MDN has some good explainers: https://developer.mozilla.org/en- | US/docs/Web/CSS/clamp | justin_oaks wrote: | Thanks. After reading your explanation it became clearer that | the reason you use clamp is because you're using different | units (e.g. rem vs %, px vs vw) and varying page dimensions | may affect those units differently (e.g. 10% may be larger or | smaller than 100px depending on the parent's width). | | Here I read the entire MDN article on clamp and it didn't | click in my mind until you explained it. | frankzander wrote: | I use CSS basically every day but flex-basis, flex-grow and flex- | shrink now clear. I had a gut feeling but no motivation to | investigate further. If something doesn't work with flexbox I | just use grid. Now Flexbox gets maybe some more use cases where | grid is bit of an overkill. | skilled wrote: | I think this is a great tutorial but I also think it's absolutely | not needed because of how many other similar guides have already | been done. | | Now, I'm not trying to be arrogant about it either. | | This tutorial could have been 10 times better if Josh didn't | pretend like what he wrote hasn't already been done (it has been, | a million times, and I don't know why you'd keep beating this | dead horse over and over again) - and instead made this same | exact tutorial but actually built functional layouts in the | process. You know, web pages that use Flexbox. | | People don't learn by clicking on fancy buttons that rearrange | some boxes in a specific order. People learn by example and by | visually seeing the consequence of an action (in this case, the | value of a property). | | No offense meant at all to the author, of course. | detritus wrote: | Well, it made flexbox finally click for this old hand, so | thanks Josh. | skilled wrote: | Of course it did. | slhck wrote: | As someone who only needs to use Flexbox/Grid every once in a | while, this is precisely what I needed. | | I've been struggling with static documentation like the one from | Tailwind [1] or MDN [2]. Writing good and intuitive documentation | is hard, surely this must have been quite an effort. | | [1]: https://tailwindcss.com/docs/flex-direction | | [2]: https://developer.mozilla.org/en- | US/docs/Learn/CSS/CSS_layou... | koromak wrote: | Maybe more introductory than you're looking for, but I went | through this once a few years ago and its stuck ever since: | https://flexboxfroggy.com/ | | Now I just need one for Grid. | lelandfe wrote: | As far as I'm concerned, Flexbox Froggy is mandatory reading | for anyone completely baffled by flexbox. It's really | brilliant. | | CSS grid is heaps more complex than the flexbox spec, so I | think the Grid Garden one is not quite as useful. But | seriously - if anyone is just squinting when staring at | flexbox stuff, go check out that game. | aloisdg wrote: | Here you go https://cssgridgarden.com/ | nicoburns wrote: | For Flexbox https://css-tricks.com/snippets/css/a-guide-to- | flexbox/ is the resource I would recommend, along with | https://flexboxfroggy.com/ for a more interactive tutorial. | | For CSS Grid, the equivalent resources would be https://css- | tricks.com/snippets/css/complete-guide-grid/ and | https://cssgridgarden.com/ | | These are all tutorial-level documentation. Once you've gone | through those you can complement them with the MDN | documentation on the individual properties as a reference. | aloisdg wrote: | Upvote for https://flexboxfroggy.com/ and | https://cssgridgarden.com/ for grid | sbergot wrote: | I can't recommend the css tricks guide enough. I don't write | enough css to know the properties by heart but with this | resource it is easy to find quickly the property you need. | Cyberdog wrote: | Yeah, I have both of those bookmarked myself. I know they | sell posters of the articles. I've always wanted to get | them, though they're a tad pricey. But I guess I can write | it off as a business expense... | yreg wrote: | I wonder how many hits that article has. It must be one of | the most visited development-related articles on the web. | RheingoldRiver wrote: | Ah I came here to recommend Flexbox Froggy and Grid Garden! I | didn't come across them until long after I needed them, which | is really a tragedy, but I try to rectify it by linking them | to everyone I come across who is learning css (which is a lot | of people due to some Discords I'm in). They're adorable and | wonderful, and if you don't use css frequently enough to keep | the properties memorized, but do use it enough that it would | be convenient to be slightly more familiar than needing to | re-google constantly I recommend re-playing them once a year | or so; they're honestly pretty fun just because they're so | cute. | plondon514 wrote: | For Tailwind I put together "Tailwind Toucan" on my side | project https://codeamigo.dev/lessons/243. Warning: it touches | on more than flexbox. | Existenceblinks wrote: | I wonder if the most use cases today could justify flex as a | default where `display:block` is a default and s/inline- | block/inline-flex/ .. I often have an anxiety of using too many | flex elements. How many cases where there's a need to un-flex? | tppiotrowski wrote: | "I like to think of CSS as a collection of layout modes. Each | layout mode is an algorithm that can implement or redefine each | CSS property. We provide an algorithm with our CSS declarations | (key/value pairs), and the algorithm decides how to use them." | | Brilliant. The way basic CSS properties are taught often ignores | the layout mode. Even MDN does not mention that "width" is a CSS | property that is not always respected when "display: flex". | Making this distinction more prominent would reduce the amount of | confusion/frustration when certain CSS properties appear to "not | work". | | [1] https://developer.mozilla.org/en-US/docs/Web/CSS/width | [deleted] | lewantmontreal wrote: | Is there a way to remember what justify/align-content/items do on | a column or row? I write css semi-rarely and go through all | options in dev tools until it's the one I want.. | coding123 wrote: | This is the one I use to get me some layout needs quickly: | | https://codepen.io/justd/full/yydezN/ | Tenal wrote: | telagraphic wrote: | I created https://www.flexulator.com for a deeper look into how | the spacing algorithm works, you can see how the values are | calculated. | steveridout wrote: | Nice work on the interactive elements in this guide, they're | delightful! | quickthrower2 wrote: | It seems like in the example widgets baseline and flex-start | appear the same. But according to | https://stackoverflow.com/questions/34606879/whats-the-diffe... | they do different things. Josh's examples have text in them, so | why is it not aligning to the baseline of that text? | | Windows 11/Latest Chrome FWIW :-) | joshwcomeau wrote: | Yeah, I was worried people would wonder about this! | | It doesn't appear to have an effect in this example because all | of the text is the same size (and therefore, they _do_ all | share the same baseline). In the devtools, try bumping one of | the items up to font-size: 2rem, and you 'll see the effect it | has. | | My initial version of this post didn't have "baseline" as an | option, since yeah it doesn't demonstrate it well, but I | figured people would wonder why a single value was excluded. | | Incidentally, baseline alignment is _so_ handy, but I couldn 't | fit everything into this post. We cover it in more detail in my | course (https://css-for-js.dev/) | joshwcomeau wrote: | Pushing an update now that sets different font sizes for the | 4 children, so that this can be observed! | ad404b8a372f2b9 wrote: | I love flex, it's made CSS so easy. One of the things that | improved my flex usage was using Penpot to draw my designs before | implementing them. | | They have alignment properties for graphical elements that work | like flex's justify-content and align-items properties so once | you design a view in Penpot it becomes almost trivial to | translate it into HTML/CSS using flex. | | It really changed my mindset from working with relative or | absolute positioning, blocks, margins, padding, etc... to simply | working with flex everywhere. And it's responsive automatically! | nicoburns wrote: | Just wait until you try CSS Grid :) IMO it's even more | intuitive than Flexbox, at least for any 2 dimensional layout. | silverwind wrote: | Grid surely is more complex. For example: Units that appear | nowhere else in CSS besides Grid, functions that are only | used in Grid. It feels like a language inside a language. | illumanaughty wrote: | Grid and Flex serve different purposes for layout. Also Grid | has many of the same keywords as flex, but is more complex. I | wouldn't call it more intuitive. | open-source-ux wrote: | _Grid and Flex serve different purposes for layout. Also | Grid has many of the same keywords as flex, but is more | complex._ | | I find CSS Grid easier to understand than Flex. I also | think it's easier (arguably more logical) to start with | Grid and then understand Flexbox and how fits in your Grid. | | The problem is that popular frameworks like Bootstrap and | Bulma still don't support CSS Grid (they use flexbox only | for layout, although Bootstrap 5 has opt-in CSS Grid). You | could argue that CSS Grid makes frameworks redundant for | _layouts_ only. | | Developers have rightly complained how cumbersome CSS | layout has been in the past. It's ironic CSS Grid is | available in all modern browsers but developers still | aren't using it. | wruza wrote: | Not sure, but grid seems to be not very framework-able. | Bootstrap frees you from choosing geometry by traditional | grid system where you just class-mark columns and that's | it. CSS grid is a whole new ~sublanguage that you have to | master. | code_biologist wrote: | For anyone unsure whether to use flex or grid, the mental | shorthand that I use is whether the container or the | elements in a container should have more control over the | layout. | | Flex is better if the individual elements should have some | control over the layout, whereas grid is better if the | container should be fully controlling the layout. | | Great 20min tutorial vid with examples and details on the | above: https://www.youtube.com/watch?v=3elGSZSWTbM | bobthepanda wrote: | Grid is also 2D capable whereas flex is supposed to be a | one-axis situation. | | You can nest flex such that it acts in a 2D way but it's | a bit annoying | dwohnitmok wrote: | Are there any layout behaviors that are possible to | achieve with flexbox but impossible with grid? Basically, | setting aside inversion of control at the moment, does | grid subsume flexbox? | | Even the deconstructed pancake example in the posted | article doesn't seem to be impossible with CSS grid but I | haven't given it too much thought. | sodapopcan wrote: | That's good advice--I like it. | | Another data point I use is that if I find myself adding | a container for the sole purpose of layout, I realize | that I should be using grid. That is one of the biggest | wins of grid: you don't need to pollute your markup with | nearly as many layout/presentation-only elements. | alwillis wrote: | _For anyone unsure whether to use flex or grid, the | mental shorthand that I use is whether the container or | the elements in a container should have more control over | the layout._ | | I guess I'm wondering why it's any more complicated than: | | * Flexbox is for formatting in one dimension (or axis)--a | row or a column. | | * Grid is for layout in 2-dimensions--columns and rows; | a.k.a. a grid. | | In fact, you can use flexbox and grid in the same layout, | each doing its thing. | tigrezno wrote: | Amazing guide, thanks! | bob1029 wrote: | I noticed a _lot_ of developers rave about flexbox, but not so | much about grid. | | It is my understanding that flexbox was intended for 1D layouts | and grid was intended for 2D layouts. We've been using grid for | the overall page layout and flex inside certain regions. | | Is there something I am missing here, or are we finding that the | hammer is pretty good at screws too? | no_wizard wrote: | I think its a reality that by and large most developers are | coupled to some CSS / Component framework that they aren't | writing all the CSS from scratch, and most of these frameworks | only (currently, when I last surveyed, say ~3 months ago) | provide Flex based CSS utilities. Until recently this was | particularly true of Bootstrap and Zurb Foundation which were | arguably the most popular of the CSS frameworks. | | I also think its general knowledge. Took a really long time for | everyone to use Flexbox too. Even as late as 2016/2017 I saw | engineers still reach for things like unsemantic[0] (the 960 | Grid successor) and other utilities like it if they were doing | custom layouts. | | [0]: https://unsemantic.com/ | jrochkind1 wrote: | I would say the 1D/2D thing is a summary/rule of thumb. But | grid can be useful for "1D" (linear) layouts too -- I feel like | I've used it for something that was harder to do with flex even | though it was linear, although I can't recall specifically. And | flex can certainly be useful for some "2D" things depending on | what you mean by that. | | Grid is newer, and somewhat more complicated. Newer is probably | the main reason it seems less popular than flex. | bob1029 wrote: | > Grid is newer | | That's probably it. grid-template is a hell of a property | too... Took me quite some time to figure it out. | jrowley wrote: | CSS is grid is newer than Flexbox and has lower browser | support, caniuse says 99.74% vs 96.95%. Overtime I imagine | we'll see more utilization though | | * Grid usage: https://caniuse.com/?search=css%20grid | | * Flexbox usage: https://caniuse.com/?search=flexbox | thedangler wrote: | Perfect timing. I'm working with tailwindcss, not by choice. And | all good tailwind templates, buttons, styles are for purchase. I | guess that is why I gravitate towards boostrap when I can. | | But this site is helping a lot. Thank you. | sbergot wrote: | This is actually something I love about tailwind. It doesn't | create a layout abstraction. I solve 99% of my layout problems | with 2/3 flexbox properties so I strongly recommend learning | that. | | CSS tricks has a very nice reference/guide: https://css- | tricks.com/snippets/css/a-guide-to-flexbox/ | danielvaughn wrote: | Yes indeed. Layout abstraction is excellent until you need to | do something it doesn't expect, and then it turns into an | absolute nightmare. | dnzm wrote: | This used to be my go-to Flexbox reference, but Josh' guide | supplanted it. | plondon514 wrote: | Try out Tailwind Toucan and let me know what you think! | https://codeamigo.dev/lessons/243 | nailer wrote: | Try grid too - unless you need flexing, it's simpler than | flexbox, even for single columns or rows. | frankzander wrote: | this depends on what you know ... grid is way more mighty and | you have to take know what to do if you want to behave like | flexbox. | nailer wrote: | > grid is way more mighty | | I don't know what you mean by `mighty' | | > you have to take know what to do if you want to behave like | flexbox. | | yes, as mentioned, that is if you want flexing. Most people | don't want flexing - most layouts are static, grid-based and | only change based upon media queries, where CSS grid is very | similar. | c-smile wrote: | That reminds me again that flexbox is so needlessly complex that | you need quite non-trivial guides each time you use it. | | It could be significantly simpler and, well, flexible: | | https://terrainformatica.com/2018/12/11/10-years-of-flexboxi... | cztomsik wrote: | core algo is simple, the complexity goes from everything else, | which still needs to work with flexbox (min/max, | relative/absolute/fixed, relative units everywhere, calcs, and | the concept of min-content or whatever that is, for which you | need to recursively call algos down even when in theory the | size should be known already - text-specific) | | the only stupid thing is the "loop until there is no | deviation", but I think it's not mandatory for most of the | real-world layouts and one pass is enough. | | the naming of those alignments is hard to remember, but that's | it, it's not complex, it's just very unfortunate. | c-smile wrote: | "core algo is simple" | | It is not that simple. In common case that's an LP task. It | can be reduced to O(N) in some cases but in worst case it has | polynomial time-complexity. | jacobp100 wrote: | What's your take on grid? I still can't quite grok the | algorithm - but from your article, your proposal seems | really similar to what's available with grid. | | Grid does suffer from not being able to set min/max track | sizes - like have a sidebar be say 20% of the width, but | clamped between 200px and 300px | jacobp100 wrote: | I think in almost every real world scenario, the loop only | runs once. I don't think it adds a huge amount of complexity | to the layout algo - you still need to code in the loop body, | even if you don't actually loop. That said - React Native | only does two passes, and nobody seems to have | noticed/complained. | | You can do some neat things with the looping behaviour - like | have a toolbar with some icons on the left and the right hand | sides and a title centred in the toolbar - but then have the | title move off centre as soon as the icons from either side | touch it. | shlosky wrote: | Easily one of the best guides of flexbox, and this is coming from | a mostly backend guy that can never remember flexbox for long | term, and always needs a refresh about it. ___________________________________________________________________ (page generated 2022-11-23 23:00 UTC)