Пустое пространство: Nowrap не работает хорошо, что я сделал не так?
Я делаю адаптивную веб-страницу, где при максимальной ширине 768 пикселей (через медиа-запрос) div внутри основного контейнера должен измениться на inline-block, чтобы страница прокручивалась горизонтально до идентификатора div, когда пользователь нажимает на ссылку. Страница настроена с переполнением: скрыто, поэтому она перемещается с использованием только идентификатора / привязки.
Проблема в том, что когда я делал предварительный просмотр на мобильном устройстве, контейнер просто растягивался, и я могу полностью пролистать страницу. Даже кнопка меню, которая должна находиться в центре порта просмотра, переместилась в центр контейнера. И оставляя огромный пробел под ним. Однако в настольном браузере все получилось. Так что я предполагаю, что все это связано с функцией nowrap.
Он работал в Firefox как для мобильных, так и для настольных компьютеров. Это работало на рабочем столе IE. Это не работает в Chrome Mobile, но, похоже, работает на настольном компьютере. И не удалось в Safari Mobile, еще не тестировали в настольных ПК.
Я попытался удалить пробелы: функция nowrap только для того, чтобы выяснить, что div не суммирует inline-block, как предполагалось. Я попытался указать ширину контейнера и минимальную ширину без удачи. Я попробовал float: left, значения позиций и кучу вещей, которые я не помню их всех. Ничего не меняется.
HTML
<div id="container">
<div id="company" class="company">
<iframe src="main.html">
</iframe>
</div>
<div id="content" class="content">
<iframe src="content.html">
</iframe>
</div>
<div id="system" class="system">
<iframe src="system.html">
</iframe>
</div>
</div>
CSS
body{
overflow: hidden;
}
#container {
height: 100vh !important;
min-height: 100vh !important;
}
#container .company, #container .content, #container .system {
display: block;
height: 100vh !important;
min-height: 100vh !important;
}
@media screen and (max-width:768px) {
#container {
display: block;
white-space: nowrap;
}
#container .company, #container .content, #container .system {
display: inline-block;
}
}
iframe {
width: 100vw !important;
min-width: 100vw !important;
height: 100vh !important;
min-height: 100vh !important;
border: none;
}
Чего я ожидал (рабочий стол Chrome) https://kamalmasrun.files.wordpress.com/2019/01/desktop.jpg
Но это происходит только на мобильных устройствах https://kamalmasrun.files.wordpress.com/2019/01/screenshot_20190122-120510.png
Ваша помощь очень ценится, и я вначале благодарю всех за помощь =).
2 ответа
По сути, у вас есть несколько проблем здесь:
- настройка
overflow: hidden
не будет препятствовать прокрутке браузера на мобильном устройстве (в Firefox это возможно, но в Chrome или iOS Safari - нет). Честно говоря, блокировка прокрутки на мобильных устройствах - это сложная задача, и она всегда немного хакерская, поэтому я бы так не поступил. - Для достижения прокрутки (или прыжка), используя ссылки с
#content
и т.д., тело должно быть расширено, и браузер должен увидеть, где находится этот элемент. Расширение тела приведет к тому, что пользователь сможет прокручивать влево / вправо, что сложно заблокировать, как я упоминал ранее. Вы должны прокрутить#container
показать новый элемент. Вы можете сделать это с помощью JavaScript.
Также не забудьте добавить overflow: hidden
в #container
(это будет работать на мобильном телефоне).
Если что-то все еще неясно, не стесняйтесь спрашивать в комментариях ниже этого ответа:)
Идея алгоритма для достижения вашей цели:
- Слушать
hashchange
событие - Считать текущий хеш из
window.location
- Найти элемент с заданным хешем
document.querySelector
- Чтение позиции элемента внутри контейнера
- Задавать
scrollLeft
свойство контейнера быть равным положению элемента
Несколько полезных ссылок для начала:
- https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onhashchange
- https://developer.mozilla.org/en-US/docs/Web/API/Window/location
- https://developer.mozilla.org/pl/docs/Web/API/Document/querySelector
- https://developer.mozilla.org/pl/docs/Web/API/Element/getBoundingClientRect
- https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft
И обновленный CSS:
body {
overflow: hidden;
margin: 0;
}
#button {
position: fixed;
vertical-align: center;
}
#button .btn1,
.btn2,
.btn3 {
padding: 10px;
display: inline-block;
}
#container .company,
.content,
.system {
display: block;
height: 100vh;
min-height: 100vh;
width: 100vw;
}
@media screen and (max-width:768px) {
#container {
display: flex;
flex-flow: row nowrap;
}
#container .company,
.content,
.system {
display: block;
}
}
iframe {
border: none;
height: 100vh;
min-height: 100vh;
width: 100vw;
}
Возможно, что установка минимальной / максимальной ширины в #container поможет.
#container {
min-width: 100vw;
max-width: 100vw;
}
Кроме того, я бы предложил использовать flex здесь, так как он подходит и более современен.