Подтвердить что ты не робот

Каковы наилучшие методы определения отношения/плотности пикселей?

В настоящее время я использую JavaScript для обнаружения мобильных устройств на своем веб-сайте, это позволяет мне обслуживать разные контенты для мобильных или настольных пользователей.

В настоящее время я использую window.devicePixelRatio и screen.width для разработки, если пользователь, если на мобильном устройстве или нет, например:

var isMobileScreenWidth = ((screen.width / window.devicePixelRatio) < 768)

768px - это точка, в которой мы определяем мобильный или рабочий стол, так что 767 и ниже - мобильный, а 768 и выше - рабочий стол.

Это работает отлично, но я недавно столкнулся с проблемой с Firefox, когда Firefox увеличен и изменился, он изменил window.devicePixelRatio, поэтому:

zoom = 30%, window.devicePixelRatio = 0.3
zoom = 100%, window.devicePixelRatio = 1.0
zoom = 300%, window.devicePixelRatio = 3.0

Теперь это вызывает у меня проблему, потому что все пользователи, у которых браузер в браузере увеличиваются в Firefox, получают мобильную версию сайта.

Мне было интересно, знает ли кто-нибудь другой или лучший способ получить плотность пикселей, которая отделена от настольных браузеров.

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

Если у кого-нибудь есть идеи об этом и может помочь, это будет потрясающе.

UPDATE:

Я только что наткнулся на это:

window.screen.availWidth / document.documentElement.clientWidth

Этот быстрый бит математики предлагается в этом сообщении:

window.devicePixelRatio не работает в IE 10 Mobile?

Я тестировал его, и он работает в Firefox, и решает мою проблему, но, к сожалению, теперь вызывает проблему в Chrome, поэтому:

Chrome zoom = 100%,
window.devicePixelRatio = 1.0,
window.screen.availWidth / document.documentElement.clientWidth = 3.0

Я не могу найти твердого решения, которое работает на все.

4b9b3361

Ответ 1

Вы должны использовать подсказку производителя с помощью функции <meta name="viewport" content="width=device-width"/> или @-ms-viewport {width:device-width}. Он в основном предоставляет масштабирование по умолчанию, которое производитель устройства считает оптимальным, учитывая плотность пикселей экрана. После этого, когда вы вызываете window.innerWidth, он даст вам то, для чего предназначалось ваше исходное уравнение, но не полагаясь на измерение плотности пикселей.

Избегайте полагаться на window.devicePixelRatio для чего-либо. Его значение и ценность, которые он возвращает, в настоящее время находятся в состоянии изменения, и все, что вы делаете сейчас, основано на нем, скорее всего, скоро переломится.

Примечание: Meta viewport работает только на Android, iOS и Windows Phone 8. @-ms-viewport работает (правильно) на IE10 Metro и может вмешиваться в правильное поведение Meta viewport на Windows Phone 8.