Кратко
СкопированоАтрибут readonly
делает поля формы доступными только для чтения. Пользователь не сможет изменить значение такого поля, но сможет выделить и скопировать текст.
Пример
Скопировано<form> <div> <label for="username">Имя пользователя</label> <input type="text" value="Алиса" readonly id="username"> </div> <div> <label for="comment">Комментарий</label> <textarea readonly id="comment"> Этот текст нельзя отредактировать </textarea> </div></form>
<form> <div> <label for="username">Имя пользователя</label> <input type="text" value="Алиса" readonly id="username"> </div> <div> <label for="comment">Комментарий</label> <textarea readonly id="comment"> Этот текст нельзя отредактировать </textarea> </div> </form>
Как понять
СкопированоИногда нужно показать пользователю информацию в поле формы, но при этом запретить её редактирование. Например:
- отображение данных из профиля, которые нельзя изменить;
- показ результатов расчётов;
- демонстрация значений по умолчанию.
В таких случаях пригодится атрибут readonly
.
Этот атрибут позволяет:
- выделять и копировать текст;
- полю ввода получать фокус с клавиатуры;
- отправлять данные из поля ввода на сервер;
- стилизовать элемент через CSS при помощи псевдокласса.
Как пишется
Скопированоreadonly
— это булевый атрибут, поэтому его можно записать двумя способами:
<!-- Полная запись --><input readonly="readonly"><!-- Сокращённая запись --><input readonly>
<!-- Полная запись --> <input readonly="readonly"> <!-- Сокращённая запись --> <input readonly>
В ARIA есть атрибут aria
, который делает то же самое. Но лучше использовать нативный атрибут HTML, а ARIA применять только для элементов, где readonly
не поддерживается:
<!-- ARIA для кастомных элементов --><custom-input aria-readonly="true"> Нередактируемый текст</custom-input>
<!-- ARIA для кастомных элементов --> <custom-input aria-readonly="true"> Нередактируемый текст </custom-input>
Где можно использовать
СкопированоАтрибут readonly
работает с:
<textarea>
<input>
следующих типов:text
search
url
tel
email
password
date
month
week
time
datetime
- local number
Где не работает
СкопированоАтрибут readonly
нельзя использовать с:
Также поле с readonly
нельзя сделать обязательным через required
.
Подсказки
Скопировано💡 Не путайте readonly
с disabled
. Неактивные поля (disabled
) не получают фокус и не отправляются с формой, а поля только для чтения (readonly
) — получают и отправляются.
💡 Для стилизации полей с readonly
используйте псевдокласс :read
, а для редактируемых полей — :read
.
💡 В JavaScript можно проверить, доступно ли поле для редактирования, через свойство read
:
💡 Поля с readonly
всё ещё можно изменить через JavaScript или инструменты разработчика. Не используйте этот атрибут для защиты важных данных.
💡 Хотя поле с readonly
можно выделить и получить на него фокус, пользователи не могут изменить его значение с клавиатуры.
💡 При отправке формы поля с readonly
передаются на сервер, в отличие от полей с disabled
.
💡 Атрибут readonly
не влияет на события поля. Можно использовать все события, как с обычным полем.
На практике
Скопированосоветует Скопировано
🛠 Для улучшения UX добавляйте визуальную подсказку, что поле нельзя редактировать:
[readonly] { background-color: #f5f5f5; cursor: not-allowed;}
[readonly] { background-color: #f5f5f5; cursor: not-allowed; }
🛠 Если нужно временно запретить редактирование поля, удобно переключать readonly
через JavaScript:
const toggleReadOnly = (event) => { const input = document.querySelector('input') input.readOnly = !input.readOnly}
const toggleReadOnly = (event) => { const input = document.querySelector('input') input.readOnly = !input.readOnly }