html 如何通过CSS将tabindex设置为-1?

5ssjco0h  于 2023-10-14  发布在  其他
关注(0)|答案(3)|浏览(197)

我有一个div和一些输入字段:

  1. <div class="container">
  2. <input id="input-a" type="text" name="input-a" tabindex="0">
  3. <input id="input-b" type="text" name="input-b" tabindex="0">
  4. </div>

在特殊情况下,我必须通过向div添加以下.disable类来禁用此div:

  1. .disable {
  2. pointer-events: none;
  3. opacity: .15;
  4. }

这样就不可能再用鼠标选择输入字段了。但是,您仍然可以通过tab键来访问这些字段。我尝试将tab-index: -1添加到.disable类中,但在Firefox开发者工具中只得到了一个Invalid property name(tabindex也没有连字符)。
有没有什么方法可以完全通过CSS禁用输入字段,这样就可以保证根本无法访问?

wj8zmpe1

wj8zmpe11#

CSS无法重写tabindex属性值,但display可以帮助避免输入以保持完全功能。
下面是一个测试.disable容器中display:contents对输入的影响的片段,你也不能选择和复制/粘贴值:

  1. .container.disabled>input:focus {
  2. display: contents;
  3. /* KILLS the focus */
  4. }
  5. div,
  6. p {
  7. margin: 0.5em;
  8. padding: 0.5em;
  9. border: solid;
  10. background: white;
  11. }
  12. .disabled {
  13. color: red;
  14. background: silver;
  15. }
  16. kbd {
  17. border: 1px solid;
  18. background: silver;
  19. border-radius: 3px;
  20. padding: 2px 6px;
  21. }
  22. h1 {
  23. font-size: 16px;
  24. color: red;
  25. text-align: center;
  26. }
  27. h1::first-line {
  28. color: black;
  29. font-size: 1.8em;
  30. text-transform: uppercase;
  31. }
  32. html {
  33. display: grid;
  34. min-height: 100vh;
  35. place-content: center;
  36. background: white;
  37. }
  38. body {
  39. background: #bee;
  40. padding: 1em;
  41. border-radius: 1em;
  42. box-shadow: 0.25em 0.25em 0.5em;
  43. }
  44. * {
  45. box-sizing: border-box;
  46. }
  1. <h1>test to disable inputs<br> even reached via tabindex</h1>
  2. <!-- display:contents destroys the container at screen and kills input -->
  3. <p>
  4. <a tabindex="0">Click 'N select some of this text and <kbd>tab</kbd> through inputs.</a>
  5. </p>
  6. <p>Unclickable inputs , no attribute nor pointer-events used .</p>
  7. <div class="container disabled">
  8. <input id="input-a" type="text" name="input-a" tabindex="0" value="text not to modify">
  9. <input id="input-b" type="text" name="input-b" tabindex="0" value="text not to modify">
  10. </div>
  11. <div class="container">
  12. <input id="input-c" type="text" name="input-c" tabindex="0" value="text to modify">
  13. <input id="input-d" type="text" name="input-d" tabindex="0" value="text to modify">
  14. </div>

免责声明:

不确定这是一个好建议。
禁用您的输入只从CSS不是一个好主意,可能随时打破
https://codepen.io/gc-nomade/pen/mdaaPOx上测试/分叉/播放

展开查看全部
cfh9epnr

cfh9epnr2#

我不认为这是可以实现的,只使用CSS。我找不到任何用CSS设置标签索引值的方法。
如果使用普通JavaScript,我可以想象的唯一方法是选择元素并将disable属性(https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled)添加到输入中:

  1. function toggleDisable() {
  2. const container = document.querySelector('#container');
  3. const inputs = container.querySelectorAll('input');
  4. if (container.classList.contains('disable')) {
  5. container.classList.remove('disable');
  6. inputs.forEach((input) => {
  7. input.disabled = false;
  8. });
  9. } else {
  10. container.classList.add('disable');
  11. inputs.forEach((input) => {
  12. input.disabled = true;
  13. });
  14. }
  15. }
  1. .disable {
  2. pointer-events: none;
  3. opacity: 0.5;
  4. }
  1. <h4>Container for comparison:</h4>
  2. <div id="different-container">
  3. <input id="input-a" type="text" name="input-a" tabindex="1">
  4. <input id="input-b" type="text" name="input-b" tabindex="2">
  5. </div>
  6. <h4>Container we want to disable inputs in:</h4>
  7. <div id="container">
  8. <input id="input-a" type="text" name="input-a" tabindex="3">
  9. <input id="input-b" type="text" name="input-b" tabindex="4">
  10. </div>
  11. <h4>Container for comparison:</h4>
  12. <div id="different-container2">
  13. <input id="input-a" type="text" name="input-a" tabindex="5">
  14. <input id="input-b" type="text" name="input-b" tabindex="6">
  15. </div>
  16. <h4>Use button to disable/enable the targeted container's inputs:</h4>
  17. <div>
  18. <button onclick="toggleDisable()">Toggle Disable</button>
  19. </div>

此外,您可以使用:disable伪类来根据需要设置元素的样式,而不是添加disable类。(https://developer.mozilla.org/en-US/docs/Web/CSS/:disabled
在这种情况下,代码看起来像这样:

  1. function toggleDisable() {
  2. const inputs = document.querySelectorAll('#container input');
  3. inputs.forEach((input) => {
  4. input.disabled = !input.disabled;
  5. });
  6. }
  1. #container input:disabled {
  2. opacity: 0.5;
  3. background-color: red;
  4. border: 4px solid blue
  5. }
  1. <h4>Container for comparison:</h4>
  2. <div id="different-container">
  3. <input id="input-a" type="text" name="input-a" tabindex="1">
  4. <input id="input-b" type="text" name="input-b" tabindex="2">
  5. </div>
  6. <h4>Container we want to disable inputs in:</h4>
  7. <div id="container">
  8. <input id="input-a" type="text" name="input-a" tabindex="3">
  9. <input id="input-b" type="text" name="input-b" tabindex="4">
  10. </div>
  11. <h4>Container for comparison:</h4>
  12. <div id="different-container2">
  13. <input id="input-a" type="text" name="input-a" tabindex="5">
  14. <input id="input-b" type="text" name="input-b" tabindex="6">
  15. </div>
  16. <h4>Use button to disable/enable the targeted container's inputs:</h4>
  17. <div>
  18. <button onclick="toggleDisable()">Toggle Disable</button>
  19. </div>

希望能帮上忙。

**注意:**我将容器类改为容器的id,只是为了更具体地说明我们想要禁用的内容。这个解决方案也可以与类名一起使用-使用<div class="container"></div>,然后选择器将.container代替#container。例如,如果您想将相同的逻辑应用于不同的元素,则可以将其用于对输入进行分组。
**注2:**我还将制表符索引从零更改为升序值,因此可以很容易地观察到当您制表时实际发生的情况。

展开查看全部
rvpgvaaj

rvpgvaaj3#

你不能通过CSS直接操作tabindex属性,因为它是一个HTML属性,负责定义页面上元素的Tab键顺序。要实现在将.disable类应用于容器div时使输入字段不可访问的预期行为,JavaScript是必需的。在这些条件下,可以动态地将输入元素的tabindex属性设置为-1。
下面是一个如何使用JavaScript执行此操作的示例:

  1. <div class="container">
  2. <input id="input-a" type="text" name="input-a" tabindex="0">
  3. <input id="input-b" type="text" name="input-b" tabindex="0">
  4. </div>
  5. <style>
  6. .disable {
  7. pointer-events: none;
  8. opacity: 0.15;
  9. }
  10. </style>
  11. <script>
  12. function disableInputs() {
  13. const container = document.querySelector('.container');
  14. const inputs = container.querySelectorAll('input');
  15. container.classList.add('disable');
  16. inputs.forEach(function(input) {
  17. input.tabIndex = -1;
  18. });
  19. }
  20. function enableInputs() {
  21. const container = document.querySelector('.container');
  22. const inputs = container.querySelectorAll('input');
  23. container.classList.remove('disable');
  24. inputs.forEach(function(input) {
  25. input.tabIndex = 0;
  26. });
  27. }
  28. // Call the functions to disable and enable inputs as needed
  29. // For example, you can call disableInputs() when you want to disable them.
  30. </script>

在本例中,disableInputs()函数将.disable类应用于容器div,通过将输入元素的tabindex属性设置为-1,有效地使输入元素无法通过鼠标和键盘交互进行选择。相反,enableInputs()函数删除.disable类并将tabindex值重置为0,恢复选择输入的能力。

展开查看全部

相关问题