CSS3 Адаптивное всплывающее окно

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

Я попытаюсь объяснить лучше, используя эти два макета: Настольная версия окна поискаМобильная версия окна поиска

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

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

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

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

@media only screen and (max-width: 320px) {
  .popup {
    width: 100%;
  }
}

@media only screen and (min-width: 320px) {
  .popup {
    width: 295px;
  }
}

@media only screen and (max-height: 320px) {
  .popup {
    height: 100%;
  }
}

@media only screen and (min-height: 320px) {
  .popup {
    height: 300px;
  }
}

Меня смущают две вещи:

  1. Глядя на эти значения min- и max-width, на самом деле не так уж хорошо. Телефон с разрешением Full HD будет выглядеть как настольный ПК, несмотря на то, что его размер составляет всего 5 дюймов. Есть ли чистый способ CSS ограничить размер экрана вместо разрешения? Или к обоим, которые затем также обслуживали бы настольные браузеры с измененным размером.
  2. Установка ширины на 100% работает нормально, потому что мое всплывающее окно начинается в самом левом углу экрана. Высота 100% не работает, потому что общая высота составляет 100% экрана + высота окна поиска + высота логотипа (как только я добавлю это), и поэтому она прокручивается в нижней части экрана. Что мне нужно, так это способ изменить его размер на расстояние между верхней частью моего DIV и нижней частью экрана.

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

Кроме того, я доволен решением, которое совместимо только с более новыми браузерами (скажем, двухлетней давности).

Редактировать: я должен добавить, что я использую Foundation в проекте. Я не использовал ничего из Foundation в этом фрагменте, но если есть что-то полезное, что я упустил, я буду более чем счастлив его использовать.

input {
  font-size: 18pt;
}

.popup {
  margin-top: 2px;
  position: absolute;
  display: block;
  background-color: Green;
}

@media only screen and (max-width: 320px) {
  .popup {
    width: 100%;
  }
}

@media only screen and (min-width: 320px) {
  .popup {
    width: 295px;
  }
}

@media only screen and (max-height: 320px) {
  .popup {
    height: 100%;
  }
}

@media only screen and (min-height: 320px) {
  .popup {
    height: 300px;
  }
}
<input/>
<div class="popup">
</div>
<div>
  Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. Some random text that is supposed to wind up underneath the popup. 
</div>


person Cobus Kruger    schedule 19.10.2016    source источник
comment
comment
для мобильных устройств, height:100vh   -  person Clyde Lobo    schedule 19.10.2016
comment
Почему HD-телефон отображается как настольный ПК с медиа-запросом максимальной ширины?   -  person Tom    schedule 19.10.2016
comment
Кроме того, ваши медиа-запросы слишком сложны. То, чего вы пытаетесь достичь, просто, и ваши медиа-запросы должны соответствовать этой простоте.   -  person Tom    schedule 19.10.2016
comment
@Tom Я просто имел в виду, что само по себе разрешение экрана не различает устройства с большим и маленьким экраном. Стандартный ноутбук с разрешением 1366x768 имеет более низкое разрешение, чем HD-телефон.   -  person Cobus Kruger    schedule 20.10.2016
comment
@ Том Слишком сложно? Ответ Джека кажется мне таким же сложным. Как бы вы поступили насчет упрощения?   -  person Cobus Kruger    schedule 20.10.2016


Ответы (1)


1) Можно включить разрешение (плотность пикселей) в медиа-запрос, чтобы ориентироваться на такие устройства, как Retina или HD-телефоны. Например,

@media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 13/10), only screen and (min-resolution: 120dpi)

будет нацелен на различные устройства сетчатки и HiDPI. (Источник.) При необходимости вы можете комбинировать это с запросами размера.

2) Чтобы получить что-то "высота экрана", попробуйте использовать 100vh вместо 100%. vh означает viewport height unit; 100vh = 1 высота окна. (50vh = половина высоты окна и т. д. vw делает то же самое для ширины.) Если вы обнаружите, что это все еще слишком высоко, вам может потребоваться настроить его, чтобы вычесть все, что добавляет высоту - IE, если у вас есть логотип или что-то еще это толкает элемент 100vh вниз на 80 пикселей, вы должны изменить высоту на height: calc(100vh - 80px), чтобы он подходил.

person jack    schedule 19.10.2016
comment
В итоге я смотрел только на размер, потому что с соотношением пикселей возникает еще большая путаница. Но это правильный ответ на мой вопрос. - person Cobus Kruger; 25.10.2016