Как установить tabindex в -1 через CSS?

У меня есть div с некоторыми полями ввода:

<div class = "container">
  <input id = "input-a" type = "text" name = "input-a" tabindex = "0">
  <input id = "input-b" type = "text" name = "input-b" tabindex = "0">
</div>

В особых случаях мне приходится отключить этот div, добавив в него следующий класс .disable:

.disable {
    pointer-events: none;
    opacity: .15;
}

Таким образом, выделение полей ввода с помощью мыши становится невозможным. Однако вы по-прежнему можете получить доступ к полям, введя в них клавишу tab. Я пытался добавить tab-index: -1 в класс .disable, но это просто дает мне Invalid property name в инструментах разработчика Firefox (также tabindex без дефиса).

Есть ли способ полностью отключить поля ввода через CSS, чтобы не гарантировать никакого доступа?

Есть лишний знак ">", пожалуйста, удалите его type = "text">

iDibya.com 07.10.2023 15:14
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
1
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не можете напрямую манипулировать атрибутом tabindex через CSS, поскольку это атрибут HTML, отвечающий за определение порядка табуляции элементов на странице. Чтобы добиться желаемого поведения, когда поля ввода становятся недоступными при применении класса .disable к контейнеру div, необходим JavaScript. В этих условиях вы можете динамически установить атрибут tabindex на -1 для входных элементов.

Вот пример того, как это можно сделать с помощью JavaScript:

<div class = "container">
  <input id = "input-a" type = "text" name = "input-a" tabindex = "0">
  <input id = "input-b" type = "text" name = "input-b" tabindex = "0">
</div>

<style>
  .disable {
    pointer-events: none;
    opacity: 0.15;
  }
</style>

<script>
  function disableInputs() {
    const container = document.querySelector('.container');
    const inputs = container.querySelectorAll('input');
    container.classList.add('disable');
    inputs.forEach(function(input) {
      input.tabIndex = -1;
    });
  }

  function enableInputs() {
    const container = document.querySelector('.container');
    const inputs = container.querySelectorAll('input');
    container.classList.remove('disable');
    inputs.forEach(function(input) {
      input.tabIndex = 0;
    });
  }

  // Call the functions to disable and enable inputs as needed
  // For example, you can call disableInputs() when you want to disable them.
</script>

В этом примере функция disableInputs() применяет класс .disable к контейнеру div, эффективно делая элементы ввода недоступными для выбора при взаимодействии с мышью и клавиатурой, устанавливая для их атрибутов tabindex значение -1. И наоборот, функция enableInputs() удаляет класс .disable и сбрасывает значения tabindex на 0, восстанавливая возможность выбора входных данных.

Спасибо за это решение. Я очень надеялся, что есть способ сделать это с помощью CSS, но в любом случае я благодарен за любую информацию.

Slevin 07.10.2023 15:20

Я не думаю, что этого можно достичь, используя только CSS. Мне не удалось найти способ настроить значение индекса табуляции с помощью CSS.

Единственный способ, которым я могу изобразить ванильный JavaScript, — это выбрать элементы и добавить атрибут disable (https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled) на входы:

function toggleDisable() {
  const container = document.querySelector('#container');
  const inputs = container.querySelectorAll('input');

  if (container.classList.contains('disable')) {
    container.classList.remove('disable');
    inputs.forEach((input) => {
      input.disabled = false;   
    });
  } else {
    container.classList.add('disable');
    inputs.forEach((input) => {
      input.disabled = true;
    });
  }
}
.disable {
  pointer-events: none;
  opacity: 0.5;
}
<h4>Container for comparison:</h4>
<div id = "different-container">
  <input id = "input-a" type = "text" name = "input-a" tabindex = "1">
  <input id = "input-b" type = "text" name = "input-b" tabindex = "2">
</div>

<h4>Container we want to disable inputs in:</h4>
<div id = "container">
  <input id = "input-a" type = "text" name = "input-a" tabindex = "3">
  <input id = "input-b" type = "text" name = "input-b" tabindex = "4">
</div>

<h4>Container for comparison:</h4>
<div id = "different-container2">
  <input id = "input-a" type = "text" name = "input-a" tabindex = "5">
  <input id = "input-b" type = "text" name = "input-b" tabindex = "6">
</div>

<h4>Use button to disable/enable the targeted container's inputs:</h4>
<div>
  <button onclick = "toggleDisable()">Toggle Disable</button>
</div>

Кроме того, вместо добавления класса disable вы можете использовать псевдокласс :disable, чтобы стилизовать элементы так, как вы хотите. (https://developer.mozilla.org/en-US/docs/Web/CSS/:disabled)

В этом случае код будет выглядеть так:

function toggleDisable() {
  const inputs = document.querySelectorAll('#container input');

  inputs.forEach((input) => {
    input.disabled = !input.disabled;
  });
}
#container input:disabled {
  opacity: 0.5;
  background-color: red;
  border: 4px solid blue
}
<h4>Container for comparison:</h4>
    <div id = "different-container">
      <input id = "input-a" type = "text" name = "input-a" tabindex = "1">
      <input id = "input-b" type = "text" name = "input-b" tabindex = "2">
    </div>

    <h4>Container we want to disable inputs in:</h4>
    <div id = "container">
      <input id = "input-a" type = "text" name = "input-a" tabindex = "3">
      <input id = "input-b" type = "text" name = "input-b" tabindex = "4">
    </div>

    <h4>Container for comparison:</h4>
    <div id = "different-container2">
      <input id = "input-a" type = "text" name = "input-a" tabindex = "5">
      <input id = "input-b" type = "text" name = "input-b" tabindex = "6">
    </div>

    <h4>Use button to disable/enable the targeted container's inputs:</h4>
    <div>
      <button onclick = "toggleDisable()">Toggle Disable</button>
    </div>

Надеюсь, это поможет.

Примечание. Я изменил класс контейнера на идентификатор контейнера, просто чтобы уточнить, что мы хотим отключить. Это решение также можно использовать с именем класса — используйте <div class = "container"></div>, и тогда вместо #container селектора будет .container. Это можно использовать, например, для группировки входов, если вы хотите применить одну и ту же логику к разным элементам.

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

Спасибо за подсказку, используйте :disabled, не знал об этой функции.

Slevin 07.10.2023 15:17

Пожалуйста, более чем добро пожаловать. Я думаю, что это более подходящее решение для данного варианта использования, чем использование tabindex=-1. В спецификации есть много вещей, которые можно использовать для стилизации и взаимодействия с формами. На мой взгляд, лучший способ узнать их — поискать хорошие примеры реализации в Интернете. Удачи в этом ;)

RoswellCityUK 07.10.2023 15:28
Ответ принят как подходящий

CSS не может перезаписать значение атрибута tabindex, но display может помочь избежать ввода, чтобы сохранить полную функциональность.

вот фрагмент, проверяющий эффекты display:contents на входные данные внутри контейнера .disable, также вы не можете выбрать и скопировать/вставить значение:

.container.disabled>input:focus {
  display: contents;
  /* KILLS the focus */
}

div,
p {
  margin: 0.5em;
  padding: 0.5em;
  border: solid;
  background: white;
}

.disabled {
  color: red;
  background: silver;
}

kbd {
  border: 1px solid;
  background: silver;
  border-radius: 3px;
  padding: 2px 6px;
}

h1 {
  font-size: 16px;
  color: red;
  text-align: center;
}

h1::first-line {
  color: black;
  font-size: 1.8em;
  text-transform: uppercase;
}

html {
  display: grid;
  min-height: 100vh;
  place-content: center;
  background: white;
}

body {
  background: #bee;
  padding: 1em;
  border-radius: 1em;
  box-shadow: 0.25em 0.25em 0.5em;
}

* {
  box-sizing: border-box;
}
<h1>test to disable inputs<br> even reached via tabindex</h1>
<!-- display:contents destroys the container at screen and kills input -->

<p>
  <a tabindex = "0">Click 'N select some of this text and <kbd>tab</kbd> through inputs.</a>
</p>
<p>Unclickable inputs , no attribute nor pointer-events used .</p>
<div class = "container disabled">
  <input id = "input-a" type = "text" name = "input-a" tabindex = "0" value = "text not to modify">
  <input id = "input-b" type = "text" name = "input-b" tabindex = "0" value = "text not to modify">
</div>
<div class = "container">
  <input id = "input-c" type = "text" name = "input-c" tabindex = "0" value = "text to modify">
  <input id = "input-d" type = "text" name = "input-d" tabindex = "0" value = "text to modify">
</div>

Отказ от ответственности:

Не уверен, что это хороший совет.

Отключать входные данные только из CSS — не лучшая идея, и она может сломаться в любой момент.

протестируйте/форк/поиграйте с https://codepen.io/gc-nomade/pen/mdaaPOx


Спасибо за этот пример. Я только что прочитал много об этой опции отображения, поскольку вы упомянули ее в своем комментарии выше, и было бы неплохо, чтобы она действовала как tabindex -1. Однако, похоже, с этим связано много возможных осложнений, начиная с рекомендации, что он должен отображать display: none [Drafts.csswg.org/css-display/#unbox] на элементах ввода - хотя это не так, но вводит некоторые странное поведение маршрутизации вкладок (по крайней мере, в Firefox). В любом случае, приятно знать, что для CSS появится последний выход, но я думаю, что выберу JS. Спасибо

Slevin 07.10.2023 16:40

Поскольку этот ответ наиболее близок к вопросу, который намеренно запрашивал решение CSS, я приму его и надеюсь, что когда-нибудь появится возможность устанавливать tabindex (или отключать) через CSS. Спасибо.

Slevin 07.10.2023 17:50

Спасибо за отзыв, анализируйте. сначала я не был уверен, что опубликую это как ответ, но потом решил услышать об этом. О входных данных, которые должны отображаться как display:none; , на самом деле это так, но, поскольку он сразу теряет фокус, он появляется. В браузере, даже если фокус потерян / не применен к этим вводам, он каким-то образом остается где-то близко к тому месту, где он должен был быть в потоке, и табуляция сохраняется. проходит без явных ошибок. Можно было бы подумать, что это хорошее решение, но мудрые так не считают;)

G-Cyrillus 07.10.2023 21:05

Да, табуляция вперед вроде бы работает, а назад нет. Я думаю, есть какое-то дерево, оставив специальную ветку которого, ты не сможешь вернуться назад.

Slevin 07.10.2023 21:25

Другие вопросы по теме