Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прокрутка к обязательному полю (https://javascript.ru/forum/misc/80654-prokrutka-k-obyazatelnomu-polyu.html)

Bond 09.07.2020 15:14

Прокрутка к обязательному полю
 
Всем привет.
Есть форма с обязательными полями - кастомной валидации нет - только по required браузерная.
Стандартное поведение браузера - при попытке отправить форму браузер прокручивает к первому полю которое не заполнено - но получается так что отступ поля от верха страницы слишком маленький - это поле закрывается фиксированным меню.
Можно ли как то увеличить этот оступ не делая свою кастомную валидацию? К примеру что бы первое пустое поле прокручивалось на средину страницы а не в самый верх

Nexus 09.07.2020 15:43

<header></header>

<form>
  
  <div style="height: 500px"></div>
  
  <input type="text" required/>
  
  <div style="height: 3000px"></div>
  
  <input type="submit"/>
  
</form>

<style>
    body {
      padding-top: 50px;
    }

    header {
      height: 50px; 
      background: red;
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      opacity: 0.5
    }
</style>

<script>
    document.querySelector('form [type="submit"]').addEventListener('click', function () {
        const OFFSET_TOP = 25;
        
        const form = this.closest('form');
        const invalidField = [].filter.call(form.querySelectorAll('[required]'), function (field) {
            return !field.value;
        }).shift();

        if (!invalidField) {
            return;
        }

        const headerHeight = document.querySelector('header').offsetHeight;
        
        window.scrollTo(0, invalidField.getBoundingClientRect().top + document.body.scrollTop - headerHeight - OFFSET_TOP);
    });
</script>

Bond 09.07.2020 16:23

Nexus,
Я хотел уточнить куда копать, а вы даже код дали. Огромное спасибо!.
Чет и не подумал сразу что можно на клик и свой скрол сделать. ))

laimas 09.07.2020 16:26

Цитата:

Сообщение от Nexus
return !field.value;

Скорее нужно проверять валидно ли значение, а не пусто ли оно.

Nexus 09.07.2020 17:17

Bond, это не готовое решение, а его пример.
Обратите внимание на замечание laimas:
Цитата:

Сообщение от laimas
Скорее нужно проверять валидно ли значение, а не пусто ли оно.

Валидация значения поля происходит в строке 37.

laimas 09.07.2020 17:36

Цитата:

Сообщение от Nexus
Валидация значения поля происходит в строке 37

Это обязательность заполнения, а что если заполнено, но не тем? В вашем случае достаточно пробела и будет брак. :) То есть, чтобы все это вкупе работало как следует, нужно указать полям и правила, и обрабатывая событие submit проверять их.

рони 09.07.2020 18:36

Nexus,
const invalidField = form.querySelector(':invalid');

Nexus 09.07.2020 20:33

Цитата:

Сообщение от laimas
Это обязательность заполнения, а что если заполнено, но не тем?

Я изначально не планировал писать валидатор, в моем примере достаточно проверки на длину строки.

рони, спасибо, я почему-то считал, что у этого селектора недостаточная поддержка браузерами.


Часовой пояс GMT +3, время: 09:56.