<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ian Gloude</title>
    <description>The latest articles on DEV Community by Ian Gloude (@iangloude).</description>
    <link>https://dev.to/iangloude</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F207665%2Fc7ac5337-c7f6-4967-a98b-7a7af0e16e39.png</url>
      <title>DEV Community: Ian Gloude</title>
      <link>https://dev.to/iangloude</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iangloude"/>
    <language>en</language>
    <item>
      <title>4 Steps to Self-Hosted Fonts in Gatsby</title>
      <dc:creator>Ian Gloude</dc:creator>
      <pubDate>Thu, 17 Oct 2019 22:53:56 +0000</pubDate>
      <link>https://dev.to/iangloude/4-steps-to-self-hosted-fonts-in-gatsby-aj2</link>
      <guid>https://dev.to/iangloude/4-steps-to-self-hosted-fonts-in-gatsby-aj2</guid>
      <description>&lt;p&gt;I finally got around to setting up fonts for my site, but everywhere I looked were articles that  overly complicated self-hosting fonts in Gatsby. Here's the easy 4-step process I used for my blog.&lt;/p&gt;

&lt;p&gt;1 - place your font files in &lt;code&gt;static/fonts/&lt;/code&gt;.&lt;br&gt;
2 - create a &lt;code&gt;fonts.css&lt;/code&gt; in the same directory and add your css font face rule(s). Mine looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;        &lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Lato"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("Lato-Regular.otf")&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Dank Mono"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("DankMono-Regular.otf")&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;3 - add &lt;code&gt;gatsby-plugin-web-font-loader&lt;/code&gt; with either npm or yarn (don't forget to &lt;code&gt;--save&lt;/code&gt;!).&lt;br&gt;
4 - add the plugin to your &lt;code&gt;gatsby-config.js&lt;/code&gt; inside the plugins array. Here's mine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nl"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gatsby-plugin-web-font-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;families&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Lato, Dank Mono&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
              &lt;span class="na"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/fonts/fonts.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That's it!&lt;/p&gt;

</description>
      <category>react</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Hiding Things with CSS</title>
      <dc:creator>Ian Gloude</dc:creator>
      <pubDate>Wed, 16 Oct 2019 00:52:00 +0000</pubDate>
      <link>https://dev.to/iangloude/hiding-things-with-css-36id</link>
      <guid>https://dev.to/iangloude/hiding-things-with-css-36id</guid>
      <description>&lt;p&gt;There are a handful of ways to hide things using CSS, and each of them has its own strengths and potential drawbacks. Here's a list of the 5 most common ways to hide content, and a use case or two for each.&lt;/p&gt;

&lt;h1&gt;
  
  
  Display
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;display: none;&lt;/code&gt; or HTML &lt;code&gt;hidden&lt;/code&gt; attribute&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removes element from visual flow, hiding it from both visual and AT (Assistive Technology) consumption&lt;/li&gt;
&lt;li&gt;Does not transition&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Toggled, closed, or otherwise hidden elements that may be shown again.&lt;/li&gt;
&lt;li&gt;Breakpoint-dependent elements like mobile &amp;amp; desktop menus&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Opacity
&lt;/h1&gt;

&lt;p&gt;Opposite of transparency, &lt;code&gt;opacity: 1;&lt;/code&gt; is fully opaque, &lt;code&gt;opacity: 0;&lt;/code&gt; is fully transparent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does not affect the element's position in the DOM flow, but a common gotcha here is an &lt;code&gt;opacity&lt;/code&gt; value other than &lt;code&gt;1&lt;/code&gt; puts the element in a new stacking context.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;opacity&lt;/code&gt; applies to the whole element and any descendants, but is not inherited by the element's children.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Temporarily hide elements, typically to fade in after a timeout or on a callback&lt;/li&gt;
&lt;li&gt;Pair with another method to create a smooth transition of content in/out of the visual flow&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Visibility
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;visibility: hidden;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visually hidden, but still occupies the same space in the visual flow.&lt;/li&gt;
&lt;li&gt;Unlike the &lt;code&gt;display&lt;/code&gt; property, &lt;code&gt;visibility&lt;/code&gt; is animatable. Pairs nicely with a short &lt;code&gt;opacity&lt;/code&gt; transition when animating an element in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hide an element without disrupting the visual flow.&lt;/li&gt;
&lt;li&gt;Pair with DOM manipulation, like &lt;code&gt;position: absolute;&lt;/code&gt; or &lt;code&gt;overflow: hidden; height: 0;&lt;/code&gt; to enable transitions where &lt;code&gt;display: none;&lt;/code&gt; would fall short.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ARIA
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;aria-hidden='true'&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hides from screen readers, but not visually.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Visual-only elements that already have descriptive text&lt;/li&gt;
&lt;li&gt;Redundant elements (all but one of mobile/tablet/desktop menus)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Clipping
&lt;/h1&gt;

&lt;p&gt;Hides visually, but not to AT. &lt;a href="https://a11y-guidelines.orange.com/web_EN/exemples/masquage/index.html"&gt;A11y guidelines&lt;/a&gt; on this are an excellent description.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Case
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Visually redundant elements already described in the DOM&lt;/li&gt;
&lt;li&gt;Input labels made redundant by a visual overhaul using pseudo-elements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Things to Remember
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All content hidden with CSS will become visible if styles are disabled.&lt;/li&gt;
&lt;li&gt;Be careful not to hide the full functionality of your site from screen reader and/or keyboard-only users.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>A Word on Sass @extend</title>
      <dc:creator>Ian Gloude</dc:creator>
      <pubDate>Wed, 07 Aug 2019 14:13:43 +0000</pubDate>
      <link>https://dev.to/iangloude/a-word-on-sass-extend-19ld</link>
      <guid>https://dev.to/iangloude/a-word-on-sass-extend-19ld</guid>
      <description>&lt;p&gt;&lt;code&gt;@extend&lt;/code&gt; is a powerful SASS tool that helps keep your code nice and dry, but it can have drawbacks if used incorrectly. Calling &lt;code&gt;@extend&lt;/code&gt; on a class or placehodler will add the &lt;em&gt;extended&lt;/em&gt; class to the &lt;em&gt;extending&lt;/em&gt; class' selector list. Take this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.success&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.warn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.fail&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We create a &lt;code&gt;.message&lt;/code&gt; class, and extend it across a few more classes with only a change to the &lt;code&gt;border-color&lt;/code&gt;. When compiled, we get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.message&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.success&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.warn&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.fail&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.success&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.warn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.fail&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Great! We've got an extremely effecient, dry output. However, using &lt;code&gt;@extend&lt;/code&gt; improperly can leave a massive trail of selectors you just don't need. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.foo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.bar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;.message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.baz&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.buzz&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;.error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Will result in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.foo&lt;/span&gt; &lt;span class="nc"&gt;.bar&lt;/span&gt; &lt;span class="nc"&gt;.message&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.foo&lt;/span&gt; &lt;span class="nc"&gt;.bar&lt;/span&gt; &lt;span class="nc"&gt;.baz&lt;/span&gt; &lt;span class="nc"&gt;.buzz&lt;/span&gt; &lt;span class="nc"&gt;.error&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.baz&lt;/span&gt; &lt;span class="nc"&gt;.buzz&lt;/span&gt; &lt;span class="nc"&gt;.foo&lt;/span&gt; &lt;span class="nc"&gt;.bar&lt;/span&gt; &lt;span class="nc"&gt;.error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.baz&lt;/span&gt; &lt;span class="nc"&gt;.buzz&lt;/span&gt; &lt;span class="nc"&gt;.error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Yikes. Is it even worth the trouble?&lt;/p&gt;

&lt;p&gt;The real answer is...maybe? If you're running into selector issues, consider using a mixin instead. But if you totally understand how &lt;code&gt;@extend&lt;/code&gt; works, and there's a use-case that stands out, great! &lt;em&gt;Go for it!&lt;/em&gt; Otherwise, it may not be worth forcing into a stylesheet just for the sake of using it.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Simple Site Containers with CSS Grid</title>
      <dc:creator>Ian Gloude</dc:creator>
      <pubDate>Tue, 06 Aug 2019 03:10:16 +0000</pubDate>
      <link>https://dev.to/iangloude/simple-site-containers-with-css-grid-17m</link>
      <guid>https://dev.to/iangloude/simple-site-containers-with-css-grid-17m</guid>
      <description>&lt;p&gt;Every site needs a conainer of some sort. Here's a way to leverage CSS Grid to make pulling content in and out of your page's container a breeze. We'll be working toward replicating this example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uF8V72qI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ojq11g2nq1omtg7rgyh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uF8V72qI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ojq11g2nq1omtg7rgyh8.png" alt="CSS Grid Container Example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've got a column of text, centered on the page, and a highlighted section with a full-width background and text that horizontally aligns with its other siblings.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Container
&lt;/h2&gt;

&lt;p&gt;To create a centered column for our content, we’ll need three columns in our parent grid. But before that, we need to invoke the dark, mystical power of CSS grid. Follow the spell closely: &lt;code&gt;display: grid;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Got it? Great. Magic isn’t so hard after all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The FR Unit
&lt;/h2&gt;

&lt;p&gt;Next we need to understand another magical piece of CSS: the &lt;code&gt;fr&lt;/code&gt; (fractional) unit. This unit’s value is the relationship between its fr value compared to all the children of its parent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Example:&lt;br&gt;&lt;br&gt;
If we have a containing parent element that is 300px wide, a single child with a width of 1fr would also be 300px wide. Two children with a width of 1fr would be 150px each. One child with 1fr and a second child with 2fr would be 100px and 200px, respectively.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Minmax
&lt;/h2&gt;

&lt;p&gt;The final building block we’ll use is &lt;code&gt;minmax()&lt;/code&gt;. The function takes 2 parameters and works exactly like it sounds. Using &lt;code&gt;minmax(10px, 100px)&lt;/code&gt; on a column would make it at least &lt;code&gt;10px&lt;/code&gt; wide, but no more than &lt;code&gt;100px&lt;/code&gt; wide.&lt;/p&gt;

&lt;p&gt;We won't dive into it in this article, but combining &lt;code&gt;minmax()&lt;/code&gt; with CSS Custom Properties is insanely satisfying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Columns
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;grid-template-columns&lt;/code&gt; explicitly assign columns to a grid element. To get a responsive layout, we'll put &lt;code&gt;minmax()&lt;/code&gt; to work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;30em&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The code above creates three columns. The first and third are flexible between &lt;code&gt;1em&lt;/code&gt; and &lt;code&gt;1fr&lt;/code&gt;. The center column will be between 0 and 30em wide. In this case, if the viewport width is over 32em (1em + 30em + 1em). The first and third columns will take up an equal amount of the remaining space, creating a centered container.&lt;/p&gt;

&lt;p&gt;Why not &lt;code&gt;max-width: 30em;&lt;/code&gt; and &lt;code&gt;margin: 0 auto;&lt;/code&gt; you might ask? Just hang on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Naming Columns
&lt;/h2&gt;

&lt;p&gt;We have 3 columns, and 4 column lines we can align content to. To contain an element inside the center column, we would add &lt;code&gt;grid-column: 2 / 3;&lt;/code&gt; to a child of &lt;code&gt;.container&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To simplify this, we can names to grid lines using the following syntax: &lt;code&gt;[linename-start]&lt;/code&gt; and &lt;code&gt;[linename-end]&lt;/code&gt;. Adding line names to our template results in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;viewport-start&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;container-start&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;30em&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;container-end&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;viewport-end&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Obedient Children
&lt;/h2&gt;

&lt;p&gt;Now we can take our container's children and tell them where to live. And what to do. And when to go to bed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.item--full&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.item--contained&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you can probably guess, &lt;code&gt;.item--full&lt;/code&gt; will span the width of all three columns, and &lt;code&gt;.item--contained&lt;/code&gt; will span only the center column.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inheritance
&lt;/h2&gt;

&lt;p&gt;The final trick to our layout is aligning the content inside an element with the &lt;code&gt;.item--full&lt;/code&gt; class. We’ll need to pass down the parent grid to the &lt;code&gt;.item--full&lt;/code&gt; child.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.item--full&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inherit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inherit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, the &lt;code&gt;.item--full&lt;/code&gt; class is a grid container of its own. Since it spans the full width of the parent grid, the resulting nested grid is essentially a carbon copy laid on top of its parent, with the addition of declaring &lt;code&gt;grid-column: container;&lt;/code&gt; on every direct descendent.&lt;/p&gt;

&lt;p&gt;Take a look at the final result:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/igloude/embed/pPVPxP?height=600&amp;amp;default-tab=css&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Happy Gridding!&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
