React 响应式设计重新排序组件
React responsive design reorder components
我正在开发一个具有两种布局(移动版和桌面版)的网页。在桌面布局中,我想要一个垂直拆分的页面,其中主要内容位于右侧,页眉、页脚和内容图像位于左侧(查看下图)。
在移动设备上,我希望页面不再拆分的布局看起来有所不同,组件流从页眉开始,然后是主要内容,最后是页脚。内容图片不再显示(查看下图)。
我遇到的问题是移动布局。我想重新排列显示的组件而不必使用反应钩子重新渲染它们,因为创建的组件结构是这样的:
Page
├─ Left Pane
│ ├─ Header
│ ├─ Image
│ ├─ Footer
│
│
├─ Right Pane
├─ Main content
所需的移动结构如下所示:
Page
├─ Header
├─ Main Content
├─ Footer
我尝试根据使用 display/padding/margin 属性的媒体查询使用不同的 CSS 样式,并使它有些工作,但当页脚的内容太长时,这是一个 hacky 解决方案,它会与主要内容重叠,页面无法正常显示组件。
有没有什么方法可以做到这一点而不必触发 React 重新渲染?或者我的页面有更好的结构建议,以确保桌面版本中的左右窗格完全相互隔离并正确显示移动站点?
如果没有一些代码很难判断,但是如果您使用的是 flexbox,并且您想要一个纯粹的 css 解决方案,则可以在媒体查询中使用 order
。这里有一些信息:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Ordering_Flex_Items#the_order_property
有办法做到这一点!您需要使用 CSS Grid。下面是使用网格的功能预览。请注意,当下方预览的宽度小于 550 像素时,布局会发生变化。您可以更改 @media
查询以适合您的用例。
html,
body {
height: 100%;
}
* {
margin: 0;
padding: 0;
}
.grid {
height: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 50px auto 50px
}
.header {
background: #CDCD00;
grid-column: 1;
grid-row: 1;
}
.footer {
background: #CDCD00;
grid-column: 1;
grid-row: 3;
}
.image {
background: #372F9F;
grid-column: 1;
grid-row: 2;
}
.content {
background: #DF1829;
grid-column: 2;
grid-row: 1 / 4;
}
@media only screen and (max-width: 550px) {
.image {
display: none;
}
.content {
grid-column: 1;
grid-row: 2;
}
.grid {
grid-template-columns: 1fr;
}
}
/* Fancy unneccessary styles */
body {
font-family: sans-serif;
}
h1 {
margin: auto;
align-items: center;
}
div {
text-align: center;
display: flex;
justify-content: center;
}
<div class="grid">
<div class="header">
<h1>Header Placeholder</h1>
</div>
<div class="footer">
<h1>Footer Placeholder</h1>
</div>
<div class="image">
<h1>Image container</h1>
</div>
<div class="content">
<h1>Main content container</h1>
</div>
</div>
我正在开发一个具有两种布局(移动版和桌面版)的网页。在桌面布局中,我想要一个垂直拆分的页面,其中主要内容位于右侧,页眉、页脚和内容图像位于左侧(查看下图)。
在移动设备上,我希望页面不再拆分的布局看起来有所不同,组件流从页眉开始,然后是主要内容,最后是页脚。内容图片不再显示(查看下图)。
我遇到的问题是移动布局。我想重新排列显示的组件而不必使用反应钩子重新渲染它们,因为创建的组件结构是这样的:
Page
├─ Left Pane
│ ├─ Header
│ ├─ Image
│ ├─ Footer
│
│
├─ Right Pane
├─ Main content
所需的移动结构如下所示:
Page
├─ Header
├─ Main Content
├─ Footer
我尝试根据使用 display/padding/margin 属性的媒体查询使用不同的 CSS 样式,并使它有些工作,但当页脚的内容太长时,这是一个 hacky 解决方案,它会与主要内容重叠,页面无法正常显示组件。
有没有什么方法可以做到这一点而不必触发 React 重新渲染?或者我的页面有更好的结构建议,以确保桌面版本中的左右窗格完全相互隔离并正确显示移动站点?
如果没有一些代码很难判断,但是如果您使用的是 flexbox,并且您想要一个纯粹的 css 解决方案,则可以在媒体查询中使用 order
。这里有一些信息:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Ordering_Flex_Items#the_order_property
有办法做到这一点!您需要使用 CSS Grid。下面是使用网格的功能预览。请注意,当下方预览的宽度小于 550 像素时,布局会发生变化。您可以更改 @media
查询以适合您的用例。
html,
body {
height: 100%;
}
* {
margin: 0;
padding: 0;
}
.grid {
height: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 50px auto 50px
}
.header {
background: #CDCD00;
grid-column: 1;
grid-row: 1;
}
.footer {
background: #CDCD00;
grid-column: 1;
grid-row: 3;
}
.image {
background: #372F9F;
grid-column: 1;
grid-row: 2;
}
.content {
background: #DF1829;
grid-column: 2;
grid-row: 1 / 4;
}
@media only screen and (max-width: 550px) {
.image {
display: none;
}
.content {
grid-column: 1;
grid-row: 2;
}
.grid {
grid-template-columns: 1fr;
}
}
/* Fancy unneccessary styles */
body {
font-family: sans-serif;
}
h1 {
margin: auto;
align-items: center;
}
div {
text-align: center;
display: flex;
justify-content: center;
}
<div class="grid">
<div class="header">
<h1>Header Placeholder</h1>
</div>
<div class="footer">
<h1>Footer Placeholder</h1>
</div>
<div class="image">
<h1>Image container</h1>
</div>
<div class="content">
<h1>Main content container</h1>
</div>
</div>