У меня есть 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, чтобы не гарантировать никакого доступа?






Вы не можете напрямую манипулировать атрибутом 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, но в любом случае я благодарен за любую информацию.
Я не думаю, что этого можно достичь, используя только 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, не знал об этой функции.
Пожалуйста, более чем добро пожаловать. Я думаю, что это более подходящее решение для данного варианта использования, чем использование tabindex=-1. В спецификации есть много вещей, которые можно использовать для стилизации и взаимодействия с формами. На мой взгляд, лучший способ узнать их — поискать хорошие примеры реализации в Интернете. Удачи в этом ;)
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. Спасибо
Поскольку этот ответ наиболее близок к вопросу, который намеренно запрашивал решение CSS, я приму его и надеюсь, что когда-нибудь появится возможность устанавливать tabindex (или отключать) через CSS. Спасибо.
Спасибо за отзыв, анализируйте. сначала я не был уверен, что опубликую это как ответ, но потом решил услышать об этом. О входных данных, которые должны отображаться как display:none; , на самом деле это так, но, поскольку он сразу теряет фокус, он появляется. В браузере, даже если фокус потерян / не применен к этим вводам, он каким-то образом остается где-то близко к тому месту, где он должен был быть в потоке, и табуляция сохраняется. проходит без явных ошибок. Можно было бы подумать, что это хорошее решение, но мудрые так не считают;)
Да, табуляция вперед вроде бы работает, а назад нет. Я думаю, есть какое-то дерево, оставив специальную ветку которого, ты не сможешь вернуться назад.
Есть лишний знак ">", пожалуйста, удалите его
type = "text">