修复了滚动列表顶部的标题。所有列高度相同的 Flex 布局

Posted

技术标签:

【中文标题】修复了滚动列表顶部的标题。所有列高度相同的 Flex 布局【英文标题】:Fixed Header at top of scrolled list. Flex Layout with all columns same height 【发布时间】:2016-01-24 15:51:02 【问题描述】:

似乎无法让它工作。想要为不随 div 滚动的蓝色和绿色 div 添加一个固定的标题。让这件事变得复杂的是:

左侧的红色画布是唯一宽度缩小的元素 画布元素保持宽高比,同时高度缩小 随着 Canvas 高度缩小,蓝色和绿色 div 的高度也会缩小。

JSFiddle

html

<div class="container">
  <div class="left">
    <canvas id="draw"  ></canvas>
  </div>
  <div class="center"><div id="center" class="scroll"></div></div>
  <div class="right"><div id="right" class="scroll"></div></div>
</div>

CSS

.container 
  max-width: 650px;
  margin: 0 auto;
  border: 1px solid black;
  display: flex;

.container > div 
  position: relative;
  min-width: 0;

.left 
  max-width: 250px;
  width: auto;

.left canvas 
  display: block;
  max-width: 100%;
  height: auto;

.center 
  flex: 0 0 200px;
  overflow-y: scroll;
  background-color: blue;

.right 
  flex: 0 0 200px;
  overflow-y: scroll;
  background-color: green;

.scroll 
  position: absolute;
  width: 100%;

javascript

var c = document.getElementById("draw");
ctx = c.getContext("2d");
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 250, 300);
ctx.fillStyle = "white";
ctx.font = "bold 40pt Arial";
ctx.fillText("CANVAS", 10, 100);

tmp = "";
for (var i = 0; i < 100; i++) 
    tmp += "<p>" + i + "</p>";


document.getElementById("center").innerHTML = tmp;
document.getElementById("right").innerHTML = tmp;

【问题讨论】:

【参考方案1】:

想给不随div滚动的蓝色和绿色div添加一个固定的header

检查以下是否适合您:

var c = document.getElementById("draw");
ctx = c.getContext("2d");
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 250, 300);
ctx.fillStyle = "white";
ctx.font = "bold 40pt Arial";
ctx.fillText("CANVAS", 10, 100);

tmp = "";
for (var i = 0; i < 100; i++) 
  tmp += "<p>" + i + "</p>";


document.getElementById("center").innerHTML = tmp;
document.getElementById("right").innerHTML = tmp;
.container 
  max-width: 650px;
  margin: 0 auto;
  border: 1px solid black;
  display: flex;

.container > div 
  position: relative;
  min-width: 0;

.left 
  max-width: 250px;
  width: auto;
  flex: 1;

.left canvas 
  display: block;
  max-width: 100%;
  height: auto;

.center 
  flex: 0 0 200px;
  background-color: #0000ff;

.right 
  flex: 0 0 200px;
  background-color: green;

.scroll 
  position: absolute;
  width: 100%;
  top: 40px;
  bottom: 0;
  overflow-y: auto;

.header 
  height: 40px;
  line-height: 40px;

.center .header 
  background-color: #aaaaff;

.right .header 
  background-color: #aaff00;
<div class="container">
  <div class="left">
    <canvas id="draw"  ></canvas>
  </div>
  <div class="center">
    <div class="header">fixed header</div>
    <div id="center" class="scroll"></div>
  </div>
  <div class="right">
    <div class="header">fixed header</div>
    <div id="right" class="scroll"></div>
  </div>
</div>

【讨论】:

在 FF 和 Chrome 中很好,但在 IE 中不行,但那是我的错。我原来的小提琴和你的更新在 IE 中不起作用,但我的真实网站可以。一定是我这边出了点问题,我已经想通了,只是从来没有放过小提琴。没什么好担心的。 别担心。我编辑了我之前的评论,以表明我原来的小提琴在 IE 中也不起作用。虽然也许值得为其他人解决这个问题。将您的修复标记为解决方案。谢谢。虽然不能24小时奖励赏金。不认为这是一个非常困难的问题,但无法弄清楚,早期的否定导致其他人不看我的问题。 @Mike 问题在于.left 元素中缺少flex: 1。现在应该在 IE 11+ 上工作。

以上是关于修复了滚动列表顶部的标题。所有列高度相同的 Flex 布局的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 滚动到单元格顶部

在滚动视图中具有相同宽度和高度的三个 UIButton 上的自动布局

javascript element-ui@1.x版本,如果需要把表第一列作为汇总列,并且表格高度大于屏幕高度,向下滚动式使第一行固定在屏幕顶部

在具有不同单元格高度的列表视图中滚动

滚动到AngularJS中的div顶部?

滚动视图中的内容随着导航菜单的高度值向下移动