Клавиша / esc

Атрибут readonly

Этим атрибутом помечают поля формы, которые доступны только для чтения.

Время чтения: меньше 5 мин

Кратко

Скопировано

Атрибут 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-readonly, который делает то же самое. Но лучше использовать нативный атрибут 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 нельзя использовать с:

  • <select>
  • любыми типами кнопок в <input>
  • полями с атрибутом hidden

Также поле с readonly нельзя сделать обязательным через required.

Подсказки

Скопировано

💡 Не путайте readonly с disabled. Неактивные поля (disabled) не получают фокус и не отправляются с формой, а поля только для чтения (readonly) — получают и отправляются.

💡 Для стилизации полей с readonly используйте псевдокласс :read-only, а для редактируемых полей — :read-write.

💡 В JavaScript можно проверить, доступно ли поле для редактирования, через свойство readOnly:

💡 Поля с 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
}