diff options
author | Bradley Taunt <brad@bt.ht> | 2023-11-27 12:25:51 -0500 |
---|---|---|
committer | Bradley Taunt <brad@bt.ht> | 2023-11-27 12:25:51 -0500 |
commit | 14d227d46a2177a8928333894252d6299f531097 (patch) | |
tree | d41d48383d012f53823c9816a820e4e88c572c41 /posts/super-mario-blocks-css.md | |
parent | f6eed1a8c2f4fbf91fac9edd11e50f5c0ec939a2 (diff) |
Trying to render posts all at once
Diffstat (limited to 'posts/super-mario-blocks-css.md')
-rw-r--r-- | posts/super-mario-blocks-css.md | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/posts/super-mario-blocks-css.md b/posts/super-mario-blocks-css.md new file mode 100644 index 0000000..309b719 --- /dev/null +++ b/posts/super-mario-blocks-css.md @@ -0,0 +1,222 @@ +# Super Mario Blocks in CSS + +2019-02-15 + +Just because we can, let's make a quick demo on how to build interactive elements based off the original Mario punch blocks. + +What our final product will look like: + +![Mario blocks cretaed with CSS](/public/images/mario-block.png) + +[Live CodePen Example](https://codepen.io/bradleytaunt/pen/JjEPOVe) + +## The HTML + +The set of Mario blocks doesn't require a huge amount of effort for it's `html` structure, we only need: + +- Parent div for each block +- Checkbox input +- Checkbox label +- Inner label divs to represent the block "dots" + +**Sidenote**: This is only how *I* chose to add the inner dots to the Mario blocks. There are many other ways to create these, so please feel free to implement them however you see fit. + + + <!-- Main parent block --> + <div class="mario-block"> + + <!-- Checkbox input (disabled by default) --> + <input type="checkbox" id="1" disabled> + + <!-- Checkbox label --> + <label for="1"> + <!-- Inner dots for blocks --> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + </label> + + </div> + + +Now we just add as many default blocks we want, along with the interactive punch block (`.mario-block--question`): + + + <div class="mario-block"> + <input type="checkbox" id="1" disabled> + <label for="1"> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + </label> + </div> + + <div class="mario-block"> + <input type="checkbox" id="2" disabled> + <label for="2"> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + </label> + </div> + + <div class="mario-block mario-block--question"> + <input type="checkbox" id="3"> + <label for="3"> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + <div class="question-mark"></div> + </label> + </div> + + <div class="mario-block"> + <input type="checkbox" id="4" disabled> + <label for="4"> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + <div class="dot"></div> + </label> + </div> + + +## The CSS + +First we need to remove the default `checkbox` input styling and place all new styling on it's corresponding `label`. + + + /* Mario block parent div */ + .mario-block { + display: inline-block; + height: 80px; + margin-right: -7px; /* Fixes inline-block margin bug */ + position: relative; + width: 80px; + } + + /* Hide default checkbox input */ + .mario-block input { + position: absolute; + visibility: hidden; + z-index: -1; + } + + +Now to target the `label` elements found inside the block: + + + /* Style checkbox label accordingly */ + .mario-block label { + background: #F88D2E; + border: 4px solid #070000; + box-shadow: inset -4px -4px 0 #965117, inset 4px 4px 0 #FAB89B; + display: block; + height: 100%; + position: relative; + width: 100%; + } + + +Next we style our included `.dots` elements to be placed in the four corners of each block: + + + .mario-block .dot { + background: #070000; + height: 5px; + position: absolute; + width: 5px; + } + .mario-block .dot:nth-child(1) { + left: 4px; + top: 4px; + } + .mario-block .dot:nth-child(2) { + right: 4px; + top: 4px; + } + .mario-block .dot:nth-child(3) { + bottom: 4px; + left: 4px; + } + .mario-block .dot:nth-child(4) { + bottom: 4px; + right: 4px; + } + + +### Punch-able block + +Now we need to include the "question mark" SVG and custom CSS for the interactive Mario block. You can <a href="/public/images/mario-block-question-mark.svg">download a copy</a> of the custom `svg` question mark I created. + + + .mario-block--question label { + cursor: pointer; + } + .mario-block--question .question-mark { + background-image: url('/public/images/mario-block-question-mark.svg'); + background-position: center; + background-repeat: no-repeat; + background-size: 40px; + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; + } + + +### The last piece + +The last item we need to design is the `checked` state of the interactive question mark block. The extra inner dark dashes will be added as `pseudo` elements: + + + /* Mario block in `checked` state */ + .mario-block input:checked + label { + background: #885818; + box-shadow: inset -4px -4px 0 #68400B, inset 4px 4px 0 #FAB89B; + } + + /* Hide both the default dots and question mark svg on checked */ + .mario-block input:checked + label .dot, + .mario-block input:checked + label .question-mark { + display: none; + } + + /* Shared pseudo element styling */ + .mario-block input:checked + label:before, + .mario-block input:checked + label:after { + content: ''; + height: 20px; + position: absolute; + transform: rotate(45deg); + width: 20px; + } + + /* Right dash */ + .mario-block input:checked + label:before { + border-right: 4px solid #070000; + right: 18px; + top: 15px; + transform: rotate(45deg); + } + + /* Left dash */ + .mario-block input:checked + label:after { + border-left: 4px solid #070000; + left: 18px; + top: 15px; + transform: rotate(-45deg); + } + + +That's it! + +## Taking it further + +As always, you can take this concept and flesh it out even further. I was trying to mimic the "pixel" style of the original Mario games, but you could make the lighting and depth more realistic with some extra subtle gradients or `filter` properties. |