#html #css #twitter-bootstrap #responsive-design
#HTML #css #twitter-bootstrap #адаптивный дизайн
Вопрос:
У меня есть макет, настроенный для меня в Bootstrap 5, который имеет, при больших размерах, боковую панель, состоящую из двух частей (навигация по сайту и более длинная навигация по оглавлению), и основную текстовую область:
--- -----
| 1 | 2 |
--- |
| 3 | |
--- -----
При узких размерах, когда все это сводится к одному столбцу, оно, конечно, сворачивается до порядка 1-3-2. Но table-of-contents
навигация (# 3) отвлекает и не должна быть главным, что люди видят на мобильных устройствах, поэтому я бы хотел, чтобы основная область находилась перед навигацией по оглавлению, т. Е. В порядке нумерации выше:
---
| 1 |
---
| 2 |
---
| 3 |
---
Структура страницы выглядит более или менее так, за исключением FOO BAR BAZ
того, что раздел на самом деле намного длиннее, что хорошо в качестве боковой панели, но ужасно, когда это главное, что вы видите:
Это было создано путем удаления множества более сложных элементов на странице, но сохранения фактической структуры. Все это было создано для меня кем-то другим, и я вообще не дизайнер, поэтому, если это потребует серьезного переписывания, я в конечном итоге все сломаю. Есть ли какой-нибудь простой способ заставить это свернуться в желаемом порядке в узких представлениях? (Чтобы было совершенно ясно, я бы хотел, чтобы «Заголовок / содержимое» было перед FOO BAR BAZ
.)
Вот самая маленькая версия, до которой мне удобно ее сократить:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
<title>TITLE</title>
</head>
<body class="bg-light">
<div class="container-fluid">
<div class="row">
<div class="col-lg-3 col-sm-4 p-0 vh-sm-100 vh-xs-auto overflow-sm-hidden overflow-xs-visible position-sm-sticky position-xs-static top-0 start-0 sidebar-parent">
<nav class="navbar navbar-expand-xs navbar-dark bg-dark sticky-top">
<div class="container">
<div class="vw-100 d-flex justify-content-between align-items-center">
<a class="navbar-brand" href="/">MYSITE</a>
</div>
<div class="row w-100 m-0" id="">
<form id="" class="d-inline-flex p-0" action="/">
<input class="form-control pe-2 me-2 typeahead tt-input" id="search" type="search" placeholder="search" aria-label="Search" style="position: relative; vertical-align: top;">
<div role="listbox" class="tt-menu" id="search_listbox" style="position: absolute; top: 100%; left: 0px; z-index: 100; display: none;">
</div>
<button class="btn btn-secondary" type="submit">Search</button>
</form>
</div>
</div>
</nav>
<div id="sidebar" class="list-group list-group-flush">
<div class="sidebar-list" id="sidebar-list"><a href="/" aria-current="true" class="list-group-item list-group-item-action py-0 list-group-item-action">FOO</a><a href="/" aria-current="true" class="list-group-item list-group-item-action py-0">BAR</a><a href="/" aria-current="true" class="list-group-item list-group-item-action py-0">BAZ</a></div>
</div>
</div>
<div id="main" class="col-lg-9 col-sm-8 col-xs-12 p-5">
<h1 id="">HEADING
</h1>
<p>
Content, content content content.
</p>
</div>
</div>
</div>
</body>
</html>
Здесь есть отдельная скрипка с немного большим количеством кода (она включает в себя меню гамбургеров).
Ответ №1:
Для вашей ситуации и потому, что вы сказали:
если для этого потребуется какое-либо серьезное переписывание, я в конечном итоге все нарушу
Я бы посоветовал вам дублировать <div id="main">
и поместить дублированный прямо ниже <nav>
, а затем переключать (показывать / скрывать) между ними.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
<title>TITLE</title>
</head>
<body class="bg-light">
<div class="container-fluid">
<div class="row">
<div class="col-lg-3 col-sm-4 p-0 vh-sm-100 vh-xs-auto overflow-sm-hidden overflow-xs-visible position-sm-sticky position-xs-static top-0 start-0 sidebar-parent">
<nav class="navbar navbar-expand-xs navbar-dark bg-dark sticky-top">
<div class="container">
<div class="vw-100 d-flex justify-content-between align-items-center">
<a class="navbar-brand" href="/">MYSITE</a>
</div>
<div class="row w-100 m-0" id="">
<form id="" class="d-inline-flex p-0" action="/">
<input class="form-control pe-2 me-2 typeahead tt-input" id="search" type="search" placeholder="search" aria-label="Search" style="position: relative; vertical-align: top;">
<div role="listbox" class="tt-menu" id="search_listbox" style="position: absolute; top: 100%; left: 0px; z-index: 100; display: none;">
</div>
<button class="btn btn-secondary" type="submit">Search</button>
</form>
</div>
</div>
</nav>
<div id="main" class="d-block d-sm-none p-5">
<h1 id="">HEADING
</h1>
<p>
Content, content content content.
</p>
</div>
<div id="sidebar" class="list-group list-group-flush">
<div class="sidebar-list" id="sidebar-list"><a href="/" aria-current="true" class="list-group-item list-group-item-action py-0 list-group-item-action">FOO</a><a href="/" aria-current="true" class="list-group-item list-group-item-action py-0">BAR</a><a href="/" aria-current="true" class="list-group-item list-group-item-action py-0">BAZ</a></div>
</div>
</div>
<div id="main" class="col-lg-9 col-sm-8 col-xs-12 p-5 d-none d-sm-block">
<h1 id="">HEADING
</h1>
<p>
Content, content content content.
</p>
</div>
</div>
</div>
</body>
</html>
ВАЖНО
Если это для статического веб-сайта, он будет работать отлично, но в случае, если это динамический веб-сайт (контент поступает из базы данных или используется функция id="main"
), это может привести к ошибкам, потому что у вас дублированный id's
.
Комментарии:
1. Это увлекательный подход, но, к сожалению, это динамический веб-сайт, и создание двух идентичных версий
main
div само по себе потребует большого количества манипуляций; кроме того, основной контент может быть достаточно длинным, чтобы дублировать его полностью, было бы много места. И к этому идентификатору могут быть подключены функции JS. Существуют ли другие разумные решения?2. Как насчет дублирования третьего столбца, если он статический?