Jar*_*rad 6 html css flexbox bootstrap-4
我只是不确定如何做我想要实现的目标。
前置上下文
grid-template-areas布局添加更多行,但我的内容将是可变高度,因此此解决方案似乎可能会导致意外的空白,具体取决于内容。相关背景
图1
在下图中,“卡片下部侧边栏”位于搜索框区域和“主要内容区域”之间。当屏幕转换为 xl (1200px) 时,“卡片下侧边栏”内容块会弹出,成为右下侧边栏区域。搜索框和主要内容区域保持原样。
个人资料区域弹出成为右上角的侧边栏区域。
我什至不知道这是否可能。
之前(lg 屏幕)
之后(xl 屏幕)
我不想用我尝试过的许多错误的事情来混淆这个问题。我已经尝试了很多。
这是最小的示例代码:
html {
height: 100%;
}
body {
min-height: 100%;
padding-top: 56px;
}
.sidebar {
display: none;
}
@media (min-width: 768px) {
.main {
padding-left: 370px;
}
.sidebar {
position: fixed;
width: 350px;
top: 56px;
bottom: 0;
left: 0;
z-index: 1000;
display: block;
padding: 20px;
overflow-x: hidden;
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
background-color: #f5f5f5;
border-right: 1px solid #eee;
}
}
#profile-img {
width: 150px;
height: 150px;
background-color: #c9c9c9;
}Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Responsive Scalable Layout</title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
<link rel="stylesheet" href="css/custom2.css">
</head>
<body>
<nav class="navbar navbar-expand-md navbar-light bg-light fixed-top">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
</ul>
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="sidebar">
<h1>Left Sidebar</h1>
</div>
<div class="col-sm-12 main">
<div id="breadcrumbs">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="#">Home</a>
</li>
<li class="breadcrumb-item">
<a href="#">Library</a>
</li>
<li class="breadcrumb-item active" aria-current="page">Data</li>
</ol>
</nav>
</div>
<div id="search">
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Search..."
aria-label="Recipient's username" aria-describedby="button-addon2">
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" id="button-addon2">Button
</button>
</div>
</div>
</div>
<div id="cards-block">
<div class="card">
<div class="card-body">
<h5 class="card-title">Card title</h5>
<h6 class="card-subtitle mb-2 text-muted">Card subtitle</h6>
<p class="card-text">Some quick example text to build on the card title and make up
the bulk of the card's content.
</p>
<a href="#" class="card-link">Card link</a>
<a href="#" class="card-link">Another link</a>
</div>
</div>
<div class="card">
<div class="card-body">
<h5 class="card-title">Card title</h5>
<h6 class="card-subtitle mb-2 text-muted">Card subtitle</h6>
<p class="card-text">Some quick example text to build on the card title and make up
the bulk of the card's content.
</p>
<a href="#" class="card-link">Card link</a>
<a href="#" class="card-link">Another link</a>
</div>
</div>
</div>
<div id="content" class="border rounded">
<div class="p-2">
<h1>Main Content</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium aspernatur aut
debitis ipsa maiores molestiae qui suscipit vitae? Accusamus consequatur consequuntur
corporis cumque delectus, deserunt dolor doloremque dolorum eaque enim esse facere
facilis illo impedit incidunt ipsa laborum molestiae natus nihil praesentium quia quis
quo repellat repudiandae, rerum suscipit tempore totam velit voluptatem voluptatum?
Accusamus alias aliquam aperiam consectetur doloremque iste labore recusandae sed.
Accusamus accusantium ad beatae cumque deserunt eaque hic ipsum laudantium, magni
minima odit quas quos tempore tenetur voluptas. A, adipisci autem deserunt ducimus est
facilis fugiat itaque iusto minus, nam, nobis quas rerum sint totam voluptatum?
</p>
</div>
</div>
<div class="border rounded" id="profile">
<div class="card p-2">
<div id="profile-img"></div>
<div class="card-body">
<h5>Profile</h5>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
crossorigin="anonymous"></script>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
注意:我不久前发布了一个类似的问题,但我回答了我自己的问题,我自己的回答很差。长话短说,我不能在 Django 中重复一个内容块两次(在模板中抛出重复的标签错误)。因此,我想为此找到一个解决方案,该解决方案不会在 HTML 中两次复制相同的代码块。
更新
谦虚恭敬地回答如下:
案例:
更新最终版:
@focus.style 提供了解决此问题要求的最完整和创新的答案。特别感谢@sherrifdereck 等,因为它激励我深入研究响应式 CSS 设计。
我要做的第一件事就是确定碎片。
(我打了很长时间……但 CSS 网格很神奇!)
因此,您可以确保这些部分不会发生冲突。现在,你在这里(可能)有一些疯狂的技巧和利润魔法...... - 但可能不是/所以,这是 CSS 网格来救援的时候了。这就是它的用途!
第一部分:https : //codepen.io/sheriffderek/pen/8e7bf2469b0cd16515f1278fa0519eea?editors=1100
您可能也应该在中等断点处做一些事情......
第二部分:https : //codepen.io/sheriffderek/pen/3d57b839cf62d00b4bdc46af698218ca?editors=1100
第三部分:https : //codepen.io/sheriffderek/pen/215e14b16e1a8af05bce4ab236dab465
<header>
<nav>
app header / nav-bar
</nav>
</header>
<aside class="sidebar">
sidebar
</aside>
<nav class="actions">
bread-crumbs and search
</nav>
<section class="cards">
cards
</section>
<main>
main stuffs
</main>
<aside class="profile">
profile stuff
</aside>
Run Code Online (Sandbox Code Playgroud)
.
* {
box-sizing: border-box;
}
body {
margin: 0;
}
header {
border: 5px solid lightblue;
padding: 10px;
}
.sidebar {
border: 5px solid #ff0066;
padding: 10px;
}
.actions {
border: 5px solid lime;
padding: 10px;
}
.cards {
border: 5px solid orange;
padding: 10px;
}
main {
border: 5px solid yellow;
padding: 10px;
}
.profile {
border: 5px solid black;
padding: 10px;
}
/* with flex-box... you COULD reorder these a bit on small screens if you wanted */
/* your 'medium' size */
@media (min-width: 600px) {
}
/* your 'large' size */
@media (min-width: 900px) {
body { /* look! it's like a little drawing of the layout!" */
display: grid;
grid-template-areas:
"header header header"
"sidebar actions actions"
"sidebar cards cards"
"sidebar main main"
"sidebar profile profile";
}
header {
grid-area: header; /* note! no quotes " " */
}
.sidebar {
grid-area: sidebar;
}
.actions {
grid-area: actions;
}
.cards {
grid-area: cards;
}
main {
grid-area: main;
}
.profile {
grid-area: profile;
}
}
/* your 'extra-large' size */
@media (min-width: 1300px) {
body { /* look! it's another drawing of the layout!" */
display: grid;
grid-template-areas:
"header header header header"
"sidebar actions actions profile"
"sidebar main main cards"
"sidebar main main cards";
}
}
Run Code Online (Sandbox Code Playgroud)
疯狂的!对!???
注意:请记住,还有更多问题,这肯定是快乐路径示例。您可能在内容父级上有一个最大宽度 - 并且事情可能会根据您在每个区域中放置的内容而改变 - 但这应该可以帮助您前进。
这是如何使用 99% Bootstrap 解决此任务的示例(.break无论如何必须添加一个额外的类)。我这样做是因为我很好奇 BS 是否可以处理它。
html {
height: 100%;
}
body {
height: 100%;
}
.break {
flex-basis: 100%;
width: 0;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script>
<div class="bg-primary">Navbar</div>
<div class="d-flex flex-wrap flex-column h-75">
<div class="col-3 flex-fill bg-danger">Fixed</div>
<div class="break"></div>
<div class="col-lg-6 col-9 flex-fill flex-grow-0 bg-success order-1">Search</div>
<div class="col-lg-3 col-9 flex-fill bg-warning order-lg-4 order-1">Cards Lower Sidebar</div>
<div class="col-lg-6 col-9 flex-fill bg-info order-1">Main Content Area</div>
<div class="col-lg-3 col-9 flex-fill flex-grow-0 bg-dark order-lg-3 order-1">User</div>
<div class="break order-2"></div>
</div>Run Code Online (Sandbox Code Playgroud)
或者在Codepan 上,以动态方式查看它。
更新
我已经测试了所有答案,确实没有针对此任务的简单 CSS 解决方案。但!在您使用 Bootstrap 4 时登录 - 我没有看到使用 jQuery 的任何障碍。干得好。一个防弹的答案,现在可以正常工作。那天并没有提供任何一个额外的 CSS。
transferBlocks(); // calling function
window.addEventListener('resize', () => {
transferBlocks(); // calling function on resize
});
function transferBlocks() {
if ($(window).width() < 992) { /* checking for bootstrap LG breakpoint */
// placing #cardsLowerSidebar and #user in center column
$('#search').after($('#cardsLowerSidebar'));
$('#mainContentArea').after($('#user'));
} else {
// placing #cardsLowerSidebar and #user in right column
$('#colRight').append($('#user'));
$('#colRight').append($('#cardsLowerSidebar'));
}
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script>
<div class="d-flex flex-nowrap flex-column min-vh-100">
<div class="bg-primary">Navbar</div>
<div class="flex-fill d-flex flex-nowrap">
<div class="col-3 px-0 bg-danger">Fixed</div>
<div class="col-lg-6 col-9 px-0 d-flex flex-nowrap flex-column">
<div id="search" class="bg-success">Search</div>
<div id="cardsLowerSidebar" class="flex-fill bg-warning">Cards Lower Sidebar</div>
<div id="mainContentArea" class="flex-fill bg-info">Main Content Area Main Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content Area</div>
<div id="user" class="bg-dark">User<br>Subuser</div>
</div>
<div id="colRight" class="col-lg-3 px-0 d-flex flex-nowrap flex-column">
</div>
</div>
</div>Run Code Online (Sandbox Code Playgroud)
或者在Codepan 上,以动态方式查看它。
更新 2
Bootstrap 和display: grid自由形式 JS 的组合。它也很有用。
对于宽度超过 992 像素的屏幕,假设我们有grid2 列和 24 行。
第一列由#searchwith grid-row: 1 / span 1;(从间隙 #1 开始,跨越 1 行)和#mainContentAreawith grid-row: 2 / span 23;(从间隙 #2 开始,跨越 23 行)组成。1+23=24 行。
第二列由#userwith grid-row: 1 / span 2; (从间隙 #1 开始,跨越 2 行,高于#search) 和#cardsLowerSidebarwith grid-row: 3 / span 22;(从间隙 #3 开始,跨越 22 行,因为#user跨越 2 行不同于#search)。2+22=24 行。
24 行不是常数,可以使用其他值。在这里,它需要设置#cardsLowerSidebar并#mainContentArea与 gossible 一样高。
更多关于Grid Row。
.d-grid {
display: grid;
grid-template-columns: 2fr 1fr;
grid-auto-rows: auto;
}
#search {
order: 1;
grid-row: 1 / span 1;
}
#cardsLowerSidebar {
order: 4;
grid-row: 3 / span 22;
}
#mainContentArea {
order: 2;
grid-row: 2 / span 23;
}
#user {
order: 3;
grid-row: 1 / span 2;
}
@media (max-width: 991.99px) {
.d-grid {
grid-template-columns: 1fr;
grid-auto-rows: auto auto 1fr auto;
}
#search {
order: 1;
grid-row: auto;
}
#cardsLowerSidebar {
order: 2;
grid-row: auto;
}
#mainContentArea {
order: 3;
grid-row: auto;
}
#user {
order: 4;
grid-row: auto;
}
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script>
<div class="d-flex flex-nowrap flex-column min-vh-100">
<div class="bg-primary">Navbar</div>
<div class="flex-fill d-flex flex-nowrap">
<div class="col-3 px-0 bg-danger">Fixed</div>
<div class="col-9 px-0 d-grid">
<div id="search" class="bg-success">Search</div>
<div id="cardsLowerSidebar" class="flex-fill bg-warning">Cards Lower Sidebar</div>
<div id="mainContentArea" class="flex-fill bg-info">Main Content Area Main Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content
AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain
Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content
AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain
Content AreaMain Content AreaMain Content AreaMain Content Area</div>
<div id="user" class="bg-dark">User<br>Subuser</div>
</div>
</div>
</div>Run Code Online (Sandbox Code Playgroud)
@sheriffderek 的回答是一个非常好的整体解决方案。但是,您可以稍微简化它以混合flexbox和grid。这将允许您继续使用 Bootstrap 进行某些布局。
我怀疑您是否会找到完整的 Bootstrap 4 解决方案。问题是,Bootstrap 没有使用 CSS Grid 进行布局。如果您使用 Bootstrap 创建一个 Grid,那么 Grid 功能只是使用嵌套的 flex 元素来伪造。
这就是我将如何处理这个问题。
使用传统的布局规则和 flexbox 布局页面的主要部分。我会将标题完全排除在外,因为它不会移动/更改,并且默认值是display:block根据需要向下推送其他内容。
------------------------------------------------------------------
| header (display block) |
------------------------------------------------------------------
| | |
| | |
| nav (flex) | content (flex) |
| | |
------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
注意:如果你愿意,你可以在这部分使用 Bootstrap,但我将display:flex在我的例子中简单地使用它,因为它更容易编写,以后其他人也更容易遵循。
------------------------------------------------------------------
| header (display block) |
------------------------------------------------------------------
| | |
| | |
| nav (flex) | content (flex) |
| | |
------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
header {
background-color: lightGray;
padding: 10px;
text-align: center;
}
#mainContent {
display:flex;
}
nav {
background-color: aqua;
padding: 10px;
text-align: center;
flex-basis: 33.3333%;
min-height: 100px;
}
#content {
background-color: tan;
padding: 10px;
text-align: center;
flex-basis: 66.6666%;
}Run Code Online (Sandbox Code Playgroud)
正常显示不需要任何花哨的网格或 flexbox 东西。默认情况下,块元素会将其他所有内容都推低,这就是您所模拟的。
<header>Header Content</header>
<div id="mainContent">
<nav>Nav Bar</nav>
<section id="content">Content</section>
</div>Run Code Online (Sandbox Code Playgroud)
header {
background-color: lightGray;
padding: 10px;
text-align: center;
}
header {
background-color: lightGray;
padding: 10px;
text-align: center;
}
#mainContent {
display:flex;
}
nav {
background-color: aqua;
padding: 10px;
text-align: center;
flex-basis: 33.3333%;
min-height: 100px;
}
#content {
background-color: tan;
padding: 5px 10px;
text-align: center;
flex-basis: 66.6666%;
}
.search, .cards, .content, .profile {
background: rgba(0,0,0,0.2);
padding: 10px;
margin: 5px 0;
}Run Code Online (Sandbox Code Playgroud)
这是您使用媒体查询应用 CSS 网格来覆盖块级布局的地方。
<header>Header Content</header>
<div id="mainContent">
<nav>Nav Bar</nav>
<section id="content">
<div class="search">Search</div>
<div class="cards">Cards</div>
<div class="content">Main Content</div>
<div class="profile">Profile</div>
</section>
</div>Run Code Online (Sandbox Code Playgroud)
header {
background-color: lightGray;
padding: 10px;
text-align: center;
}
#mainContent {
display: flex;
}
nav {
background-color: aqua;
padding: 10px;
text-align: center;
flex-basis: 33.3333%;
min-height: 100px;
}
#content {
background-color: tan;
padding: 5px 10px;
text-align: center;
flex-basis: 66.6666%;
}
.search,
.cards,
.content,
.profile {
background: rgba(0, 0, 0, 0.2);
padding: 10px;
margin: 5px 0;
}
@media screen {
/* normally you would have sizes here but we're just showing the media query effect */
#content {
padding: 5px;
display: grid;
grid-template-areas: "search profile"
"content profile"
"content cards"
"content cards";
}
.search,
.cards,
.content,
.profile {
margin: 5px;
}
}Run Code Online (Sandbox Code Playgroud)
如果您想显式更改大小,您可以使用Grid 的大小调整系统或grid-template-areas使用多个相同名称的行/列更新。