Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Переключение div-а с помощю таб-а без js (https://javascript.ru/forum/css-html/82452-pereklyuchenie-div-s-pomoshhyu-tab-bez-js.html)

fori 09.05.2021 20:19

Переключение div-а с помощю таб-а без js
 
Здравствуйте, если 2 раза нажат таб window1 скроется и будет отображатся window2? Почему ето приисходит и как ето исправить
<!DOCTYPE html>

<body>
  <div class="body">
    <div>
      <button>Window1</button>
    </div>
    <div>
      <button>Window2</button>
    </div>
  </div>

</body>
<style>
  .body {
    display: flex;
    flex-direction: row;

    width: 100%;
    position: relative;
    overflow: hidden;
  }

  .body>div {
    display: flex;
    flex-direction: column;
    flex-shrink: 0;

    width: 100%;
  }
</style>

</html>

рони 09.05.2021 20:39

fori,
в каком браузере?

voraa 09.05.2021 20:57

Что именно исправить?
Что должно получиться?

По первому tab фокус передается на Window1, по второму на Window2 и он сдвигается в поле зрения. Но т.к у вас стоит overflow: hidden, то вы не видите , что Window1 не "пропал", а просто сдвинулся влево.

fori 10.05.2021 16:35

Вложений: 1
Я упростил код до такого
<!DOCTYPE html>

<body>
  <div class="frame">
    <div class="body">
      <div class="page0">
        <button>111111111111111111111</button>
      </div>
      <div class=" page1">
        <button>2222222222222222222222222</button>
      </div>
    </div>
  </div>

  <style>
    .frame {
      background: red;
    }

    .frame .body {
      width: 100%;
      position: relative;
      overflow: hidden;
      height: 5vmin;
    }

    .frame .body>div {
      width: 100%;
      position: absolute;
    }

    .page0 {
      left: 0;
      opacity:1;
    }

    .page1 {
      left: 100%;
      opacity:0;
    }
  </style>

</body>

</html>

Я хочу чтоб одно окно (на котором могут быть кнопки и тд) могло быть в стороне с нулевой видимостю, о одно отображалось. Вызывая событие я хочу иметь возможность програмно сдвигать окна и изменять прозрачность и ето работает, но нажатие табов ломает все

рони 10.05.2021 17:00

Цитата:

Сообщение от fori
но нажатие табов ломает все

так отключите

fori 10.05.2021 17:09

Вы имеете ввиду поставить tabindex="-1" всем childNodes что в диве-окне?
Или есть другие испособы?

рони 10.05.2021 17:15

Цитата:

Сообщение от fori
поставить tabindex="-1"

да либо отменить событие по таб программно

рони 10.05.2021 17:24

fori,
document.addEventListener( "keydown" , function(event) {
let {target, code} = event;
if(target = target.closest(".body") && code == "Tab") event.preventDefault();
});

fori 10.05.2021 19:06

Спасибо, могу ли я каким-то образом узнать цель таб-а — тоесть если цель таба принадлежит компоненту - тогда e.preventDefault()

рони 10.05.2021 19:08

fori,
не понимаю.

fori 10.05.2021 19:21

Тоесть, если таб пытается поставить фокус на елемент который пренадлежит div-у — e.preventDefault(), если таб пытается установить фокус на елемент который не принадлежит div-у — (пропустить событие и разрешыть поставить фокус на такой елемент)
Узнать принадлежит ли елемент родителю, таб на который надо блокировать можно по функции (аналог jquery-ного варианта parentHas)
parentsHas(el, target) {
      let current = el;
      while (
        current.parentNode != null &&
        current.parentNode != document.documentElement
      ) {
        if (current == target) {
          return true;
        } else {
          current = current.parentNode;
        }
      }
      return false;
    },

рони 10.05.2021 19:44

fori,
не могу подсказать, логика слишком заумная.

рони 10.05.2021 19:47

fori,
попробую спросить по другому, чем предложенный код не устроил?

fori 10.05.2021 20:15

Вложений: 1
В компонетне я поставил ваш код в mounted
mounted() {
    document.addEventListener("keydown", function (event) {
      let { target, code } = event;
      if ((target = target.closest(".body") && code == "Tab"))
        event.preventDefault();
    });
  },

При нажатии таб - таб попадает на инпут, дальнейшые нажатия игнорироются
Но я хотел бы сделать так чтоб таб работал на отображающейся странице компонента (opacity:1) и не работал на не отображающейся (opacity:0)
Если вам будет интересен результат - полный код компонента в вложении (i18n + vue 2 cli)

рони 10.05.2021 20:22

fori,
пока без вариантов ...


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