Vlastní validační ikonky
Smartform umožňuje nastavit si vlastní stavové ikonky (defaultně zelená OK, červená při chybě).
V následující ukázce se stavové ikonky při zobrazení trochu zatočí.
Formulář s vlastními stavovými ikonkami s animací:
Zdrojový kód – JavaScript:
<script type="text/javascript" src="https://client.smartform.cz/v2/smartform.js" async></script>
<script type="text/javascript">
var smartform = smartform || {};
smartform.beforeInit = function () {
smartform.setClientId('[clientId]');
}
smartform.afterInit = function() {
smartform.getInstance().emailControl.setShowValidationStateEnabled(true);
smartform.getInstance().emailControl.setShowMessageEnabled(true);
smartform.getInstance().emailControl.setValidationStateCssClasses(
'custom-valid-icon',
'custom-warning-icon',
'',
'custom-waiting-icon');
var input = document.getElementById('mail');
input.classList.add('shake');
input.addEventListener('animationend', function() {
input.classList.remove('shake');
});
}
</script>
Zdrojový kód – HTML pro formulář:
<form>
<input class="smartform-email" id="mail" placeholder="Zadejte e-mailovou adresu" required="" type="text" />
</form>
Zdrojový kód – CSS:
/* Odebereme původní pozadí a připravíme prostor pro ikonu */
.custom-valid-icon,
.custom-warning-icon {
background: none !important;
padding-right: 2rem; /* Rezerva pro ikonku vpravo */
position: relative; /* Pro absolutní umístění pseudo-elementu */
}
/* Klíčové snímky pro otáčecí animaci */
@keyframes rotateIn {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Pseudo-element pro validní stav (zelená fajfka) */
.custom-valid-icon::after {
content: '';
position: absolute;
top: 50%; right: 0.5rem;
width: 1rem; height: 1rem;
margin-top: -0.5rem;
/* Bublina s fajfkou ve středu */
background: #e0f7e9 url('data:image/svg+xml;utf8,\
') no-repeat center center;
background-size: 1rem;
/* Otočení ikonky při zobrazení */
animation: rotateIn 0.6s ease-in-out;
transform-origin: center center;
}
/* Pseudo-element pro varování (oranžový vykřičník) */
.custom-warning-icon::after {
content: '';
position: absolute;
top: 50%; right: 0.5rem;
width: 1rem; height: 1rem;
margin-top: -0.5rem;
/* Bublina s vykřičníkem ve středu */
background: #fff4e5 url('data:image/svg+xml;utf8,\
') no-repeat center center;
background-size: 1rem;
/* Otočení ikonky při zobrazení */
animation: rotateIn 0.6s ease-in-out;
transform-origin: center center;
}
/* Třída pro stav čekání – modrý točící se spinner */
.custom-waiting-icon {
position: relative;
padding-right: 2rem; /* Rezerva pro spinner */
}
.custom-waiting-icon::after {
content: '';
position: absolute;
top: 50%; right: 0.5rem;
width: 1rem; height: 1rem;
margin-top: -0.5rem;
border: 2px solid #2196F3;
border-top-color: transparent; /* Díra na spinneru */
border-radius: 50%;
animation: spin 0.8s linear infinite; /* Nekonečné otáčení */
}
/* Klíčové snímky pro spin animaci */
@keyframes spin {
to { transform: rotate(360deg); }
}
/* Shake animace pro celý input */
@keyframes shake {
0%, 100% { transform: translateX(0); }
20%, 60% { transform: translateX(-8px); }
40%, 80% { transform: translateX(8px); }
}
.shake {
animation: shake 0.6s ease-in-out;
}