Русский

Узнайте, как создавать надежные и доступные веб-приложения с использованием прогрессивного улучшения и обнаружения функций. Это руководство предлагает глобальный взгляд, практические примеры и лучшие практики для создания инклюзивного и перспективного веб-опыта.

Прогрессивное улучшение: обнаружение функций — создание надежного веб-опыта для глобальной аудитории

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

Что такое прогрессивное улучшение?

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

Основные принципы прогрессивного улучшения включают:

Почему обнаружение функций важно

Обнаружение функций является краеугольным камнем прогрессивного улучшения. Вместо того, чтобы полагаться на обнаружение браузера (определение браузера пользователя на основе его строки user agent), обнаружение функций фокусируется на том, что браузер *может* делать. Это гораздо более надежный подход, потому что:

Методы обнаружения функций

Существует несколько методов обнаружения функций браузера, каждый из которых имеет свои сильные и слабые стороны. Наиболее распространенный метод использует JavaScript для проверки наличия определенной функции или API.

1. Использование JavaScript для проверки функций

Этот метод является наиболее распространенным и гибким. Вы проверяете доступность определенной функции браузера с помощью кода JavaScript.

Пример: проверка API `fetch` (JavaScript для получения данных из сети)


if ('fetch' in window) {
  // Поддерживается API 'fetch'. Используйте его для загрузки данных.
  fetch('data.json')
    .then(response => response.json())
    .then(data => {
      // Обработать данные
    })
    .catch(error => {
      // Обработать ошибки
    });
} else {
  // API 'fetch' не поддерживается. Используйте резервный вариант, такой как XMLHttpRequest.
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'data.json');
  xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
      // Обработать данные
    } else {
      // Обработать ошибки
    }
  };
  xhr.onerror = function() {
    // Обработать ошибки
  };
  xhr.send();
}

В этом примере код проверяет, существует ли свойство `fetch` в объекте `window`. Если да, браузер поддерживает API `fetch`, и код может его использовать. В противном случае реализуется резервный механизм (с использованием `XMLHttpRequest`).

Пример: проверка поддержки API `classList`


if ('classList' in document.body) {
  // Браузер поддерживает classList.  Используйте методы classList (например, add, remove)
  document.body.classList.add('has-js');
} else {
  // Браузер не поддерживает classList. Используйте альтернативные методы.
  // например, использование манипуляций со строками для добавления и удаления классов CSS
  document.body.className += ' has-js';
}

2. Использование запросов функций CSS (`@supports`)

Запросы функций CSS, обозначаемые правилом `@supports`, позволяют применять правила CSS в зависимости от того, поддерживает ли браузер определенные функции CSS или значения свойств.

Пример: использование `@supports` для стилизации макета с использованием Grid Layout


.container {
  display: flex; /* Резервный вариант для браузеров без сетки */
}

@supports (display: grid) {
  .container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
  }
}

В этом примере `.container` изначально использует макет `flex` (широко поддерживаемая функция). Правило `@supports` проверяет, поддерживает ли браузер `display: grid`. Если да, стили внутри правила применяются, переопределяя первоначальный макет flex с макетом grid.

3. Библиотеки и фреймворки

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

Пример: использование Modernizr


<html class="no-js" >
<head>
  <!-- Другие мета-теги и т. д. -->
  <script src="modernizr.min.js"></script>
</head>
<body>
  <div class="my-element"></div>
  <script>
    if (Modernizr.borderradius) {
      // Применить стили border-radius
      document.querySelector('.my-element').style.borderRadius = '10px';
    }
  </script>
</body>
</html>

В этом сценарии Modernizr добавляет класс `borderradius` к элементу ``, если браузер поддерживает `border-radius`. Затем код JavaScript проверяет этот класс и применяет соответствующий стиль.

Практические примеры и глобальные соображения

Давайте рассмотрим несколько практических примеров обнаружения функций и способов их реализации, принимая во внимание глобальные соображения, такие как доступность, интернационализация (i18n) и производительность.

1. Адаптивные изображения

Адаптивные изображения необходимы для предоставления оптимальных размеров изображений в зависимости от устройства и размера экрана пользователя. Обнаружение функций может играть решающую роль в их эффективной реализации.

Пример: проверка поддержки `srcset` и `sizes`

`srcset` и `sizes` — это HTML-атрибуты, которые предоставляют браузеру информацию о вариантах источников изображений, позволяя ему выбирать наиболее подходящее изображение для текущего контекста.


<img
  src="image-fallback.jpg"
  srcset="image-small.jpg 480w, image-medium.jpg 768w, image-large.jpg 1024w"
  sizes="(max-width: 480px) 100vw, (max-width: 768px) 50vw, 33vw"
  alt="Описание изображения"
>

Атрибут `srcset` указывает список источников изображений с их шириной. Атрибут `sizes` предоставляет информацию о предполагаемом размере отображения изображения на основе медиа-запросов.

Если браузер не поддерживает `srcset` и `sizes`, вы можете использовать JavaScript и обнаружение функций для достижения аналогичного результата. Библиотеки, такие как `picturefill`, предоставляют polyfill для старых браузеров.


if (!('srcset' in document.createElement('img')) || !('sizes' in document.createElement('img'))) {
  // Используйте polyfill, такой как picturefill.js
  // Ссылка на picturefill: https://scottjehl.github.io/picturefill/
  console.log('Использование picturefill polyfill');
}

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

2. Веб-анимации

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

Пример: обнаружение поддержки переходов и анимации CSS


if (Modernizr.cssanimations && Modernizr.csstransitions) {
  // Применить классы анимации
  document.body.classList.add('animations-enabled');
} else {
  // Используйте статический пользовательский интерфейс или более базовый опыт без анимации
  document.body.classList.add('animations-disabled');
}

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

Глобальные соображения для анимации: Учитывайте, что у некоторых пользователей могут быть вестибулярные расстройства или другие состояния, которые могут быть вызваны анимацией. Всегда предоставляйте возможность отключить анимацию. Уважайте настройку пользователя `prefers-reduced-motion`.

3. Проверка формы

HTML5 представил мощные функции проверки форм, такие как обязательные поля, проверка типа ввода (например, электронная почта, номер) и настраиваемые сообщения об ошибках. Обнаружение функций позволяет вам использовать эти функции, предоставляя при этом изящные резервные варианты.

Пример: проверка поддержки проверки формы HTML5


if ('checkValidity' in document.createElement('input')) {
  // Используйте проверку формы HTML5.
  // Это встроено и не требует JavaScript
} else {
  // Реализуйте проверку формы на основе JavaScript.
  // Полезна такая библиотека, как Parsley.js:
  // https://parsleyjs.org/
}

Это гарантирует, что пользователи со старыми браузерами по-прежнему будут получать проверку формы, даже если она реализована с использованием JavaScript. Рассмотрите возможность предоставления проверки на стороне сервера в качестве окончательного уровня безопасности и надежности.

Глобальные соображения для проверки формы: Убедитесь, что ваши сообщения об ошибках локализованы и доступны. Предоставляйте четкие и лаконичные сообщения об ошибках на языке пользователя. Учитывайте, как используются различные форматы дат и чисел во всем мире.

4. Передовые методы компоновки (например, CSS Grid)

CSS Grid Layout предоставляет мощный способ создания сложных, адаптивных макетов. Однако важно убедиться, что старые браузеры обрабатываются корректно.

Пример: использование CSS Grid с резервным вариантом


.container {
  display: flex;  /* Резервный вариант для старых браузеров */
  flex-wrap: wrap;
}

@supports (display: grid) {
  .container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  }
}

Этот код использует `flexbox` в качестве резервного варианта для браузеров, которые не поддерживают `grid`. Если браузер поддерживает `grid`, макет будет отображаться с использованием grid. Этот подход создает адаптивный макет, который корректно работает в старых браузерах.

Глобальные соображения для макета: Разрабатывайте для разных размеров экрана, соотношений сторон и способов ввода (например, сенсорные экраны, навигация с помощью клавиатуры). Протестируйте свои макеты на различных устройствах и в браузерах, используемых во всем мире. Учитывайте поддержку языков с письмом справа налево (RTL), если ваша целевая аудитория включает пользователей, читающих сценарии RTL (например, арабский, иврит).

Лучшие практики для обнаружения функций

Чтобы максимизировать эффективность обнаружения функций, придерживайтесь этих лучших практик:

Решение проблемы доступности (a11y) при обнаружении функций

Доступность является критическим компонентом прогрессивного улучшения. Обнаружение функций может помочь обеспечить доступность вашего веб-сайта для пользователей с ограниченными возможностями.

Интернационализация (i18n) и обнаружение функций

При создании глобального веб-сайта рассмотрите i18n. Обнаружение функций может способствовать вашим усилиям по i18n, облегчая контент и поведение, зависящие от языка.

Заключение: построение для будущего

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

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

Практические идеи: