HTML

Что делает DOCTYPE?

DOCTYPE — это сокращение от Document Type. DOCTYPE всегда связан с DTD — Document Type Definition.

DTD определяет, как должны быть структурированы документы определенного типа (например, button может содержать span, но не div), тогда как DOCTYPE объявляет, какому DTD документ предположительно соответствует (например, этот документ соответствует HTML DTD).

Для веб-страниц объявление DOCTYPE является обязательным. Оно используется, чтобы сообщить пользовательским агентам, какой версии спецификаций HTML соответствует ваш документ. Как только пользовательский агент распознает правильный DOCTYPE, он включит режим без причуд (no-quirks mode), соответствующий этому DOCTYPE, для чтения документа. Если пользовательский агент не распознает правильный DOCTYPE, он включит режим причуд (quirks mode).

Объявление DOCTYPE для стандартов HTML5 — <!DOCTYPE html>.

Как обслуживать страницу с многоязычным контентом?

Я полагаю, что вопрос касается наиболее распространенного случая: как обслуживать страницу с контентом, доступным на нескольких языках, но при этом контент внутри страницы должен отображаться только на одном согласованном языке.

Когда HTTP-запрос отправляется на сервер, запрашивающий пользовательский агент обычно отправляет информацию о языковых предпочтениях, например, в заголовке Accept-Language. Затем сервер может использовать эту информацию, чтобы вернуть версию документа на соответствующем языке, если такая альтернатива доступна. Возвращаемый HTML-документ также должен объявлять атрибут lang в теге <html>, например, <html lang="en">...</html>.

Конечно, это бесполезно для того, чтобы сообщить поисковой системе, что один и тот же контент доступен на разных языках, поэтому вы также должны использовать атрибут hreflang в <head>. Например: <link rel="alternate" hreflang="de" href="http://de.example.com/page.html" />

В бэкенде HTML-разметка будет содержать заполнители i18n и контент для конкретного языка, хранящийся в форматах YML или JSON. Затем сервер динамически генерирует HTML-страницу с контентом на этом конкретном языке, обычно с помощью фреймворка бэкенда.

Каких вещей следует остерегаться при проектировании или разработке многоязычных сайтов?

  • Используйте атрибут lang в вашем HTML.
  • Направление пользователей на их родной язык — предоставьте пользователю возможность легко и без проблем изменить свою страну/язык.
  • Текст в растровых изображениях (например, png, gif, jpg и т. д.) не является масштабируемым подходом — размещение текста в изображении по-прежнему является популярным способом отображения красивых, нестандартных шрифтов на любом компьютере. Однако для перевода текста изображения каждой строке текста потребуется отдельное изображение, созданное для каждого языка. Что-то большее, чем несколько таких замен, может быстро выйти из-под контроля.
  • Ограниченная длина слов/предложений — некоторый контент может быть длиннее при написании на другом языке. Остерегайтесь проблем с макетом или переполнением в дизайне. Лучше избегать дизайна, где объем текста может нарушить или разрушить дизайн. Количество символов играет роль в заголовках, метках и кнопках. Меньше проблем с свободно текущим текстом, таким как основной текст или комментарии.
  • Будьте внимательны к тому, как воспринимаются цвета — цвета воспринимаются по-разному в разных языках и культурах. Дизайн должен использовать цвета соответствующим образом.
  • Форматирование дат и валют — календарные даты иногда представляются по-разному. Например, "May 31, 2012" в США против "31 May 2012" в некоторых частях Европы.
  • Не конкатенируйте переведенные строки — не делайте ничего вроде "The date today is " + date. Это сломается в языках с другим порядком слов. Используйте шаблонную строку с подстановкой параметров для каждого языка вместо этого. Например, посмотрите на следующие два предложения на английском и китайском соответственно: I will travel on {% date %} и {% date %} 我会出发. Обратите внимание, что положение переменной отличается из-за грамматических правил языка.
  • Направление чтения языка — в английском языке мы читаем слева направо, сверху вниз, в традиционном японском текст читается сверху вниз, справа налево.
  • Полезно иметь — включать локаль в путь (например, en_US, zh_CN и т. д.).

Для чего нужны атрибуты `data-`?

До того, как JavaScript-фреймворки стали популярными, фронтенд-разработчики использовали атрибуты data- для хранения дополнительных данных непосредственно в DOM, без других хаков, таких как нестандартные атрибуты или дополнительные свойства в DOM. Они предназначены для хранения пользовательских данных, приватных для страницы или приложения, для которых нет более подходящих атрибутов или элементов.

В настоящее время использование атрибутов data- обычно не рекомендуется. Одна из причин заключается в том, что пользователи могут легко изменять атрибуты данных с помощью инструмента инспектора элементов в браузере. Модель данных лучше хранить в самом JavaScript и обновлять в DOM посредством связывания данных, возможно, через библиотеку или фреймворк.

Однако одно совершенно допустимое использование атрибутов данных — это добавление "крючка" для сквозных фреймворков тестирования, таких как Selenium и Capybara, без необходимости создавать бессмысленные классы или атрибуты ID. Элемент должен быть найден определенной спецификацией Selenium, и что-то вроде data-selector='the-thing' является допустимым способом сделать это, не усложняя семантическую разметку.

Рассмотрим HTML5 как открытую веб-платформу. Каковы строительные блоки HTML5?

  • Семантика — позволяет более точно описывать ваш контент.
  • Связь — позволяет общаться с сервером новыми и инновационными способами.
  • Офлайн и хранение — позволяет веб-страницам хранить данные на стороне клиента локально и более эффективно работать в автономном режиме.
  • Мультимедиа — делает видео и аудио первоклассными гражданами в открытой сети.
  • 2D/3D графика и эффекты — позволяет значительно расширить диапазон вариантов представления.
  • Производительность и интеграция — обеспечивает большую оптимизацию скорости и лучшее использование компьютерного оборудования.
  • Доступ к устройствам — позволяет использовать различные устройства ввода и вывода.
  • Стилизация — позволяет авторам писать более сложные темы.

Опишите разницу между `cookie`, `sessionStorage` и `localStorage`.

Все вышеупомянутые технологии являются механизмами хранения данных по принципу "ключ-значение" на стороне клиента. Они способны хранить значения только в виде строк.

| | cookie | localStorage | sessionStorage | | --- | --- | --- | --- | | Инициатор | Клиент или сервер. Сервер может использовать заголовок Set-Cookie | Клиент | Клиент | | Срок действия | Устанавливается вручную | Навсегда | При закрытии вкладки | | Сохраняется между сеансами браузера | Зависит от того, установлен ли срок действия | Да | Нет | | Отправляется на сервер с каждым HTTP-запросом | Файлы cookie автоматически отправляются через заголовок Cookie | Нет | Нет | | Емкость (на домен) | 4kb | 5MB | 5MB | | Доступность | Любое окно | Любое окно | Та же вкладка |

Примечание: если пользователь решит очистить данные просмотра с помощью любого механизма, предоставляемого браузером, это приведет к удалению всех хранимых cookie, localStorage или sessionStorage. Важно помнить об этом при разработке для локального сохранения, особенно при сравнении с альтернативами, такими как хранение на стороне сервера в базе данных или аналогичных (которые, конечно, сохранятся, несмотря на действия пользователя).

Опишите разницу между `<script>`, `<script async>` и `<script defer>`.

  • <script> - Парсинг HTML блокируется, скрипт загружается и выполняется немедленно, парсинг HTML возобновляется после выполнения скрипта.
  • <script async> - Скрипт будет загружаться параллельно с парсингом HTML и выполняться, как только станет доступен (потенциально до завершения парсинга HTML). Используйте async, когда скрипт не зависит от других скриптов на странице, например, для аналитики.
  • <script defer> - Скрипт будет загружаться параллельно с парсингом HTML и выполняться, когда страница закончит парсинг. Если их несколько, каждый отложенный скрипт выполняется в том порядке, в котором они были встречены в документе. Если скрипт зависит от полностью разобранного DOM, атрибут defer будет полезен для обеспечения того, чтобы HTML был полностью разобран до выполнения. Отложенный скрипт не должен содержать document.write.

Примечание: Атрибуты async и defer игнорируются для скриптов, у которых нет атрибута src.

Почему обычно `<link>` для CSS размещают между `<head></head>`, а `<script>` для JS — прямо перед `</body>`? Знаете ли вы какие-либо исключения?

Размещение <link> в <head>

Размещение <link> в <head> является частью надлежащей спецификации при создании оптимизированного веб-сайта. При первой загрузке страницы HTML и CSS анализируются одновременно; HTML создает DOM (объектную модель документа), а CSS создает CSSOM (объектную модель CSS). Оба необходимы для создания визуальных элементов на веб-сайте, что обеспечивает быстрое время "первой значимой отрисовки". Этот прогрессивный рендеринг является категорией оптимизации, по которой оцениваются сайты в своих показателях производительности. Размещение таблиц стилей в нижней части документа препятствует прогрессивному рендерингу во многих браузерах. Некоторые браузеры блокируют рендеринг, чтобы избежать повторной отрисовки элементов страницы, если их стили изменяются. Пользователь тогда вынужден просматривать пустую белую страницу. В других случаях могут быть вспышки нестилизованного контента (FOUC), которые показывают веб-страницу без примененного стиля.

Размещение <script> непосредственно перед </body>

Теги <script> блокируют синтаксический анализ HTML во время загрузки и выполнения, что может замедлить работу вашей страницы. Размещение скриптов внизу позволит сначала разобрать и отобразить HTML пользователю.

Исключением для размещения <script> внизу является случай, когда ваш скрипт содержит document.write(), но в наши дни использовать document.write() не рекомендуется. Кроме того, размещение <script> внизу означает, что браузер не может начать загрузку скриптов, пока не будет проанализирован весь документ. Это гарантирует, что ваш код, которому необходимо манипулировать элементами DOM, не вызовет ошибку и не остановит весь скрипт. Если вам нужно поместить <script> в <head>, используйте атрибут defer, который позволит добиться того же эффекта запуска скрипта только после анализа HTML, но браузер сможет загрузить скрипт раньше.

Имейте в виду, что размещение скриптов непосредственно перед закрывающим тегом </body> создаст иллюзию более быстрой загрузки страницы при пустом кэше (поскольку скрипты не будут блокировать загрузку остальной части документа). Однако, если у вас есть код, который вы хотите запустить во время загрузки страницы, он начнет выполняться только после загрузки всей страницы. Если вы поместите эти скрипты в тег <head>, они начнут выполняться раньше — так что при заполненном кэше страница будет выглядеть загружающейся быстрее.

Теги <head> и <body> теперь необязательны

Согласно спецификации HTML5, некоторые HTML-теги, такие как <head> и <body>, являются необязательными. Руководство по стилю Google даже рекомендует удалять их для экономии байтов. Однако эта практика до сих пор не получила широкого распространения, и выигрыш в производительности, вероятно, будет минимальным, и для большинства сайтов это, скорее всего, не будет иметь значения.

Что такое прогрессивный рендеринг?

Прогрессивный рендеринг — это название, данное методам, используемым для повышения производительности веб-страницы (в частности, для улучшения воспринимаемого времени загрузки) с целью максимально быстрого отображения контента.

Раньше он был гораздо более распространен в дни до широкополосного интернета, но до сих пор используется в современной разработке, поскольку мобильные подключения к данным становятся все более популярными (и ненадежными)!

Примеры таких методов:

  • Ленивая загрузка изображений — изображения на странице загружаются не все сразу. JavaScript будет использоваться для загрузки изображения, когда пользователь прокручивает часть страницы, на которой отображается изображение.
  • Приоритезация видимого контента (или рендеринг "над сгибом") — включите только минимальный CSS/контент/скрипты, необходимые для той части страницы, которая будет отображаться в браузере пользователя, чтобы отображаться как можно быстрее, затем вы можете использовать отложенные скрипты или прослушивать событие DOMContentLoaded/load для загрузки других ресурсов и контента.
  • Асинхронные HTML-фрагменты — выгрузка частей HTML в браузер по мере построения страницы на стороне бэкенда. Более подробную информацию о методе можно найти.

Почему вы будете использовать атрибут `srcset` в теге `img`? Объясните процесс, который использует браузер при оценке содержимого этого атрибута.

Вы будете использовать атрибут srcset, когда захотите показывать пользователям разные изображения в зависимости от ширины экрана их устройства — показ изображений более высокого качества на устройствах с Retina-дисплеем улучшает пользовательский опыт, а показ изображений с более низким разрешением на низкопроизводительных устройствах повышает производительность и уменьшает излишнее потребление данных (потому что показ более крупного изображения не даст видимой разницы). Например: <img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt=""> указывает браузеру отображать графику small, medium или large .jpg в зависимости от разрешения клиента. Первое значение — это имя изображения, а второе — ширина изображения в пикселях. Для ширины устройства 320 пикселей выполняются следующие расчеты:

  • 500 / 320 = 1.5625
  • 1000 / 320 = 3.125
  • 2000 / 320 = 6.25

Если разрешение клиента 1x, то 1.5625 является ближайшим, и браузер выберет 500w, соответствующий small.jpg.

Если разрешение Retina (2x), браузер будет использовать ближайшее разрешение выше минимального. Это означает, что он не выберет 500w (1.5625), потому что оно больше 1, и изображение может выглядеть плохо. Тогда браузер выберет изображение с результирующим соотношением, более близким к 2, то есть 1000w (3.125).

srcsets решают проблему, когда вы хотите предоставлять более мелкие файлы изображений для устройств с узким экраном, поскольку им не нужны огромные изображения, как на настольных дисплеях, — а также, при желании, предоставлять изображения с разным разрешением для экранов с высокой/низкой плотностью пикселей.

Вы использовали ранее другие языки HTML-шаблонов?

Да, Pug (ранее Jade), ERB, Slim, Handlebars, Jinja, Liquid и EJS, и это лишь некоторые из них. На мой взгляд, они более или менее одинаковы и предоставляют схожую функциональность по экранированию контента и полезные фильтры для манипулирования отображаемыми данными. Большинство шаблонизаторов также позволяют вам внедрять свои собственные фильтры в случае, если вам требуется пользовательская обработка перед отображением.

В чем разница между canvas и SVG?

Canvas основан на растровой графике, работая с пикселями, в то время как SVG основан на векторной графике, используя математические описания форм. Canvas использует императивное рисование, где каждый шаг определяется с помощью JavaScript, что идеально подходит для динамической и интерактивной графики, такой как анимация и игры.

Напротив, SVG использует декларативное рисование, с формами и путями, определенными непосредственно в HTML, что делает его более доступным и оптимизированным для SEO. Canvas оптимален для сложных сцен из-за меньших накладных расходов, но масштабирование может привести к потере качества изображения. SVG, будучи независимым от разрешения, адаптируется к различным размерам экрана без потери качества.

В конечном итоге, canvas подходит для динамической, производительной графики, в то время как SVG превосходен для масштабируемой, независимой от разрешения графики, с присущими ей преимуществами доступности и SEO.

Что такое пустые элементы в HTML?

Пустые элементы в HTML — это элементы, которые не содержат никакого контента между своим открывающим и закрывающим тегами. Вместо этого они являются самозакрывающимися тегами, то есть имеют прямую косую черту (/) перед закрывающей угловой скобкой (>). Некоторые распространенные примеры пустых элементов включают:

  • <img>: Используется для встраивания изображений в документ.
  • <input>: Используется для приема пользовательского ввода.
  • <br>: Используется для вставки разрывов строк или принудительных разрывов строк.
  • <hr>: Используется для создания горизонтальных линий или разделителей.