表格单元格 div (IE) 中的 Textarea CSS height: 100%

Posted

技术标签:

【中文标题】表格单元格 div (IE) 中的 Textarea CSS height: 100%【英文标题】:Textarea CSS height: 100% in table-cell div (IE)表格单元格 div (IE) 中的 Textarea CSS height: 100% 【发布时间】:2014-06-02 01:52:30 【问题描述】:

注意:这只是 IE 中的问题。

如何强制 textarea 垂直填充表格单元格 div?我已将height: 100% 应用于所有父元素,但 textarea 仍保持其默认高度。

截图:

我的问题示例:JSFiddle

示例代码:

html

<div class="table">
    <div class="row">
        <div class="col col-sm">
            <div class="thumbnail">Thumbnail</div>
        </div>
        <div class="col col-lg">
            <textarea>Text area</textarea>
        </div>
    </div>
</div>

CSS

* 
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;


.table 
    display: table;
    width: 100%;
    height: 100%;

.row 
    display: table-row;
    height: 100%;

.col 
    display: table-cell;
    border: 1px dashed #FF0000;
    padding: 5px;
    vertical-align: top;
    height: 100%;

.col-sm 
    width: 30%;

.col-lg 
    width: 70%;

.thumbnail 
    height: 150px;
    width: 200px;
    border: 1px solid #CCC;


textarea 
    width: 100%;
    height: 100%;

【问题讨论】:

【参考方案1】:

根据this article,您会发现使用表格单元结构是不可能实现的。这是一个演示当你删除所有高度 CSS 时会发生什么的小提琴。剧透警告:没有任何反应,因为您的身高标签都没有值。

http://jsfiddle.net/py4gs/14/

高度/宽度 CSS 百分比基于具有已定义高度或宽度的最近父级,不包括 display: table* 元素。在您上面的情况下,不存在这样的元素,因此高度标签都没有效果。

我已将您的代码封装在一个具有定义宽度的主体标签中,即使它仍然相对定位。这是通过使用绝对定位来实现的:

body 
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;

小提琴:http://jsfiddle.net/py4gs/12/

如您所见,textarea 现在填满了容器。这是因为您的表格有一个高度,而所有其他元素根据表格高度计算它们的高度。

很遗憾,此解决方案对您来说可能不是最理想的,因为它不适用于多行。没有纯 CSS 解决方案可以将 CSS 计算高度传播为 IE 中兄弟姐妹的 CSS 实际高度。您将需要在父级上定义一个高度属性,然后您可以将其向下传播给子级。

虽然有一些选择。如果绝对需要 textarea 与缩略图元素的大小相同,并且缩略图高度确实是可变的,那么您可以挂钩到页面上的渲染事件(例如$(document).ready())以获取计算的高度并设置这是实际高度:

$(document).ready(function() 
    // avoid layout thrashing! read then write!
    var heights = $('row').map(function(row)  return $(row).height(); );
    $('row').each(function(i, el)  
        $(el).height(heights[i]);
    );
);

但是,我是非 jquery 解决方案的粉丝。因此,我认为最好的解决方案可能是重新考虑您的布局。使用您对缩略图元素的了解提前设置行高或缩放缩略图元素。例如,如果您将 YouTube 视频嵌入为缩略图,您可以将 iframe 的最大高度缩放为 100%,然后手动将行高设置为 200 像素。相反,如果您要嵌入图像,则可以使用 CSS 来缩放图像的最大高度和最大宽度,这将尊重纵横比(但计算量相对较大),或者您可以预处理图像并将它们缩放到想要的高度。

【讨论】:

感谢您的深入分析。我也希望缩略图可以改变高度,但由于我只有大约 4 种可能的布局方案,所以最好定义行高。 使用 CSS @media 查询,我根据屏幕宽度硬编码了 3 个不同的行高。结果看起来与我的预期设计相同。 有什么理由不使用引导程序或其他预建网格系统? 我正在使用引导程序。 在 IE 上,我设置了一个 td 来显示:块。 (我无法控制 HTML。)它似乎可以工作,尽管可能有我可以忍受的副作用。我的世界会崩溃吗?【参考方案2】:

不幸的是,IE 似乎不支持 CSS resize 属性,因此无法垂直调整 textarea 的大小。可能必须使用垫片,就像这里的答案:

https://***.com/a/9763121/2612012

编辑这可能会也可能不会,但你可以试试这个:

$(document).ready(function() 
    $('textarea').parent().resize(function() 
        var $t = $(this);
        $t.find('textarea').height($t.height());
    ).resize();
);

【讨论】:

不起作用,因为父级缺少高度是根本问题。【参考方案3】:

jsfiddle

.col 
    display: table-cell;
    border: 1px dashed #FF0000;
    padding: 5px;
    vertical-align: top;
    height:10px;

或者您可以为父容器 (.table) 提供固定高度,如果设置为 100%,它将自动为其子容器提供完整高度

jsfiddle

.table display: table; width: 100%; height: 150px;

jsfiddle

      <div class="col col-lg">
      <div contenteditable='true' class='contenteditable'>Text area</div>
      </div>

.contenteditable 
    width: 100%;
    height: 100%;
    

.contenteditable pmargin-top:0px; margin-bottom:0px;

【讨论】:

第一个对我不起作用...它显示为 10px 高(如预期的那样)。我避免了第二种方式,因为我的设计是响应式的,而且缩略图的大小未知。 @JustinPowell,用 contenteditable div 代替 textarea 怎么样? 同样的问题,它不会垂直填充高度。 是否必须为 contenteditable 元素设置边框属性? 这不是必须的,但这会是一个糟糕的用户体验。 (没有边框,很难判断该字段是否可编辑。)【参考方案4】:

由于 textarea 的大小是页面的百分比(响应地变化),我已经结合了 jQuery 和 HTML rows 属性来创建一个临时 hack。该比率是根据我对页面大小和百分比的了解计算得出的。

$(window).resize(function()
   var padding = 82;
   var ratio = 0.009;
   var rows = Math.floor(($('.main-container').width()-padding)*ratio);
   $('.text-area').attr('rows',rows);
).resize();

【讨论】:

【参考方案5】:

对于那些可能不想使用出色但尚未完全支持的 css 表属性的人,您也可以这样做。应该是浏览器友好的,但我只在 FireFox、IE 和 SlimJet 中进行了测试。多行工作正​​常。我将文本区域设置为 90% 以进行演示。

(不确定这里的目标是什么 - 可能左侧有多个图像和一个大文本区域 - 但这也应该适用。)

jsfiddle:https://jsfiddle.net/RationalRabbit/wpsqx8kh/7/

HTML:

<body>
   <div class="table">
      <div class="row">
         <div class="col col-sm">
             <div class="thumbnail">Thumbnail</div>
         </div>
         <div class="col col-lg">
             <textarea>Text area</textarea>
         </div>
      </div>
      <div class="row">
         <div class="col col-sm">
             <div class="thumbnail">Thumbnail 2</div>
         </div>
         <div class="col col-lg">
             <textarea>Text area 2</textarea>
         </div>
      </div>
   </div>
</body>

CSS:

  * 
     -webkit-box-sizing:border-box;
     -moz-box-sizing:border-box;
     box-sizing:border-box;
  
  .table 
     width:500px;
     height:100%px;
     border:1px dashed blue;
  
  .row 
     height:200px;
  
  .col 
     float:left;
     border:1px dashed #FF0000;
     padding:5px;
     vertical-align:top;
     height:100%;
  
  .col-sm 
     width:30%;
  
  .col-lg 
     width:70%;
     height:90%;
  
  .thumbnail 
     height:150px;
     width:100%;
     border:1px solid green;
  
  textarea 
     height:100%;
     width:100%;
  

【讨论】:

【参考方案6】:

对我来说最简单的解决方案是这样做:

td
   position:relative;

textarea
   position:absolute;
   top:0;
   bottom:0;
   left:0;
   right:0;

【讨论】:

以上是关于表格单元格 div (IE) 中的 Textarea CSS height: 100%的主要内容,如果未能解决你的问题,请参考以下文章

div表格单元格垂直对齐不起作用

表格单元格内的 CSS 缩放和 div 对齐

填充表格单元格的高度

表格单元格中的垂直对齐以及浮动 div

IE8拉伸表格单元格高度

垂直对齐表格单元格中的文本[关闭]