{"componentChunkName":"component---src-templates-post-js","path":"/blog/flex","result":{"data":{"markdownRemark":{"html":"<p class=\"intro\">In my last post, I talked about Javascript. Today, I am shifting my focus back to CSS Flexbox. I am going to explain <code>flex</code> property.</p>\n<p><code class=\"language-text\">flex</code> is a shorthand property for <code class=\"language-text\">flex-grow</code>, <code class=\"language-text\">flex-shrink</code>, and <code class=\"language-text\">flex-basis</code>. All these properties are applied to flex items. Let us take a look at the starter code that I am going to use for the explanation:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>box box1<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>one 😎<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>box box2<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>two 🍕<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>box box3<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>three 🙏<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>box box4<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>four ⛑<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.box</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 30px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-shadow</span><span class=\"token punctuation\">:</span> 4px 4px 0 <span class=\"token function\">rgba</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">,</span> 0.1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 10px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* Colours for each box */</span>\n<span class=\"token selector\">.box1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #1abc9c<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.box2</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #3498db<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.box3</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #9b59b6<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.box4</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #34495e<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 10px solid black<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<figure>\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 9.815950920245399%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAjklEQVQI12OQqsv5rzGt+r96aeR/g5bV/y3L5/33Tun+3xwy83+N34T/Ba6V/93cE/8bOAX8D03I/X/48JH/J0+e/H/ixAk4Pnrs+P9rFy78b164+D+DQn3+f+OZdf9Nq8L+m7at/m9TOe+/W3L3/7aIWf9rQib+T/Mo+e/plfLf1C34f2BM5v/DR/AbCABN+2hVDlhGQgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"flex\" title=\"flex\" src=\"/static/f327354c36ae297e79f792962ccc841f/a6d36/flex.png\" srcset=\"/static/f327354c36ae297e79f792962ccc841f/222b7/flex.png 163w,\n/static/f327354c36ae297e79f792962ccc841f/ff46a/flex.png 325w,\n/static/f327354c36ae297e79f792962ccc841f/a6d36/flex.png 650w,\n/static/f327354c36ae297e79f792962ccc841f/fd28b/flex.png 811w\" sizes=\"(max-width: 650px) 100vw, 650px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n  <figcaption>Output for starter code</figcaption>\n</figure>\n<h3>flex-grow</h3>\n<p>If there is extra space available in the flex container then flex-items can be made to grow to consume that extra space. <code class=\"language-text\">flex-grow</code> dictates what amount of the available space inside the flex container the item should take up. The default value of <code class=\"language-text\">flex-grow</code> is 0. Let us set <code class=\"language-text\">flex-grow</code> of all flex items to <code class=\"language-text\">1</code> and see what happens.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.box</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">flex-grow</span><span class=\"token punctuation\">:</span> 1<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<figure>\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 9.815950920245399%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAApElEQVQI1wXBTwvBYADAYZ+AiyM5jRMiS/6kZEMTa8nfMxdHb7I5MCuK1QotdnF7P4EP+PM8sYS9IvO9kgt25Jw5yZdL9iBRTz+aIqS0i+isJedegDd5cxj6CP3IVrtRrJuo+piGsaDatkhpFrG4vUL53ig/9qjHKcmni+JIGt6PlgjJiwhtLXG7AZflB3vss+k7CO1OoTaibsxoDhZUWiZp3eIPAyFUxIjcWnEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"flex grow 1\" title=\"flex grow 1\" src=\"/static/e966f56ca3bc3e6511cbdd5608554a31/a6d36/flex-grow-1.png\" srcset=\"/static/e966f56ca3bc3e6511cbdd5608554a31/222b7/flex-grow-1.png 163w,\n/static/e966f56ca3bc3e6511cbdd5608554a31/ff46a/flex-grow-1.png 325w,\n/static/e966f56ca3bc3e6511cbdd5608554a31/a6d36/flex-grow-1.png 650w,\n/static/e966f56ca3bc3e6511cbdd5608554a31/fd28b/flex-grow-1.png 811w\" sizes=\"(max-width: 650px) 100vw, 650px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n  <figcaption>flex-grow: 1</figcaption>\n</figure>\n<p>As all the flex items have their <code class=\"language-text\">flex-grow</code> set to <code class=\"language-text\">1</code>, they are taking extra space in equal proportion. What will happen if we set <code class=\"language-text\">flex-grow</code> of a particular item to be <code class=\"language-text\">3</code>?</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.box2</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">flex-grow</span><span class=\"token punctuation\">:</span> 3<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<figure>\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 9.815950920245399%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAqUlEQVQI1wXBOwsBAQDAcZ/BoBSDPNMV8ii65TxS0mFgcilKJoQcJ/IswkCxiKLE4Cb5fH+/n8E0rOO8rRGmdezLGrbVBaH3ITjWEYd3xOYej6YTaT9RcwcWxRMDeU0/PUeJq/gTMrF0CSlfweLyYzCOGwivA9FNA/e2inXzwKt+CS9+JGdvwq0jrsmPUFdHk8/syldGxT2dzJSKpBFIFZBkBTGrYHb4+ANl41YzviwLlQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"flex grow 3\" title=\"flex grow 3\" src=\"/static/e3a82bc0e3af9d6dd905df75c8d3cf08/a6d36/flex-grow-3.png\" srcset=\"/static/e3a82bc0e3af9d6dd905df75c8d3cf08/222b7/flex-grow-3.png 163w,\n/static/e3a82bc0e3af9d6dd905df75c8d3cf08/ff46a/flex-grow-3.png 325w,\n/static/e3a82bc0e3af9d6dd905df75c8d3cf08/a6d36/flex-grow-3.png 650w,\n/static/e3a82bc0e3af9d6dd905df75c8d3cf08/d7542/flex-grow-3.png 810w\" sizes=\"(max-width: 650px) 100vw, 650px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n  <figcaption>flex-grow: 3</figcaption>\n</figure>\n<p>We can see here that box 2 is taking up thrice as much extra available space than other flex items.</p>\n<h3>flex-shrink</h3>\n<p><code class=\"language-text\">flex-shrink</code> is exactly opposite of <code class=\"language-text\">flex-grow</code>. If there is not enough space available in flex container then flex items need to shrink. <code class=\"language-text\">flex-shrink</code> defines the proportion in which all flex items will shrink. Its default value is <code class=\"language-text\">1</code>. Hence, all flex items will shrink in equal proportion by default. Let us set the <code class=\"language-text\">flex-shrink</code> of box 1 to <code class=\"language-text\">4</code> and resize the window.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.box1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">flex-shrink</span><span class=\"token punctuation\">:</span> 4<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<figure>\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 430px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 26.993865030674847%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABjElEQVQY0yXF20taAQDA4cNSPJDO0WCd0iQfuoHbMgyCYN1HRBGYp5klhpduSK0LrqISKuqtQRdWhASusstyYtcxmFs0iHqot2iNvTZ66U/49dD38gnPOt9R+u8XVRdRTN+PKFy+pWX3DvvOf4rWb+kYvuSL6wfx0XNig6fER87Ydp/wwbpEsa0NZ88ENm+ACns36dkFCM99MpUXh9T8XOVVPIZ57oaWyBXezT8UrdzgGfhN2LHHxkCC9d4E0bFjwq5v9NXPYal10uwP4ukZo6Shg7QsM8KTdgf2eQeeQAFSLMrL5Xs8wUk6hwIYQ3d0DZ8Slg+Yl+NMudzMWNf43JRgUF4kt1zG3jWKf2ia19WtZORZEFRuG293RqhbcKLbimCe/UvZxBZvxr+S9+kad3+CkDXKtBzB75skaFsh1LjP+/qPmCplSqw+yhu8WGpa0WXlIyRp1QiZBgSDHqUuHfGFEYWUjTItB1WqEW2KAUmjQ9LokcSMxzV6UtSpqJKfohTVKMRkRLUWhVLFAwWd1/UkNBREAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"flex shrink 4\" title=\"flex shrink 4\" src=\"/static/b6c30c55fd75e08589f08fd97b58d0ec/05ed2/flex-shrink-4.png\" srcset=\"/static/b6c30c55fd75e08589f08fd97b58d0ec/222b7/flex-shrink-4.png 163w,\n/static/b6c30c55fd75e08589f08fd97b58d0ec/ff46a/flex-shrink-4.png 325w,\n/static/b6c30c55fd75e08589f08fd97b58d0ec/05ed2/flex-shrink-4.png 430w\" sizes=\"(max-width: 430px) 100vw, 430px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n  <figcaption>flex-shrink: 4</figcaption>\n</figure>\n<p>We can see that box 1 is shrinking more than other flex items.</p>\n<h3>flex-basis</h3>\n<p>This defines the default size of an element before the remaining space is distributed. It can be a length (e.g. 20%, 5rem, etc.) or a keyword. The auto keyword means \"look at my width or height property\". <code class=\"language-text\">flex-basis</code> may look similar to <code class=\"language-text\">width</code> property but it is not. It defines the default size of flex item along the main axis. So, when the <code class=\"language-text\">flex-direction</code> will change to <code class=\"language-text\">column</code> then <code class=\"language-text\">flex-basis</code> will similarize with <code class=\"language-text\">height</code> property rather than <code class=\"language-text\">width</code>. Its default value is <code class=\"language-text\">auto</code>.</p>\n<h3>flex</h3>\n<p><code class=\"language-text\">flex-grow</code>, <code class=\"language-text\">flex-shrink</code> and <code class=\"language-text\">flex-basis</code>, all three can be set in a single line using <code class=\"language-text\">flex</code> property. In fact, it is recommended that you use <code class=\"language-text\">flex</code> instead of using three properties separately. <code class=\"language-text\">flex-shrink</code> and <code class=\"language-text\">flex-basis</code> are optional.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.item</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">flex</span><span class=\"token punctuation\">:</span> none | [ &lt; <span class=\"token string\">'flex-grow'</span> > &lt; <span class=\"token string\">'flex-shrink'</span> >? || &lt; <span class=\"token string\">'flex-basis'</span> > ]<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This is all about <code class=\"language-text\">flex</code> property in Flexbox. I would like to remind everyone that I am learning Flexbox through a great free course <a href=\"https://flexbox.io\" target=\"_blank\" >What The Flex Box </a> by Wes Bos. I highly recommend it if you want to learn Flexbox in more detail.</p>","timeToRead":3,"frontmatter":{"title":"flex-grow, flex-shrink and flex-basis in Flexbox","date":"2017-10-30T00:00:00.000Z","tags":["CSS"]}}},"pageContext":{"slug":"flex"}},"staticQueryHashes":["3649515864","63159454"]}