如何剪切网格单元并提供滚动?

问题描述 投票:0回答:1

有一篇关于将 1fr 修剪为 0 的非常好的帖子:为什么 minmax(0, 1fr) 对于长元素有效,而 1fr 则不然?

一般来说,我希望有一个单元格随着内容的增长而扩展,但在其父级的限制内。

目前我有一个网格,其中的单元格内容很长,即使不扩展它也比整个屏幕大。所以我要做两件事——剪辑单元格的大小,其次——提供滚动。

我使用了我提到的帖子中的

minmax(0, 1fr)
,因此网格可以自由地将单元格压缩为零,但它仍然无法有效地计算高度,因此滚动条不是“固定”高度。如果没有此信息,则不会激活滚动。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>

    body
    {
      width: 100vw;
      height: 100vh;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    .page
    {
        height: 100%;
        
        /*display: flex;
        flex-direction: column;*/
        
        display:grid;
        grid-template-rows: min-content minmax(0, 1fr);
    }
    .header
    {
    }
    .content
    {
       flex-grow: 1;
       flex-shrink: 1;
       flex-basis: 0;
    }
    
    .quiz-grid
    {
      height: 100%;
      max-height: 100%;
      display: grid;
      grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
      grid-template-rows: minmax(0, 1fr) min-content;
      grid-template-areas: 
        "left    main   right" 
        "footer footer footer";
    }
    .quiz-cell-left
    { 
      grid-area: left;
      min-height: 0;
    }
    .quiz-cell-right
    { 
      grid-area: right;
      min-height: 0;
    }
    .quiz-cell-main
    { 
      grid-area: main;
      border: 1px red solid;
      min-height: 0;
    }
    .quiz-cell-footer 
    { 
      grid-area: footer;
      justify-self: center;
      align-self: center;
    }
    
    /* my scroll view component */
    .scroll-container
    {
      position: relative;
      width: 100%;
      min-height: 0;
      background-color: azure;
    
      
      max-height: 100%;
    }
    .scroll-content
    {
      height: 100%;
      width: 100%;
      overflow-y: auto;
    }
</style>
</head>
<body>

<div class="page">
  <div class="header">Header</div>
  
  <div class="content">
<div class="quiz-grid">
  <div class="quiz-cell-main">
    
    <div class="scroll-container">        <div class="scroll-content">
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    
     </div>
   </div> 
    
  </div>
  
  <div class="quiz-cell-footer">
    footer
  </div>
</div>
  </div>
</div>

</body>
</html>

对代码的注释:内容位于单元格“main”中,其他元素(页眉、页脚)只是为了确保解决方案不会过度简化。

更新1:最初我使用“flex”进行外部布局,我切换到网格并且至少成功实现了部分剪辑,我仍然坚持使用带有滚动的真实剪辑。

更新2:从技术上来说似乎我解决了它(我现在正在研究隐藏的问题)——我基于网格上的两格滚动器以及容器滚动器“grid-template-rows:minmax(0 , auto);”,但说实话,这太运气了,我只是注意到网格传播高度信息,所以也许它会起作用。但我仍然想知道为什么“flex”不适用于外部布局,以及如何在不诉诸网格的情况下将高度信息“传递”到滚动条两格(我不反对网格,但按照这个速度,我将到处都有网格:- )).

css scroll css-grid
1个回答
0
投票

你的代码包含很多无用的声明。我们不应该试图通过添加大量高度/最小高度/最大高度等来强迫事情正常工作。

body {
  margin: 0;
}
.page {
  height: 100vh; /* full page*/
  display: grid;
  grid-template-rows: min-content minmax(0,1fr);
}
.quiz-grid {
  height: 100%; /* 100% .content height (.content needs nothing)*/
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr) min-content;
  grid-template-areas: 
   "left    main   right" 
   "footer footer footer";
}
.quiz-cell-main {
  grid-area: main;
  border: 1px red solid;
}
.scroll-container {
  background-color: azure;
  height: 100%; /* 100% height of .quiz-cell-main */
  overflow-y: auto; /* add scrollbar */
}
.quiz-cell-footer {
  grid-area: footer;
  place-self: center;
}

/*.quiz-cell-left {
  grid-area: left;
  min-height: 0;
}

.quiz-cell-right {
  grid-area: right;
  min-height: 0;
}
*/
<div class="page">
  <div class="header">Header</div>

  <div class="content">
    <div class="quiz-grid">
      <div class="quiz-cell-main">

        <div class="scroll-container">
          <div class="scroll-content">
            <h1>something</h1>
            <h1>else</h1>
            <h1>alice</h1>
            <h1>cat</h1>
            <h1>or dog</h1>
            <h1>now</h1>
            <h1>world</h1>
            <h1>something</h1>
            <h1>else</h1>
            <h1>alice</h1>
            <h1>cat</h1>
            <h1>or dog</h1>
            <h1>now</h1>
            <h1>world</h1>
            <h1>something</h1>
            <h1>else</h1>
            <h1>alice</h1>
            <h1>cat</h1>
            <h1>or dog</h1>
            <h1>now</h1>
            <h1>world</h1>
            <h1>something</h1>
            <h1>else</h1>
            <h1>alice</h1>
            <h1>cat</h1>
            <h1>or dog</h1>
            <h1>now</h1>
            <h1>world</h1>

          </div>
        </div>

      </div>

      <div class="quiz-cell-footer">
        footer
      </div>
    </div>
  </div>
</div>

© www.soinside.com 2019 - 2024. All rights reserved.