大于动态宽度父项时,弹性项目上的滚动条

Posted

技术标签:

【中文标题】大于动态宽度父项时,弹性项目上的滚动条【英文标题】:Scrollbar on flex item when bigger than dynamic width parent 【发布时间】:2019-04-16 03:47:21 【问题描述】:

我有一个居中的 flexbox 结构,它显示带有客户列表的框。

我想实现,当屏幕变得比#box div 内的内容窄时,它不会隐藏在视口之外,而是将溢出添加到最长的项目,即带有表格的#list,因此#box 可以动态缩小。

当我将 width: 100% 添加到 #box 但我不想要 框全屏宽度,直到它至少不等于内容的大小。

| JSFIDDLE DEMO |

body, html 
  
  margin: 0;
  width: 100%;
  height: 100%;
 font-size: 16px;
  


* 
  
  box-sizing: border-box;
  


#wrap 
  
  background-color: red;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 40px;
  flex-direction: column;
  


#box 
  
  background-color: #dcdcdc;
  padding: 10px;
  border-radius: 10px;
  display: flex;
  flex-direction: column;
  /*width: 100%; this works, but dont want it full until box is equal or smaller than content*/
  
  


#box > div 
  
  flex: 1 0 auto!important;
  


#title 
  
  text-align: center;
  margin-bottom: 20px;
  font-size: 20px;
  color: blue;


table 
  
  border-spacing: 0;
  border-collapse: collapse;
  table-layout: auto;
  white-space: nowrap;
  width: 100%;


table thead 
  
  font-weight: bold;


table tbody tr 
  
  height: 30px;


table td 
  
  padding: 0 5px;


#list 
  
  overflow: auto;
  background-color: rgba(0,0,0,0.05);
  
<div id="wrap">
    <div id="box">
      <div id="title">
      List of customers
      </div>
      <div id="list">
      <table>
        <thead>
          <tr>
            <td>First name</td>
            <td>Last name</td>
            <td>Address</td>
            <td>Telephone</td>
            <td>Decription</td>
          </tr>
        </thead>
        <tbody>
           <tr>
            <td>John</td>
            <td>Smith</td>
            <td>25th Jeffersons</td>
            <td>555 2589654123</td>
            <td>Pretty bad boy</td>
          </tr>
          <tr>
            <td>Anna</td>
            <td>Redford</td>
            <td>Trading street 252</td>
            <td>555 2541258745</td>
            <td>Booty babe</td>
          </tr>
          <tr>
            <td>Jack</td>
            <td>Jackson</td>
            <td>Dummy Dumm 55</td>
            <td>555 123456789</td>
            <td>Random persona</td>
          </tr>
          <tr>
            <td>Buck</td>
            <td>Buckson</td>
            <td>Dummy Dumm 66</td>
            <td>555 987654321</td>
            <td>Another random persona</td>
          </tr>
        </tbody>
      </table>
      </div>
  </div>
</div>

1 - 全屏窗口

2 - 调整大小(更小)的窗口

3 - 调整大小(更小)的窗口 - 想要的结果

12

3

【问题讨论】:

【参考方案1】:

尝试为#box 添加max-width: 100%; 而不是width: 100%; - 它应该可以解决问题。

【讨论】:

【参考方案2】:

body, html 
  
  margin: 0;
  width: 100%;
  height: 100%;
 font-size: 16px;
  


* 
  
  box-sizing: border-box;
  


#wrap 
  
  background-color: red;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 40px;
  flex-direction: column;
  


#box 
  
  background-color: #dcdcdc;
  padding: 10px;
  border-radius: 10px;
  display: flex;
  flex-direction: column;
  /*width: 100%; this works, but dont want it full until box is equal or smaller than content*/
max-width:100%;
  
  


#box > div 
  
  flex: 1 0 auto!important;
  


#title 
  
  text-align: center;
  margin-bottom: 20px;
  font-size: 20px;
  color: blue;


table 
  
  border-spacing: 0;
  border-collapse: collapse;
  table-layout: auto;
  white-space: nowrap;
 max-width: 100%;


table thead 
  
  font-weight: bold;


table tbody tr 
  
  height: 30px;


table td 
  
  padding: 0 5px;


#list 
  
  overflow: auto;
  background-color: rgba(0,0,0,0.05);
  
<div id="wrap">
    <div id="box">
      <div id="title">
      List of customers
      </div>
      <div id="list">
      <table>
        <thead>
          <tr>
            <td>First name</td>
            <td>Last name</td>
            <td>Address</td>
            <td>Telephone</td>
            <td>Decription</td>
          </tr>
        </thead>
        <tbody>
           <tr>
            <td>John</td>
            <td>Smith</td>
            <td>25th Jeffersons</td>
            <td>555 2589654123</td>
            <td>Pretty bad boy</td>
          </tr>
          <tr>
            <td>Anna</td>
            <td>Redford</td>
            <td>Trading street 252</td>
            <td>555 2541258745</td>
            <td>Booty babe</td>
          </tr>
          <tr>
            <td>Jack</td>
            <td>Jackson</td>
            <td>Dummy Dumm 55</td>
            <td>555 123456789</td>
            <td>Random persona</td>
          </tr>
          <tr>
            <td>Buck</td>
            <td>Buckson</td>
            <td>Dummy Dumm 66</td>
            <td>555 987654321</td>
            <td>Another random persona</td>
          </tr>
        </tbody>
      </table>
      </div>
  </div>
</div>

https://jsfiddle.net/65wfnegs/4/ 我也更新了你的小提琴,你应该使用 max-width 作为盒子和表格而不是给定宽度:)

【讨论】:

以上是关于大于动态宽度父项时,弹性项目上的滚动条的主要内容,如果未能解决你的问题,请参考以下文章

如何判断有没有出现滚动条

winform 滚动条

防止弹性项目超过父高度并使滚动条工作

VC中怎么滚动条宽度怎么解决

delphi 谁知道如何让image自动有滚动条(当图片尺寸大于image尺寸时

css隐藏div滚动条