{"componentChunkName":"component---src-templates-post-js","path":"/blog/css-grid","result":{"data":{"markdownRemark":{"frontmatter":{"date":"05 de setembro de 2019","title":"CSS Grid","description":"The right way to build layouts on web"},"html":"<h2>Intro</h2>\n<p>For the first time (since 2017) CSS Grid is available directly in the browser! This means that any way to create layout structures will be disabled by a native system that is cleaner at the time of writing your HTML and CSS, consequently more semantic and considerably easier to learn.</p>\n<h2>Classic way</h2>\n<p>Until then, all that existed about browser layout was just an \"imitation\" of the true functionality of a grid. A widely used template is from the famous Bootstrap framework: <code class=\"language-text\">&lt;div&gt;</code> with classes: 'row', 'col-some-size', 'col-some-smaller-size', several and many tags defined in HTML and with classes that tend to grow even more according to the complexity of your project.</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>navbar navbar-dark bg-dark shadow-sm<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>container d-flex justify-content-between<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>a</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>#<span class=\"token punctuation\">\"</span></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>navbar-brand d-flex align-items-center<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>strong</span><span class=\"token punctuation\">></span></span>Title<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>strong</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</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>navbar-toggler<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>button<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">data-toggle</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>collapse<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">data-target</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>#navbarHeader<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-controls</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>navbarHeader<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-expanded</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>false<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-label</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Toggle navigation<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>span</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>navbar-toggler-icon<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</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>\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<p>The point is that this \"traditional\" model has worked very well and you will not be reinventing the wheel by choosing to use CSS Grid in layout construction, on the contrary, with CSS Grid you make your markup simpler and semantically correct (as I said before) and without dirt and divs and more divs defining rows and columns.</p>\n<h2>CSS Grid Layout</h2>\n<p>With a few lines of HTML and CSS we set up a responsive grid easily:</p>\n<iframe height=\"265\" style=\"width: 100%;\" scrolling=\"no\" title=\"CSS GRID example\" src=\"//codepen.io/emunhoz/embed/KYZogp/?height=265&theme-id=0&default-tab=css\" frameborder=\"no\" allowtransparency=\"true\" allowfullscreen=\"true\">\n<p>  See the Pen <a href='https://codepen.io/emunhoz/pen/KYZogp/'>CSS GRID example</a> by emunhoz</p>\n<p>  (<a href='https://codepen.io/emunhoz'>@emunhoz</a>) on <a href='https://codepen.io'>CodePen</a>.</p>\n</iframe>\n<p>Which replaces much larger files compared to the Bootstrap grid for example.</p>\n<blockquote>\n<p>The more I use CSS Grid, the more convinced I am that there is no benefit to be had by adding a layer of abstraction over it. CSS Grid is the layout framework. Baked right into the browser.</p>\n<p>— Jen Simmons</p>\n</blockquote>\n<h2>CSS Grid ≠ Flexbox</h2>\n<p>Yes, the two are different and each has its own purpose, but it does not replace the other, they complement each other!</p>\n<h2>Flexbox</h2>\n<p>Flexbox aims to organize items within a parent element. For example: I have a footer tag and need to place certain text in the center.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">footer</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\">justify-contents</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>That is, it is great for working with elements in a single dimension, whether row or column.</p>\n<p>You can also create two-dimensional flexbox layout, but that's not its purpose. CSS Grid works a lot better with this.</p>\n<h2>CSS Grid</h2>\n<p>With CSS Grid we define, for example, where this footer will be in the whole layout.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">#app</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-areas</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"header\"</span> <span class=\"token string\">\"main\"</span> <span class=\"token string\">\"footer\"</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">footer</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">grid-area</span><span class=\"token punctuation\">:</span> footer<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This is the best way to arrange elements in two dimensions, especially when you need to define the structure of a page.</p>\n<h2>The best of both sides</h2>\n<p>Using the same basic example to enjoy the best of both together:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">#app</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-areas</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"header\"</span> <span class=\"token string\">\"main\"</span> <span class=\"token string\">\"footer\"</span>\n<span class=\"token punctuation\">}</span>\n  \n<span class=\"token selector\">footer</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\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-area</span><span class=\"token punctuation\">:</span> footer<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Anyway, in this case we define the grid and the position of the footer with CSS Grid and centralize elements that are inside the footer. CSS Grid and flexbox are simple contexts but can confuse when and when to use both.</p>\n<h2>Some links</h2>\n<p><a href=\"https://grid.layoutit.com/\">https://grid.layoutit.com/</a></p>\n<p><a href=\"https://cssgrid-generator.netlify.com/\">https://cssgrid-generator.netlify.com/</a></p>","timeToRead":3}},"pageContext":{"locale":"en","title":"CSS Grid"}},"staticQueryHashes":["1886018365","764694655"]}