Показать сообщение отдельно
  #5 (permalink)  
Старый 07.04.2020, 10:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Сообщение от Lefseq
рамки инпутов подсвечивались красным?
строка 45 и 138

<style>

form {
    max-width: 20em;
    padding: 1em;
    margin: auto;
    font: 1em system-ui;
}

form > * {
    display: flex;
    flex-direction: column;
    margin-bottom: 1em;
}

input, button, select, textarea { font: inherit; }

textarea { resize: vertical; }

fieldset {
    border: 1px solid #f1f1f1;
    border-radius: 0.5em;
    flex-direction: row;
}

input:not([type]), input[type="tel"], input[type="email"], input[type="date"], input[type="number"], textarea {
    border: none;
    border-radius: 0.5em;
    background: #f1f1f1;
    padding: 0.5em;
}

span.error-message {
    padding: 0.5em;
    border-radius: 0.5em;
    color: #F44336;
    font-size: 80%;
    font-weight: bold;
    display: block;
}

:valid + span.error-message {
    display: none;
}
.err input:invalid {
    border: 2px solid #FF0000;
   }
</style>

<form>
    <label>
        Фамилия
        <input name="family" required autocomplete="family-name" minlength="1" pattern="\s*\S([\s\S]*\S)?\s*"
            data-custom-validity="Введите свою фамилию!">
    </label>

    <label>
        Имя
        <input name="name" required autocomplete="given-name" minlength="1" pattern="\s*\S([\s\S]*\S)?\s*"
            data-custom-validity="Введите своё имя!">
    </label>

    <label>
        Телефон
        <input name="phone" type="tel" required autocomplete="tel"
            data-custom-validity="Введите свой номер телефона!">
    </label>

    <label>
        Э-почта
        <input name="mail" type="email" required autocomplete="email"
            data-custom-validity="Введите свой Email!">
    </label>

    <label>
        Дата отправки
        <input name="date" type="date" required
            data-custom-validity="Введите дату!">
    </label>

    <fieldset>
        <legend>Подтверждение</legend>
        <label>
            <input name="check" type="checkbox" required
            data-custom-validity="Подтвердите!">
            Согласен с условиями
        </label>
    </fieldset>


    <fieldset>
        <legend>Пол</legend>
        <label>
            <input name="radio" type="radio" value="male" required autocomplete="sex"
            data-custom-validity="Выберите свой пол!">
            Мужчина
        </label>
        <label>
            <input name="radio" type="radio" value="female" required autocomplete="sex"
            data-custom-validity="Выберите свой пол!">
            Женщина
        </label>
    </fieldset>

    <label>
        Сообщение
        <textarea name="text" required minlength="10" maxlength="1500"
            data-custom-validity="Заполните поле (от 10 до 1500 символов)!"></textarea>
    </label>

    <label>
        Год рождения
        <input name="select" type="number" min="1880" max="2001" step="1" required autocomplete="bday-year" size="4"
            data-custom-validity="Введите год рождения (18+)">
    </label>

    <button>Отправить</button>
</form>

<script>

    addEventListener("change", ({ target }) => {
        target.checkValidity()
    });

    for(const element of document.querySelector("form").elements) {
        element.addEventListener("invalid", event => {
            event.preventDefault();

            for(const label of event.target.labels) {
                for(const errorMessage of label.querySelectorAll(".error-message"))
                    errorMessage.remove();

                const errorMessage = document.createElement("span");
                errorMessage.className = "error-message";
                errorMessage.textContent = event.target.dataset.customValidity || event.target.validationMessage;
                label.append(errorMessage); 
                label.classList.toggle("err", !event.target.validity.valid)
            }
        });
    }

</script>
Ответить с цитированием