- PVSM.RU - https://www.pvsm.ru -
Этот документ — не просто список, а выжимка боли, шишек и неожиданных открытий, с которыми сталкивается почти каждый фронтендер. Неважно, Vue ты выбрал или React, если твое приложение должно работать в браузере на айфоне пятилетней давности — добро пожаловать в клуб. Здесь будет всё: от странностей с Safari до неожиданных проблем с синтетическими событиями.
iOS Safari не поддерживает Notification API без установки PWA
Проблема: На iOS ты не можешь просто вызвать new Notification(...) — API будет недоступно, пока пользователь не установит сайт как PWA на домашний экран. Так же, в Safari просто не будет доступен класс Notification, браузер его просто не имплиментирует на этапе браузерного окна.
Решение:
- Чтобы проверить можно ли использовать уведомления можно написать следующую проверку:
typeof window !== 'undefined' && 'Notification' in window;
🔗 MDN — Notification API [1]
🔗 WebKit — Push Notifications [2]
Safari не поддерживает input[type="date"] как положено
Проблема: На iOS Safari отображает input[type="date"] как обычное текстовое поле без нативного выбора даты.
Пример:
<!-- Ожидается нативный datepicker, но получаем обычный input -->
<input type="date" />
Решение:
- Использовать кастомные datepickers (например, vue-datepicker, react-datepicker).
- Проверять наличие поддержки через input.type === 'date'.
🔗 caniuse — input type="date" [3]
iOS Safari не поддерживает position: sticky внутри overflow: hidden
Проблема: Если ты оборачиваешь блок со position: sticky в контейнер с overflow: hidden, то sticky не работает.
Пример:
.wrapper {
overflow: hidden;
}
.sticky-header {
position: sticky;
top: 0;
}
Решение:
- Либо не задавай overflow: hidden, либо используй альтернативную реализацию через JS.
🔗 WebKit bug tracker [4]
Safari запрещает getUserMedia() на страницах без HTTPS и без взаимодействия
Проблема: Камера и микрофон через getUserMedia() в iOS Safari не работают, если:
- Страница не под HTTPS
- Не было клика по экрану
Пример:
navigator.mediaDevices
.getUserMedia({ video: true })
.then((stream) => {
// Работа с видео-потоком
})
.catch((err) => {
console.error('Ошибка доступа к камере', err);
});
Решение:
- Всегда использовать HTTPS
- Запрашивать доступ только по клику пользователя (например, по кнопке)
🔗 MDN — getUserMedia [5]
backdrop-filter работает нестабильно в некоторых Android-браузерах
Проблема: В Chrome на Android backdrop-filter: blur(...) может либо не работать вовсе, либо ломать layout.
Пример:
.glass {
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.2);
}
Решение:
- Проверяй поддержку через @supports
- Используй fallback с полупрозрачным цветом
🔗 caniuse — backdrop-filter [6]
Android Chrome игнорирует scrollIntoView({ behavior: 'smooth' }) в iframe
Проблема: Встраиваешь страницу в iframe — smooth scroll больше не работает на Android.
Пример:
document.querySelector('#target').scrollIntoView({ behavior: 'smooth'
Решение:
- В iframe использовать кастомную анимацию прокрутки через JS (window.scrollTo + requestAnimationFrame)
🔗 Stack Overflow discussion [7]
Поведение фреймворков
React генерирует синтетические события, а Vue работает с нативными
Проблема: В Vue компонент работает отлично, но после портирования на React всё ломается: всплытие, отмена событий, или event.currentTarget ведёт себя странно.
Пример: Тултипы в Vue показывались при mouseenter/mouseleave, но в React перестали работать, потому что SyntheticEvent не соответствует MouseEvent полностью.
Решение:
- Используй nativeEvent если нужно добраться до настоящего события.
- Всегда читай React SyntheticEvent [8]
Автор: altumus
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/krossbrauzernost/424535
Ссылки в тексте:
[1] MDN — Notification API: https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API
[2] WebKit — Push Notifications: https://webkit.org/blog/12945/meet-web-push-on-ios/
[3] caniuse — input type="date": https://caniuse.com/input-datetime
[4] WebKit bug tracker: https://bugs.webkit.org/show_bug.cgi?id=175027
[5] MDN — getUserMedia: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
[6] caniuse — backdrop-filter: https://caniuse.com/css-backdrop-filter
[7] Stack Overflow discussion: https://stackoverflow.com/questions/51822407/scrollintoview-smooth-not-working-in-iframe-in-ios
[8] React SyntheticEvent: https://react.dev/reference/react-dom/SyntheticEvent
[9] Источник: https://habr.com/ru/articles/925732/?utm_source=habrahabr&utm_medium=rss&utm_campaign=925732
Нажмите здесь для печати.