JSFiddle - React, Tailwind, and code Playground
HTML
<body style="background-color: lightgray;">
<div class="keyboard">
<textarea name="area" id="" cols="30" rows="10" disabled>texttexttexttexttext</textarea>
<div class="keyboard__row">
<div class="btn">`</div>
<div class="btn">1</div>
<div class="btn">2</div>
<div class="btn">3</div>
<div class="btn">4</div>
<div class="btn">5</div>
<div class="btn">6</div>
<div class="btn">7</div>
<div class="btn">8</div>
<div class="btn">9</div>
<div class="btn">0</div>
<div class="btn">-</div>
<div class="btn">=</div>
<div class="btn btn--backspace">Backspace</div>
</div>
<div class="keyboard__row">
<div class="btn btn--tab" id="tab">Tab</div>
<div class="btn">q</div>
<div class="btn">w</div>
<div class="btn">e</div>
<div class="btn">r</div>
<div class="btn">t</div>
<div class="btn">y</div>
<div class="btn">u</div>
<div class="btn">i</div>
<div class="btn">o</div>
<div class="btn">p</div>
<div class="btn">[</div>
<div class="btn">]</div>
<div class="btn">\</div>
</div>
<div class="keyboard__row">
<div class="btn btn--capslock">CapsLock</div>
<div class="btn">a</div>
<div class="btn">s</div>
<div class="btn">d</div>
<div class="btn">f</div>
<div class="btn">g</div>
<div class="btn">h</div>
<div class="btn">j</div>
<div class="btn">k</div>
<div class="btn">l</div>
<div class="btn">;</div>
<div class="btn">'</div>
<div class="btn btn--enter">Enter</div>
</div>
<div class="keyboard__row">
<div class="btn...
CSS
*, *::before, *::after {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* make sure to set some focus styles for accessibility */
:focus {
outline: 0;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
input[type=search]::-webkit-search-cancel-button,
input[type=search]::-webkit-search-decoration,
input[type=search]::-webkit-search-results-button,
input[type=search]::-webkit-search-results-decoration {
-webkit-appearance: none;
-moz-appearance: none;
}
input[type=search] {
-webkit-appearance: none;
-moz-appearance: none;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
textarea {
overflow: auto;
vertical-align: top;
resize: vertical;
}
/**
* Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
*/
audio,
canvas,
video {
display: inline-block;
*display: inline;
*zoom: 1;
max-width: 100%;
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
...
JavaScript
const BTN = document.querySelectorAll('.btn');
const TEXTAREA = document.querySelector('textarea');
let flag = false;
let tab = '    ';
window.addEventListener('keydown', (event) => {
if (event.key === 'Tab') {
flag = true;
event.preventDefault();
TEXTAREA.value += tab;
}
BTN.forEach(index => {
if (index.textContent === event.key.toLowerCase()) {
index.style.cssText = 'background-color: gray; color: white;';
if (event.key !== 'Tab' && event.key !== 'CapsLock' && event.key !== 'Shift' && event.key !== 'Enter' && event.key !== 'Backspace') {
TEXTAREA.value += `${event.key}`;
}
}
});
});
window.addEventListener('keyup', () => {
BTN.forEach(index => {
index.style.cssText = 'background-color: white; color: black;';
});
});