Як відключити поля форми за допомогою CSS?


180

Чи можна відключити поля форми за допомогою CSS? Я, звичайно, знаю про атрибут вимкнено, але чи можна вказати це в правилі CSS? Щось на зразок -

<input type="text" name="username" value="admin" >
<style type="text/css">
  input[name=username] {
    disabled: true; /* Does not work */
  }
</style>

Причина, про яку я запитую, полягає в тому, що у мене є програма, де поля форми автоматично генеруються, а поля приховані / показані на основі деяких правил (які працюють у Javascript). Тепер я хочу розширити його на підтримку відключення / включення полів, але спосіб написання правил, щоб безпосередньо маніпулювати властивостями стилів полями форми. Тож тепер мені потрібно розширити механізм управління зміною атрибутів, а також стилів полів форми, і якимось чином це здається менш ідеальним.

Дуже цікаво, що у CSS ви маєте видимі та відображати властивості, але не вмикаєте / відключаєте. Чи є щось подібне у стандарті HTML5, що ще не працює, або навіть щось нестандартне (специфічне для браузера)?


5
Про це згадується кілька разів нижче, але він губиться від шуму. Спробуйте вказівники-події: немає;
Corey Alix

Відповіді:


89

Це може бути корисно:

<input type="text" name="username" value="admin" >

<style type="text/css">
input[name=username] {
    pointer-events: none;
 }
</style>

Оновлення:

і якщо ви хочете відключити індекс вкладки, ви можете використовувати його таким чином:

 <input type="text" name="username" value="admin" tabindex="-1" >

 <style type="text/css">
  input[name=username] {
    pointer-events: none;
   }
 </style>

3
Це було схоже на те, що я мав після відключення всіх моїх полів введення, але, хоча це блокує їх від подій миші, вони все ще можуть бути доступні та змінені за допомогою вкладки клавіатури
Кен

11
властивість tab-index css не існує. Це повинен бути атрибут html (tabindex = -1)
N4ppeL

1
індекс-індекс не знаходить і не працює в хромі, натискання клавіші TAB пропустило функцію відключення, тому це не повне рішення.
QMaster

172

Ви можете підробити ефект відключення за допомогою CSS.

pointer-events:none;

Ви також можете змінити кольори тощо.


68
Це допомагає, але не перешкоджає вкладці в поля.
jerwood

Я хотів "відключити" останнє посилання сухаря, і я не мав на увазі цього вирішення ... завдяки цьому з деякою зміною кольору і без підкреслення, це зробило трюк! : D
Факундо Коломб'є

2
Це також не заважає подавати значення форм.
Кен Уейн ВандерЛінде

1
@KenWayneVanderLinde не відповідає атрибуту вимкнено правильно?
theonlygusti

2
@theonlygusti Елементи вимкнено <input> у формі не надсилаються.
dougd_in_nc

113

Оскільки правила виконуються в JavaScript, чому б не відключити їх за допомогою JavaScript (або в моєму прикладі, jQuery)?

$('#fieldId').attr('disabled', 'disabled'); //Disable
$('#fieldId').removeAttr('disabled'); //Enable

ОНОВЛЕННЯ

Ця attrфункція вже не є основним підходом до цього, як було зазначено в коментарях нижче. Тепер це робиться за допомогою propфункції.

$( "input" ).prop( "disabled", true ); //Disable
$( "input" ).prop( "disabled", false ); //Enable

1
Чи не має бути $ ('# fileId'). RemoveAttr ('disabled'); // Увімкнути
Anupam Jain

6
Напевно, варто відзначити, що це рішення не працюватиме, якщо користувач відключив JavaScript.
josh-fuggle

1
Firefox 20.0 (не впевнений в інших версіях, це саме те, що я використовую для розробки) вимагає видалення атрибута. Хоча @ Dutchie432 теоретично правильний, використовуючи .removeAttr ("вимкнено"); - правильне практичне рішення (принаймні в моєму поточному браузері).

1
Якщо ви не можете використовувати JQuery.
морські піхотинці

3
FYI - документація jQuery пропонує використовувати .prop()замість .attr()цього випадку. "Станом на jQuery 1.6, метод .attr () повертає невизначений для атрибутів, які не були встановлені. Для отримання та зміни властивостей DOM, таких як перевірений, вибраний або відключений стан елементів форми, використовуйте метод .prop (). " Вихідна документація: .attr () та .prop ()
Ніколас Райан Бауерс

54

Дуже цікаво, що у CSS ви маєте видимі та відображати властивості, але не вмикаєте / відключаєте.

Дуже цікаво, що ти думаєш, що це дуже цікаво. Ви нерозумієте мету CSS. CSS не призначений для зміни поведінки елементів форми. Це призначено лише змінити їх стиль . Приховування текстового поля не означає, що текстового поля більше немає та що браузер не надсилатиме свої дані під час подання форми. Все, що він робить - це приховати це від очей користувача.

Щоб фактично вимкнути свої поля, ви повинні використовувати disabledатрибут у HTML або disabledвластивість DOM у JavaScript.


35
Звичайно, я знаю, для чого "нібито" призначений CSS. Але для сучасних веб-секторів відмінність "презентації" та "поведінки" брудніше, ніж грязь. Оскільки відключені поля не подаються на сервер, це змінити поведінку. Але як тоді ховається всі форми форми не одне ?! Можливо, у старі добрі часи, коли все, що можна було зробити в Інтернеті, це читати текст і заповнювати форми, відмінність була чіткішою. У сучасному веб-сайті, якщо ви хочете відокремити презентацію від поведінки, CSS проти HTML / JS - це неправильний спосіб зробити це.
Анупам Джайн

17
інвалід - це стан, а не поведінка. Те, що він просить, цілком розумно. Наприклад, ви можете додати клас зайнятості у кілька полів під час обробки даних. Крім того, схоже, W3C погоджується, оскільки дозволяє CSS вибирати елементи через відключений псевдоклас.
IAmNaN

3
@IAmNaN: 1) "інвалід - це стан, а не поведінка." Так само про кожен інший атрибут HTML / DOM. 2) "Наприклад, ви можете додати клас зайнятості до кількох полів під час обробки даних." Ви робите це за сценарієм. 3) "Крім того, схоже, W3C погоджується, оскільки дозволяє CSS вибирати елементи через відключений псевдоклас." Можливість вибору елемента на основі того, включено чи вимкнено, не має нічого спільного з можливістю змінити цей стан за допомогою CSS.
BoltClock

5
У CSS є багато речей, які насправді можна вважати змінами в поведінці, наприклад, вказівники-події: немає; згаданий @ANaimi. Таким чином, інваліди можуть легко вважатися також властивістю відображення. Шкода, що це не так, полегшило б декілька речей.
Mikael Lepistö

1
@Mikael Lepistö: Так, я також не згоден з тим, pointer-eventsщо я є власністю CSS. FYI, pointer-events походить від SVG .
BoltClock

22

Не можна використовувати CSS для відключення Textbox. рішенням буде атрибут HTML.

disabled="disabled"

Хоча це працює в принципі, якщо ви читаєте повне запитання, він говорить, що форму форми генерується автоматично, а потім потрібно буде відключити його згодом.
thelem

1
@mr_eclair. можна використовувати ---> pointer-події: немає; Властивість Css.
Fereydoon Barikzehy

3
Примітка: Елементи з disabledатрибутом не подаються - їх значення не розміщуються на сервері. Читати на сайті: stackoverflow.com/q/8925716/1066234
Кай Ноак

17

Практичне рішення - використовувати CSS, щоб фактично приховати дані.

Щоб зробити це природним висновком, ви можете написати два введення html для кожного фактичного вводу (один увімкнено та один відключений), а потім використовувати javascript для керування CSS, щоб показати та приховати їх.


3
Якщо ви користуєтесь Javascript, було б сенс просто відключити / включити за необхідності ні?
MindVox

Дійсно, але в контексті цього конкретного питання це може бути життєздатним підходом.
graphicsdivine

10

перший раз відповівши щось, і, здавалося б, трохи пізно ...

Я погоджуюся робити це за допомогою JavaScript, якщо ви вже використовуєте його.

Для складеної структури, як я зазвичай використовую, я створив css pseudo after element, щоб блокувати елементи взаємодії з користувачем та дозволити стилізацію, не маніпулюючи цілою структурою.

Наприклад:

<div id=test class=stdInput>
    <label class=stdInputLabel for=selecterthingy>A label for this input</label>
    <label class=selectWrapper>
         <select id=selecterthingy>
             <option selected disabled>Placeholder</option>
             <option value=1>Option 1</option>
             <option value=2>Option 2</option>
         </select>
    </label>
</div>

Я можу розмістити disabledклас на обгортанніdiv

.disabled { 
    position : relative; 
    color    : grey;
}
.disabled:after {
    position :absolute;
    left     : 0;
    top      : 0;
    width    : 100%;
    height   : 100%;
    content  :' ';
}

Це призвело б до сірого тексту divта зробить його непридатним для користувача.

Мій приклад JSFiddle


4
BTW: Вам все одно потрібно обробляти вкладки, які все ще дозволяють користувачеві дістатися до поля та змінити його.
K Kimble

2
так чи не повинен <select> мати клас = "вимкнено"?
TimoSolo

Це геніально, я знав, що є щось подібне. :) дякую
Джеймс Харрінгтон

Це дійсно корисно. Я знаю, що використання JavaScript для встановлення відключеного було б краще, але це вирішує мою проблему, щоб зрозуміти користувачам (крім повідомлення про помилку), що подання не буде працювати.
jerclarke

8

Я завжди використовую:

input.disabled {
    pointer-events:none;
    color:#AAA;
    background:#F5F5F5;
}

а потім застосувати клас css до поля введення:

<input class="disabled" type="text" value="90" name="myinput" id="myinput" />

4

введення [ім'я = ім'я користувача] {відключено: вірно; /* Не працює */ }

Я знаю, що це питання досить старе, але для інших користувачів, які стикаються з цією проблемою, я вважаю, що найпростіший спосіб відключити введення - це просто ": disabled"

<input type="text" name="username" value="admin" disabled />
<style type="text/css">
  input[name=username]:disabled {
    opacity: 0.5 !important; /* Fade effect */
    cursor: not-allowed; /* Cursor change to disabled state*/
  }
</style>

Насправді, якщо у вас є якийсь сценарій для відключення введення динамічно / автоматично за допомогою javascript або jquery, який автоматично відключатиметься залежно від умови, яку ви додали.

У jQuery для прикладу:

if (condition) {
// Make this input prop disabled state
  $('input').prop('disabled', true);
}
else {
// Do something else
}

Сподіваюся, що відповідь у CSS допомагає.


2

Боюся, ви не можете цього зробити, але ви можете зробити наступне в jQuery, якщо ви не хочете додавати атрибути до полів. Просто розмістіть це всередині свого <head></head>тегу

$(document).ready(function(){ 
  $(".inputClass").focus(function(){
    $(this).blur();
  }); 
});

Якщо ви генеруєте поля в DOM (за допомогою JS), вам слід зробити це замість цього:

$(document).ready(function(){ 
  $(document).on("focus", ".inputClass", function(){
    $(this).blur();
  }); 
});

1

Це можна зробити для некритичних цілей, поклавши накладку поверх вхідного елемента. Ось мій приклад у чистому HTML та CSS.

https://jsfiddle.net/1tL40L99/

    <div id="container">
        <input name="name" type="text" value="Text input here" />
        <span id="overlay"></span>
    </div>

    <style>
        #container {
            width: 300px;
            height: 50px;
            position: relative;
        }
        #container input[type="text"] {
            position: relative;
            top: 15px;
            z-index: 1;
            width: 200px;
            display: block;
            margin: 0 auto;
        }
        #container #overlay {
            width: 300px;
            height: 50px;
            position: absolute;
            top: 0px;
            left: 0px;
            z-index: 2;
            background: rgba(255,0,0, .5);
        }
    </style>

1

Для цього немає можливості використовувати CSS. Моя порада - включити код JavaScript, де ви призначите або зміните клас css, застосований до входів. Щось схоже :

function change_input() {
	$('#id_input1')
		.toggleClass('class_disabled')
		.toggleClass('class_enabled');
		
	$('.class_disabled').attr('disabled', '');
	$('.class_enabled').removeAttr('disabled', '');
}
.class_disabled { background-color : #FF0000; }
.class_enabled { background-color : #00FF00; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<form> 	
	Input: <input id="id_input1" class="class_enabled" />		
	<input type="button" value="Toggle" onclick="change_input()";/>	
</form>


0

Різновид до pointer-events: none;рішення, яке вирішує питання про вхідний ще бути доступним через це мічений контроль або TabIndex, щоб обернути введення в DIV, який стилізований інвалідом введення тексту і налаштування input { visibility: hidden; }при вході «відключений» .
Посилання: https://developer.mozilla.org/en-US/docs/Web/CSS/visibility#Values

div.dependant {
  border: 0.1px solid rgb(170, 170, 170);
  background-color: rgb(235,235,228);
  box-sizing: border-box;
}
input[type="checkbox"]:not(:checked) ~ div.dependant:first-of-type {
  display: inline-block;
}
input[type="checkbox"]:checked ~ div.dependant:first-of-type {
  display: contents;
}
input[type="checkbox"]:not(:checked) ~ div.dependant:first-of-type > input {
  visibility: hidden;
}
<form>
  <label for="chk1">Enable textbox?</label>
  <input id="chk1" type="checkbox" />
  <br />
  <label for="text1">Input textbox label</label>
  <div class="dependant">
    <input id="text1" type="text" />
  </div>
</form>

Відключена стилізація, застосована у наведеному вище фрагменті, взята з інтерфейсу Chrome і може не бути візуально ідентичною інвалідним вводу в інших браузерах. Можливо, він може бути налаштований для окремих браузерів, використовуючи специфічні для двигуна CSS -префікси. Хоча на перший погляд, я не думаю , що він може:
розширення Microsoft CSS , Mozilla розширень CSS , WebKit CSS розширень

Набагато більш розумним буде введення додаткового значення visibility: disabledабо, display: disabledможливо, навіть appearance: disabled, враховуючи, що visibility: hiddenвже впливає на поведінку застосовуваних елементів будь-яких пов'язаних елементів управління.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.