Flexbox 布局,桌面上有两列,移动设备上有一列

Posted

技术标签:

【中文标题】Flexbox 布局,桌面上有两列,移动设备上有一列【英文标题】:Flexbox layout with two columns on desktop and one column on mobile 【发布时间】:2019-09-26 10:41:29 【问题描述】:

带有 flexbox 问题的简单布局:

桌面布局要求

两个响应列 第一列占宽度的 30% 第二列占宽度的 70%

移动版式要求

单一响应列 第一行,宽度为 100%(这是桌面上的第一列) 第 2 行,宽度为 100%(这是桌面上的第 2 列)

到目前为止我的收获:

当我切换到mobile(通过按钮单击例如下面的 sn-p)模式时,我在 flex 容器上设置了flex-direction: column。它似乎工作。

#flexContainer 
  display: flex;


#flexItem1 
  background-color: lightblue;
  flex: 30%;


#flexItem2 
  flex: 70%;
  background-color: lightgreen;


注意:

这个问题是关于需要更改哪些 CSS flexbox 属性才能从桌面布局转到移动布局。这与如何检测窗口大小或如何设置媒体查询无关。如果我写的方式不够清楚,我很抱歉。


问题

有没有更简洁的方法来做到这一点? 在移动模式下,我是否需要将flexItemsflex 属性设置为100%,或者我可以将它们保留为30%70%,因为在设置flex-direction 时它们似乎无关紧要给column

function App() 
 
  const [mobile,setMobile] = React.useState(false);
    
  return(
  <React.Fragment>
    <div id="flexContainer" style=mobile ? flexDirection: 'column' : null>
      <div id="flexItem1">Item 1</div>
      <div id="flexItem2">Item 2</div>
    </div>
    <button onClick=()=>setMobile(prevState=>!prevState)>Toogle</button>
  </React.Fragment>
  );



ReactDOM.render(<App/>, document.getElementById('root'));
#flexContainer 
  display: flex;


#flexItem1 
  background-color: lightblue;
  flex: 30%;


#flexItem2 
  flex: 70%;
  background-color: lightgreen;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>

【问题讨论】:

使用 媒体查询 切换到flex-direction: column 是一种很好的处理方式我猜... 谢谢!虽然我没有使用媒体查询。但我的问题是关于布局 flexbox CSS 属性本身(例如,如何以正确的方式设置 flex 属性以实现这一点)。不管我如何实现从移动到桌面的切换。 媒体查询会很简单...这是一个使用 wrapping flexbox 的解决方案,使用 flex-basis 相对于移动断点 codepen.io/anon/pen/MRNoZz 【参考方案1】:

您可以在样式化的组件中使用断点。

https://www.w3schools.com/css/css_rwd_mediaqueries.asp

https://www.styled-components.com/docs/basics

【讨论】:

【参考方案2】:

由于您没有任何奇怪的从移动到桌面的列切换,我会做的是(我相信这是最干净的方式)

首先考虑移动设备(移动设备优先是最佳做法),然后将媒体查询用于桌面版本。基本上将您的容器设置为显示块,并将其中两列的宽度设置为 100%。然后在桌面上,通过查询使您的容器灵活。

CSS:

#flexContainer 
  display: block;
  background-color: blue;


@media only screen and (min-width: 1024px) 
  #flexContainer 
    display: flex;
  

或者就像我在 SCSS 中做的那样:

#flexContainer 
  display: block;
  background-color: blue;

     @media only screen and (min-width: 1024px) 
        display: flex;
     

【讨论】:

谢谢!你会如何处理 flexItems 的比例?我需要第一列为 30%,第二列为 70%。 @cbdev420 嘿。我认为在这种情况下你需要阅读这个stack overflow post。另外,尽量避免将 id 作为 css 的基础。一般规则:ids 用于通过 js/react 等获取,classes 用于样式。 多么有趣的答案……完美匹配这个网站……https://newbedev.com/flexbox-layout-with-two-columns-on-desktop-and-one-column-on-mobile @Millhorn 恰恰相反,这是我多年前的真实答案。我很高兴有人会偷它。

以上是关于Flexbox 布局,桌面上有两列,移动设备上有一列的主要内容,如果未能解决你的问题,请参考以下文章

简单横幅广告-是否有更好的桌面和移动版面布局方式? (Flexbox / CSS Grid)

响应式 flexbox 和重新排序子子项

移动单列表单布局,桌面双列

移动端和pc端,响应式设计布局

Bootstrap/flexbox 卡:在桌面上将图像移动到左侧/右侧

Flexbox:包装元素而不嵌套