No point here really. I had no idea you could refer to an HTML attribute in a pseudo :before or :after with content: attr(attr-name). Mind blown.
Works on my computer, not so sure about yours...
A Pen by Jake Albaugh on CodePen.
| <div id='mac'> | |
| <textarea></textarea> | |
| <div id='no-focus'> | |
| Click to Wake | |
| </div> | |
| </div> | |
| <div id='kb'> | |
| <div class='kb-row'> | |
| <div class='k k-tld' id='kc-192' pre='~' suf=''></div> | |
| <div class='k k-1' id='kc-49' pre='!' suf='1'></div> | |
| <div class='k k-2' id='kc-50' pre='@' suf='2'></div> | |
| <div class='k k-3' id='kc-51' pre='#' suf='3'></div> | |
| <div class='k k-4' id='kc-52' pre='$' suf='4'></div> | |
| <div class='k k-5' id='kc-53' pre='%' suf='5'></div> | |
| <div class='k k-6' id='kc-54' pre='^' suf='6'></div> | |
| <div class='k k-7' id='kc-55' pre='&' suf='7'></div> | |
| <div class='k k-8' id='kc-56' pre='*' suf='8'></div> | |
| <div class='k k-9' id='kc-57' pre=')' suf='9'></div> | |
| <div class='k k-0' id='kc-48' pre='(' suf='0'></div> | |
| <div class='k k-min' id='kc-189' pre='_' suf='-'></div> | |
| <div class='k k-eq' id='kc-187' pre='+' suf='='></div> | |
| <div class='k k-del k-txt' id='kc-8' suf='delete'></div> | |
| </div> | |
| <div class='kb-row'> | |
| <div class='k k-tab k-txt' id='kc-9' suf='tab'></div> | |
| <div class='k k-q' id='kc-81' pre='q'></div> | |
| <div class='k k-w' id='kc-87' pre='w'></div> | |
| <div class='k k-e' id='kc-69' pre='e'></div> | |
| <div class='k k-r' id='kc-82' pre='r'></div> | |
| <div class='k k-t' id='kc-84' pre='t'></div> | |
| <div class='k k-y' id='kc-89' pre='y'></div> | |
| <div class='k k-u' id='kc-85' pre='u'></div> | |
| <div class='k k-i' id='kc-73' pre='i'></div> | |
| <div class='k k-o' id='kc-79' pre='o'></div> | |
| <div class='k k-p' id='kc-80' pre='p'></div> | |
| <div class='k k-obrace' id='kc-219'></div> | |
| <div class='k k-cbrace' id='kc-221'></div> | |
| <div class='k k-bslash' id='kc-220' pre='|' suf='\ '></div> | |
| </div> | |
| <div class='kb-row'> | |
| <div class='k k-caps k-txt' id='kc-20' pre='•' suf='caps lock'></div> | |
| <div class='k k-a' id='kc-65' pre='a'></div> | |
| <div class='k k-s' id='kc-83' pre='s'></div> | |
| <div class='k k-d' id='kc-68' pre='d'></div> | |
| <div class='k k-f' id='kc-70' pre='f'></div> | |
| <div class='k k-g' id='kc-71' pre='g'></div> | |
| <div class='k k-h' id='kc-72' pre='h'></div> | |
| <div class='k k-j' id='kc-74' pre='j'></div> | |
| <div class='k k-k' id='kc-75' pre='k'></div> | |
| <div class='k k-l' id='kc-76' pre='l'></div> | |
| <div class='k k-semi' id='kc-186' pre=':' suf=';'></div> | |
| <div class='k k-quot' id='kc-222' pre='"' suf="'"></div> | |
| <div class='k k-return k-txt' id='kc-13' pre='enter' suf='return'></div> | |
| </div> | |
| <div class='kb-row'> | |
| <div class='k k-lshift k-txt' id='kc-16L' suf='shift'></div> | |
| <div class='k k-z' id='kc-90' pre='z'></div> | |
| <div class='k k-x' id='kc-88' pre='x'></div> | |
| <div class='k k-c' id='kc-67' pre='c'></div> | |
| <div class='k k-v' id='kc-86' pre='v'></div> | |
| <div class='k k-b' id='kc-66' pre='b'></div> | |
| <div class='k k-n' id='kc-78' pre='n'></div> | |
| <div class='k k-m' id='kc-77' pre='m'></div> | |
| <div class='k k-comma' id='kc-188' pre='<' suf=','></div> | |
| <div class='k k-period' id='kc-190' pre='>' suf='.'></div> | |
| <div class='k k-fslash' id='kc-191' pre='?' suf='/'></div> | |
| <div class='k k-rshift k-txt' id='kc-16R' suf='shift'></div> | |
| </div> | |
| <div class='kb-row'> | |
| <div class='k k-func k-txt' suf='fn'></div> | |
| <div class='k k-ctrl k-txt' id='kc-17' suf='control'></div> | |
| <div class='k k-lopt k-txt' id='kc-18L' pre='alt' suf='option'></div> | |
| <div class='k k-lcmnd k-txt' id='kc-91' pre='⌘' suf='command'></div> | |
| <div class='k k-space' id='kc-32'></div> | |
| <div class='k k-rcmnd k-txt' id='kc-93' pre='⌘' suf='command'></div> | |
| <div class='k k-ropt k-txt' id='kc-18R' pre='alt' suf='option'></div> | |
| <div class='k k-larr' id='kc-37' pre='▸'></div> | |
| <div class='k k-arr-udarr'> | |
| <div class='k k-uarr' id='kc-38' pre='▾'></div> | |
| <div class='k k-darr' id='kc-40' pre='▾'></div> | |
| </div> | |
| <div class='k k-rarr' id='kc-39' pre='▸'></div> | |
| </div> | |
| </div> |
No point here really. I had no idea you could refer to an HTML attribute in a pseudo :before or :after with content: attr(attr-name). Mind blown.
Works on my computer, not so sure about yours...
A Pen by Jake Albaugh on CodePen.
| $('#mac textarea').keydown (e) -> | |
| code = e.keyCode || e.which | |
| #console.log code | |
| if code == 18 || code == 16 | |
| $('#kc-'+code+'R').addClass('active') | |
| $('#kc-'+code+'L').addClass('active') | |
| else | |
| $('#kc-'+code).addClass('active') | |
| # spaces on tab | |
| if code == 9 | |
| start = @selectionStart | |
| end = @selectionEnd | |
| $this = $(this) | |
| value = $this.val() | |
| $this.val value.substring(0, start) + " " + value.substring(end) | |
| @selectionStart = @selectionEnd = start + 2 | |
| e.preventDefault() | |
| $('#mac').keyup (e) -> | |
| code = e.keyCode || e.which | |
| if code == 18 || code == 16 | |
| $('#kc-'+code+'R').removeClass('active') | |
| $('#kc-'+code+'L').removeClass('active') | |
| else | |
| $('#kc-'+code).removeClass('active') | |
| jakealbaughSignature("light") |
| @import url(http://fonts.googleapis.com/css?family=Open+Sans:300,400|Inconsolata) | |
| // millimeter | |
| $mil: 24px | |
| // keyboard vars | |
| $k-br: $mil * 0.15 // border radius | |
| $kb-inset: $mil * 0.4 // keyboard inset | |
| $k-h: $mil * 1.5 // key height | |
| $a-h: $k-h / 2 // arrow height | |
| $k-w: $mil * 1.5 // standard | |
| $k-w-2: $mil * 2 // cmnds | |
| $k-w-25: $mil * 2.5 // del and tab | |
| $k-w-3: $mil * 3 // caps and return | |
| $k-w-39: $mil * 3.9 // shifts | |
| $k-w-91: $mil * 9.1 // spacebar | |
| $kb-sp: $mil * 0.35 // spacing | |
| $kb-r-w: ($k-w-2 * 2) + ($k-w * 7) + $k-w-91 + ($kb-sp * 9) // row width | |
| $c-kb-bg: #f0f0f0 // keyboard background | |
| $c-k-bg: #fff // key background | |
| $c-k-c: #444 // key color | |
| $c-b-bg: #7F8C8D // body bg | |
| $c-mac: #222 // | |
| $c-mac-screen: #444 // screen color | |
| // mac vars | |
| $m-h-s: $mil * 12 | |
| $m-w-s: $kb-r-w | |
| body | |
| margin: 0 | |
| background-color: $c-b-bg | |
| font-family: 'Open Sans', 'Helvetica Neue', Helvetica, sans-serif | |
| // mac style | |
| #mac | |
| overflow-y: hidden | |
| animation: mac-intro 200ms forwards 1.5s | |
| max-height: 0 | |
| padding: 0 | |
| margin: 0 auto | |
| box-shadow: 0px 0px 0px 0px darken($c-b-bg, 30%) | |
| width: $m-w-s + ($kb-inset * 2) | |
| box-sizing: border-box | |
| background-color: $c-mac | |
| border-radius: 16px | |
| position: relative | |
| textarea | |
| border: none | |
| outline: none | |
| box-sizing: border-box | |
| resize: none | |
| font-family: Inconsolata, monospace | |
| padding: 24px | |
| font-size: $mil / 2 | |
| line-height: 1.4 | |
| background-color: $c-mac-screen | |
| color: $c-k-bg | |
| height: $m-h-s | |
| width: 100% | |
| position: relative | |
| opacity: 0.4 | |
| transition: opacity 200ms | |
| &:focus | |
| opacity: 1 | |
| & ~ #no-focus | |
| opacity: 0 | |
| animation: none | |
| #no-focus | |
| position: absolute | |
| animation: glow 1s infinite | |
| transition: opacity 200ms | |
| color: white | |
| text-transform: uppercase | |
| display: block | |
| top: 50% | |
| left: 50% | |
| transform: translate(-50%,-50%) | |
| cursor: pointer | |
| pointer-events: none | |
| // keyboard style | |
| #kb | |
| padding: $kb-inset | |
| box-sizing: border-box | |
| background-color: $c-kb-bg | |
| width: $kb-r-w + ($kb-inset * 2) | |
| border-radius: $k-br * 2 | |
| margin: 24px auto | |
| box-shadow: 0px 4px 0px 2px darken($c-kb-bg, 20%) | |
| .kb-row | |
| margin-bottom: $kb-sp | |
| font-size: 0 | |
| width: $kb-r-w | |
| &:last-child | |
| margin-bottom: 0 | |
| .k | |
| display: inline-block | |
| position: relative | |
| width: $k-w | |
| height: $k-h | |
| margin-right: $kb-sp | |
| border-radius: $k-br | |
| background-color: $c-k-bg | |
| color: $c-k-c | |
| box-shadow: 0px 2px 0px 1px darken($c-kb-bg, 10%) | |
| // active style | |
| &.active | |
| box-shadow: 0px -1px 0px 1px darken($c-kb-bg, 10%) | |
| // far right child | |
| &:last-child | |
| margin-right: 0 | |
| float: right | |
| // labels | |
| &:before | |
| content: attr(pre) '\a' attr(suf) | |
| white-space: pre | |
| text-align: center | |
| position: absolute | |
| font-size: $mil / 2 | |
| text-transform: uppercase | |
| top: 50% | |
| left: 50% | |
| transform: translate(-50%,-50%) | |
| // text content | |
| &.k-txt | |
| &:before | |
| font-size: $mil / 3 | |
| text-transform: none | |
| // caps lock | |
| &.k-caps | |
| &:after | |
| content: attr(pre) '\a' | |
| top: $kb-sp / 2 | |
| font-size: $mil / 2 !important | |
| &.active | |
| &:after | |
| color: #2ecc71 | |
| text-shadow: 0px 0px 4px lighten(#2ecc71, 20%) | |
| &:before | |
| content: '\a' attr(suf) | |
| bottom: $kb-sp / 2 | |
| &:before, | |
| &:after | |
| white-space: pre | |
| position: absolute | |
| font-size: $mil / 3 | |
| text-align: left | |
| width: 80% | |
| left: $kb-sp / 2 | |
| top: auto | |
| transform: translate(0, 0) | |
| // arrows | |
| &.k-larr, &.k-rarr, &.k-uarr, &.k-darr | |
| height: $a-h | |
| line-height: $a-h | |
| // up and down arrow | |
| &.k-arr-udarr | |
| display: inline-block | |
| width: $k-w | |
| height: $k-h | |
| margin-right: $kb-sp | |
| background-color: transparent | |
| &, &.active | |
| box-shadow: none | |
| .k | |
| display: block | |
| margin: 0 0 1px | |
| &:first-child | |
| border-radius: $k-br $k-br 0 0 | |
| &:last-child | |
| marigin-bottom: 0 | |
| border-radius: 0 0 $k-br $k-br | |
| // right arrow | |
| &.k-rarr | |
| margin-top: $a-h | |
| // cmnds | |
| &.k-lcmnd, &.k-rcmnd | |
| width: $k-w-2 | |
| // tab and delete | |
| &.k-tab, &.k-del | |
| width: $k-w-25 | |
| // caps and return | |
| &.k-caps, &.k-return | |
| width: $k-w-3 | |
| // shifts | |
| &.k-lshift, &.k-rshift | |
| width: $k-w-39 | |
| // space | |
| &.k-space | |
| width: $k-w-91 | |
| // :before overrides | |
| =before-left-align | |
| text-align: left | |
| width: 80% | |
| left: $kb-sp / 2 | |
| top: auto | |
| bottom: $kb-sp / 2 | |
| transform: translate(0, 0) | |
| =before-right-align | |
| text-align: right | |
| left: auto | |
| right: $kb-sp / 2 | |
| top: auto | |
| bottom: $kb-sp / 2 | |
| transform: translate(0, 0) | |
| // right aligns | |
| &.k-del, &.k-return, &.k-rshift, &.k-ropt, &.k-lcmnd | |
| &:before | |
| +before-right-align | |
| // left aligns | |
| &.k-rcmnd, &.k-lopt, &.k-ctrl, &.k-fn, &.k-lshift, &.k-caps, &.k-tab, &.k-func | |
| &:before | |
| +before-left-align | |
| // ` | |
| &.k-tld | |
| &:before | |
| content: attr(pre) '\a `' | |
| &.k-obrace | |
| &:before | |
| content: '{\a[' | |
| &.k-cbrace | |
| &:before | |
| content: '}\a]' | |
| &.k-uarr, &.k-larr | |
| &:before | |
| transform: translate(-50%, -50%) rotate(180deg) | |
| @keyframes mac-intro | |
| 0% | |
| max-height: 0 | |
| padding: 0 | |
| margin: 0 auto | |
| box-shadow: 0px 0px 0px 0px darken($c-b-bg, 30%) | |
| 100% | |
| max-height: $m-h-s + ($kb-inset * 8) | |
| margin: 24px auto 0 | |
| padding: $kb-inset * 4 | |
| box-shadow: 0px 2px 0px 1px darken($c-b-bg, 30%) | |
| @keyframes glow | |
| 0% | |
| opacity: 1 | |
| 50% | |
| opacity: 0.2 | |
| 100% | |
| opacity: 1 |