Как точно определить, работает ли мобильный телефон через screen.availWidth (а не планшет, ноутбук и т. Д. c) - PullRequest
0 голосов
/ 27 февраля 2020

Я работаю над галереей. Я хотел бы показать портретно-ориентированные изображения пользователям мобильных телефонов и пейзажно-ориентированные картинки всем остальным (планшеты, ноутбуки и т. Д. c).

То, что у меня сейчас есть:

var maxW = window.screen.availWidth * window.devicePixelRatio;

if (maxW <= 767){
    galleryImages = portraitImages;
}else{
    galleryImages = landscapeImages;
};

var portraitImages = [  'https://static.photocdn.pt/images/articles/2016-7/landscape-comp/iStock_000058793850_Medium.jpg',
 'https://keyassets.timeincuk.net/inspirewp/live/wp-content/uploads/sites/12/2016/05/AP_Portrait_Landscapes_Stu_Meech-5.jpg',
 'https://keyassets.timeincuk.net/inspirewp/live/wp-content/uploads/sites/12/2016/05/AP_Portrait_Landscapes_Stu_Meech-16.jpg', 
'https://static.photocdn.pt/images/articles/2016-7/landscape-comp/iStock_000062009934_Medium.jpg']

var landscapeImages = ['https://images.unsplash.com/photo-1506744038136-46273834b3fb?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjM3Njd9&w=1000&q=80', 
'https://images.unsplash.com/photo-1506260408121-e353d10b87c7?ixlib=rb-1.2.1&w=1000&q=80', 
'https://www.tom-archer.com/wp-content/uploads/2017/03/landscape-photography-tom-archer-4.jpg', 
'https://s.yimg.com/uu/api/res/1.2/DdytqdFTgtQuxVrHLDdmjQ--~B/aD03MTY7dz0xMDgwO3NtPTE7YXBwaWQ9eXRhY2h5b24-/https://media-mbst-pub-ue1.s3.amazonaws.com/creatr-uploaded-images/2019-11/7b5b5330-112b-11ea-a77f-7c019be7ecae', 
'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/hbx030117buzz14-1550595844.jpg']

Теперь, скажем, наименьшее «разрешение» для планшетов - 768x1024. Когда я go для Dev Tools, введите 768x1024 в разрешении и вызову alert("MaxW: " + maxW + ",\nMaxH : " + maxH);, я получаю MaxW: 1536, MaxH: 2048, что вызвано отношением пикселей к устройству.

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

Я не очень хорошо могу сказать «показать галерею изображений, если максимальная ширина устройства составляет 2048», так как некоторые компьютерные мониторы разрешение хуже.

Надеюсь, я понял смысл. Если я могу предоставить любую дополнительную информацию / объяснение, дайте мне знать.

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

С помощью свойств окна innerWidth и innerHeight вы можете рассчитать ширину и высоту экрана в пикселях. На моем экране 2560x1600 он возвращает размеры 1280x800 с учетом отношения пикселей к устройству.

function getWindowDimensions() {
  const width = window.innerWidth;
  const height = window.innerHeight;
  const ratio = (width / height) * 100;
  return { width, height, ratio };
}

const { width } = getWindowDimensions();

if (width < 768) {
    galleryImages = portraitImages;
} else {
    galleryImages = landscapeImages;
}

Кроме того, вместо выбора изображений в JavaScript вы также можете использовать <picture> и используйте атрибут srcset. С элементом <picture> вы можете добавлять медиазапросы для показа изображений на основе условия в этом запросе. Это даст вам возможность добавить оба набора изображений в HTML, и браузер затем решит, какое изображение показать на основе вашего запроса.

<picture>
  <source media="(max-width: 767px)" srcset="portrait.jpg">
  <source media="(min-width: 768px)" srcset="landscape.jpg">
  <img src="landscape.jpg" alt="Your image description">
</picture>

Я бы посоветовал вам создать пары для вашего изображения, чтобы добавить к элементу изображения. Например, в массиве объектов с ключами portrait и landscape. L oop над массивом и создать элемент <picture> для каждой из этих пар с тегами <source>, указанными для медиазапроса и соответствующим ему значением srcset.

const images = [
  {
    portrait: './portrait-image-1.jpg',
    landscape: './landscape-image-1.jpg'
  },
  {
    portrait: './portrait-image-2.jpg',
    landscape: './landscape-image-2.jpg'
  },
  {
    portrait: './portrait-image-3.jpg',
    landscape: './landscape-image-3.jpg'
  }
];

for (const { portrait, landscape } of images) {

  const picture = document.createElement('picture');
  const sourcePortrait = document.createElement('source');
  const sourceLandscape = document.createElement('source');
  const image = document.createElement('img');

  sourcePortrait.media = '(max-width: 767px)';
  sourcePortrait.srcset = portrait;
  sourceLandscape.media = '(min-width: 768px)';
  sourceLandscape.srcset = landscape;
  image.src = landscape;

  picture.append(sourcePortrait, sourceLandscape, image);
  document.body.append(picture);

}

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

0 голосов
/ 27 февраля 2020

Почему вы предполагаете, что портрет = телефон и пейзаж = планшет? Я мог (и, вероятно, использовал бы для галереи) использовать свой телефон в альбомной ориентации.

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

Тогда оно будет работать независимо от того, какое устройство и какая ориентация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...