Начинаю с базовой, функциональной версии, доступной во всех браузерах. Затем добавляю более продвинутые возможности для современных браузеров с использованием фиче-детектирования.
Разрабатываю для современных браузеров, а затем обеспечиваю, чтобы функциональность оставалась доступной (пусть и с упрощенным внешним видом) при отключении или отсутствии некоторых технологий в старых браузерах. Использую запасные варианты (fallbacks).
Использую библиотеки, которые эмулируют недостающий функционал современных API в старых браузерах.
javascript
Использую инструменты типа Babel для преобразования современного JavaScript (ES6+) в ES5, который понимают старые браузеры. Webpack или другие бандлеры помогают объединить и оптимизировать код.
javascript
Вручную или с помощью автопрефиксеров (PostCSS) добавляю CSS префиксы для обеспечения кроссбраузерности стилей.
css
Вместо определения браузера использую библиотеки (Modernizr) или нативный JavaScript для проверки поддержки конкретной технологии или API.
javascript
В некоторых специфических случаях для очень старых версий Internet Explorer использую условные комментарии для подключения разных стилей или скриптов.
html
Обязательно тестирую страницы в различных браузераx, включая старые версии, используя виртуальные машины, эмуляторы или сервисы вроде BrowserStack.
Для элементов с потенциальной проблемой совместимости (например, специфические шрифты, SVG) предоставляю резервные варианты.
css
Применяю валидный HTML, CSS и JavaScript, избегая нестандартных решений, которые могут не поддерживаться.
Регулярно обращаюсь к caniuse.com для проверки поддержки возможностей браузерами.