I
I
IckiSanZ2018-05-09 00:26:54
css
IckiSanZ, 2018-05-09 00:26:54

Playing a CSS animation when a key is pressed on the keyboard. How to solve the problem?

Hello, there is a keyboard trainer that has a keyboard layout below the input field. When a key is pressed, if keypress matches the letter to be entered, the specific key should flash green on the layout, and red if it does not match. I implemented this crookedly by changing the value of animation , but it turns out that the animation is played only once on the first click, and nothing happens on subsequent clicks.
Link to jsfiddle
HTML snippet:

<div id="container">
    <ul id="keyboard">
        <li class="symbol"><span class="off"><b>`</b></span><span class="on">~</span></li>
        <li class="symbol"><span class="off"><b>1</b></span><span class="on">!</span></li>
        <li class="symbol"><span class="off"><b>2</b></span><span class="on">@</span></li>
        <li class="symbol"><span class="off"><b>3</b></span><span class="on">#</span></li>
        <li class="symbol"><span class="off"><b>4</b></span><span class="on">$</span></li>
        <li class="symbol"><span class="off"><b>5</b></span><span class="on">%</span></li>
        <li class="symbol"><span class="off"><b>6</b></span><span class="on">^</span></li>
        <li class="symbol"><span class="off"><b>7</b></span><span class="on">&amp;</span></li>
        <li class="symbol"><span class="off"><b>8</b></span><span class="on">*</span></li>
        <li class="symbol"><span class="off"><b>9</b></span><span class="on">(</span></li>
        <li class="symbol"><span class="off"><b>0</b></span><span class="on">)</span></li>
        <li class="symbol"><span class="off"><b>-</b></span><span class="on">_</span></li>
        <li class="symbol"><span class="off"><b>=</b></span><span class="on">+</span></li>
        <li class="delete lastitem"><b>delete</li>
        <li class="tab"><b>tab</b></li>
        <li class="letter" id="q"><b>q</b></li>
        <li class="letter" id="w"><b>w</b></li>
        <li class="letter" id="e"><b>e</b></li>
        <li class="letter" id="r"><b>r</b></li>
        <li class="letter" id="t"><b>t</b></li>
        <li class="letter" id="y"><b>y</b></li>
        <li class="letter" id="u"><b>u</b></li>
        <li class="letter" id="i"><b>i</b></li>
        <li class="letter" id="o"><b>o</b></li>
        <li class="letter" id="p"><b>p</b></li>
        <li class="symbol"><span class="off"><b>[</b></span><span class="on">{</span></li>
        <li class="symbol"><span class="off"><b>]</b></span><span class="on">}</span></li>
        <li class="symbol lastitem"><span class="off"><b>\</b></span><span class="on">|</span></li>
        <li class="capslock"><b>caps lock</b></li>
        <li class="letter" id="a"><b>a</b></li>
        <li class="letter" id="s"><b>s</b></li>
        <li class="letter" id="d"><b>d</b></li>
        <li class="letter" id="f"><b>f</b></li>
        <li class="letter" id="g"><b>g</b></li>
        <li class="letter" id="h"><b>h</b></li>
        <li class="letter" id="j"><b>j</b></li>
        <li class="letter" id="k"><b>k</b></li>
        <li class="letter" id="l"><b>l</b></li>
        <li class="symbol"><span class="off"><b>;</b></span><span class="on">:</span></li>
        <li class="symbol"><span class="off"><b>'</b></span><span class="on">&quot;</span></li>
        <li class="return lastitem"><b>enter</li>
        <li class="left-shift"><b>shift</b></li>
        <li class="letter" id="z"><b>z</b></li>
        <li class="letter" id="x"><b>x</b></li>
        <li class="letter" id="c"><b>c</b></li>
        <li class="letter" id="v"><b>v</b></li>
        <li class="letter" id="b"><b>b</b></li>
        <li class="letter" id="n"><b>n</b></li>
        <li class="letter" id="m"><b>m</b></li>
        <li class="symbol"><span class="off"><b>,</b></span><span class="on">&lt;</span></li>
        <li class="symbol"><span class="off"><b>.</b></span><span class="on">&gt;</span></li>
        <li class="symbol"><span class="off"><b>/</b></span><span class="on">?</span></li>
        <li class="right-shift lastitem"><b>shift</b></li>
        <li class="space lastitem"><b>&nbsp;</b></li>
    </ul>
    </div>

CSS snippet:
#container {
margin: 100px auto;
width: 688px;
}
#keyboard {
margin: 0;
padding: 0;
list-style: none;
transform: translate(227px, 134px);
}
    #keyboard li {
    float: left;
    margin: 0 7px 7px 0;
    width: 55px;
    height: 55px;
    line-height: 55px;
    text-align: center;
    background: #fff;
    border: 0.3px solid grey;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    font-family: 'Montserrat', sans-serif;
    }
        .capslock, .tab, .left-shift {
        clear: left;
        }
            #keyboard .tab, #keyboard .delete {
            width: 85px;
            }
            #keyboard .capslock {
            width: 95px;
            }
            #keyboard .return {
            width: 108px;
            }
            #keyboard .left-shift {
            width: 110px;
            }
            #keyboard .right-shift {
            width: 158px;
            }
        .lastitem {
        margin-right: 0;
        }
        .uppercase {
        text-transform: uppercase;
        }
        #keyboard .space {
        clear: left;
        width: 902px;
        }
        .on {
        display: none;
        }
        #keyboard li:hover {
        position: relative;
        top: 1px;
        left: 1px;
        border-color: #e5e5e5;
        cursor: pointer;
        }

@keyframes greenBtn {
from {background-color: white;}
50% {background: green;}
to {background: white;}
}
@keyframes redBtn {
from {background-color: white;}
50% {background: red;}
to {background: white;}
}

JS snippet:
...
} else if(levelText[counterLetters] == keyName){
          keyName = keyName.toLowerCase();
          console.log("Введен символ"); //просто проверка
          levelText = levelText.substring(1);
          text.innerHTML = levelText;
          document.getElementById(keyName).style.animation = "greenBtn 0.2s linear";
...
      } else {
      	console.log("Введен неверный символ");
      	//тут будет код, оповещающий об ошибке
      	mistakesCounter++;
      	mistakes.innerHTML = ("Кол-во ошибок: " + mistakesCounter);
      	document.getElementById(keyName).style.animation = "redBtn 0.2s linear 1";
      }

Full code
Thank you for your help

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Alexander Aksentiev, 2018-05-09
@IckiSanZ

https://jsfiddle.net/yan5vcpn/
wow and some magic
https://css-tricks.com/restart-css-animation/#arti...

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question