【问题标题】:How to make two columns same height dynamically如何动态使两列高度相同
【发布时间】:2021-01-22 02:10:14
【问题描述】:

我有一个包含两列的页面。我想 textarea 高度模仿左列高度。网页加载时左栏很短,但是当用户开始扩展各种属性(复选框+下拉菜单)时,它会根据隐藏的 div 增长。但是我的 textarea 在右栏中仍然很小,使其静态变大看起来并不好。 我希望它按左列高度增长。不知道如何实现。

编辑: 将height: 100%; 添加到 textarea 后,它就解决了列增长的问题。 但是我又遇到了两个问题。

  1. 右列中的文本区域在页面加载时与该列重叠。当我尝试调整大小时,它会突然正确跳转到列。奇怪的行为。 here is the pic - textarea overlaps column
  2. 左列上下文未正确对齐。我将如何对齐或证明两列的上下文,使它们最终像这样: here is the pic - final look

我的 CSS:

body {
    height: 100%;
    position: relative;
    background: #000000;
    color: #66adff;
    font-size: 105%;
    font-family: serif, Arial, Helvetica
}

.column {
    border: 5px solid #333;
  }
.container{
    display: flex; 
}

.columnleft {
    width: 45%;
    padding: 10px;
    display: table-cell;
  }
  
.columnright {
    width: 45%;
    padding: 10px; 
    display: table-cell;
}
  
textarea.out {width: 100%; height: 100%; box-sizing: border-box;}

编辑 2: 问题 1 - 我在列内有文本将区域向下推 问题 2 - 使用适当的填充修复了所有问题

感谢大家的回复。

【问题讨论】:

  • 据我所知,如果您的函数不适合您,那是因为您使用的是 document.getElementById('columnLeft'),但是您将 columnLeft 定义为一个类而不是一个身份证。您可能希望使用 document.querySelector('.columnLeft') 和 document.querySelector('.columnRight') 在页面上获取这些类的第一个实例,以更改它们的样式。或者,如果您希望这些类的所有实例作为数组使用 document.querySelectorAll('.columnLeft') 和 document.querySelectorAll('.columnRight')。从那里你可以遍历每个元素并对其进行操作。
  • 基本上使用 flex 的主要优点之一是我们根本不需要这个 js 代码在一行中具有相同的高度元素,请您分享您的 HTML 代码中的更多内容,或者创建一个可重复的例子
  • 如果你申请flex,为什么要使用float?为什么不用css-grid 不用脚本就能做到这一点?
  • 你不需要 JS。见这里:w3schools.com/howto/howto_css_equal_height.asp

标签: javascript html css


【解决方案1】:

我认为你可以不使用 js,但使用 CSS Grid 代替。

例子:

.grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr; // the width of each column
  grid-template-rows: auto; // row height will auto-adjust to contents
}
<div class="grid-container">
  <div class="column-left">
    ...some dynamic content
    gets bigger and bigger and bigger and         bigger and bigger
  </div>
  <div class="column-right">
    might be empty or small or large
  </div>
</div>

网格行高将始终调整为最大内容的高度,这将使两列的高度相同。

【讨论】:

  • 你有一个技术错误。 50% 50% 几乎总是会溢出。只要paddinggrid-gap 正在使用,它就会溢出。 50% 表示父母宽度的 50% 不会自动计入填充、边框或网格间隙。正确的值应该是1fr 1fr。此外,您不需要添加grid-template-rows,如果您有超过 1 行,这可能会导致问题。应该是grid-auto-rows。从技术上讲,您不需要添加它,因为它是默认属性和值。
  • 感谢您的来信!我改变了列大小 - 好点!我留下这些行只是因为它是一个示例,如果网格容器中只有两个子元素,它应该可以工作。但我感谢有用的信息!
【解决方案2】:

由于您使用的是 flex,因此右列应该会自动调整以匹配左列。听起来您的问题是 textarea 没有自动扩展以匹配其容器(右列)。

如果是这种情况,请尝试这个简单的修复 - 在您的 CSS 中,将 textarea 高度设置为 100% 以自动填充其父项:

textarea {
   height: 100%;
};

这是一个示例答案: Textarea to fill a parent container exactly, with padding

【讨论】:

  • 嗨,欢迎来到 SO。如果您有明确的解决方案,请使用 anwser 选项。为此包括一个工作代码 sn-p (ctrl + m) 以验证您的解决方案是否有效。为您的解决方案添加足够的解释,以便可以复制它。也不要只添加指向其他解决方案的链接。如果这些链接或内容发生变化,那么您的 anwser 将来对 SO 来说将毫无价值。
  • 很抱歉。我实际上想发表评论以澄清 OP 是否有文本区域扩展问题,而不是其他答案关注的列扩展问题,但不幸的是,我没有足够的声誉来发表评论。所以我提交了一个答案,而不是将 OP 指向 textarea 高度 100% 修复。
【解决方案3】:

您的代码不起作用的原因是因为您没有将高度设置为 textareaheight 设置为 100% 将始终使其适合其容器的最大大小 (&lt;div&gt;)我还添加了box-sizing: border-box;,以便您可以在columnright 中添加填充。

可以在这里找到关于box-sizing 的更好解释(只是不会在这里解释,因为我不能做得更好):https://css-tricks.com/box-sizing/

function f_anyEvent(){
    var leftcolumnHeight = document.getElementById('columnleft').style.height.value;
    if (document.getElementById('columnleft').style.height != document.getElementById('columnright').style.height)
    document.getElementById('columnright').style.height = leftcolumnHeight.value;
} 

document.getElementById('add').addEventListener('click', function() {
    let columnleft = document.getElementById('columnleft');
  columnleft.innerHTML += '<h1>a</h1>';
});
.row{
    display: flex; 
}

.column {
  border: 1px solid #333;
}

.columnleft {
    float: left;
    width: 45%;
    padding: 10px;
    display: table-cell;
  }
  
.columnright {
    float: left;
    width: 45%;
    padding: 10px; 
    display: table-cell;
  }
  
  textarea {
    width: 100%;
    height: 100%;
    box-sizing: border-box;
  }
<div class="row">
  <div id="columnleft" class="column columnleft">
    
  </div>
  <div id="columnright" class="column columnright">
    <textarea></textarea>
  </div>
</div>

<button id="add">
  add
</button>

每次您点击add 时,它都会在您的左栏中添加一个&lt;h1&gt;,并且您的textarea 将获得与columnleft 相同的高度。

【讨论】:

  • anwser 应该始终包含足够的解释,以便理解和重现。 try this + code 是不够的,可以认为是低质量的。添加足够的说明来说明您为解决问题所做的工作以及 OP 如何重现该解决方案。在这种情况下,我将撤销我的反对票。
  • 刚刚更新了我的答案,虽然我最后给出了解释,我的错。
  • 增加身高有所帮助,但现在我面临着不同的邪恶。
  • 你必须清楚,没有细节我们帮不了你。您可以创建一个 jsfiddle,以便我们可以看到错误和/或更新/创建一个新问题。
【解决方案4】:

这是一个类似于您的界面的基本演示,它在父容器上使用display: grid 自动保持两个内部 div 的高度相同。 (点击蓝色细节元素触发高度变化。)

这非常简单。 (感谢您激励我最终了解 grid 的工作原理。)

// The JavaScript isn't needed for the dynamic styling. (It just copies the text.)
const
  left = document.getElementById("left"),
  right = document.getElementById("right");
left.addEventListener("change", showOutput);

function showOutput(event){
  right.innerHTML = this.querySelector("#reasons").value
}
div { max-width: 400px; border: 1px solid grey; }
details{ margin: 10px 5px; color: #0000DD; text-decoration: underline; }

/* This is where the magic happens */
#container { display: grid; grid-template-columns: 1fr 1fr; }

#left{ padding: 10px; }
#right { white-space: pre-wrap; }
<div id="container">
  <div id="left">
    <label> <input type="checkbox"/> I like pie </label>
    <details>
      <summary>Type your reasons here</summary> <textarea id="reasons"></textarea>
    </details>
  </div>
  <div id="right"></div>
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多