【问题标题】:div shown with jquery is cropped用 jquery 显示的 div 被裁剪
【发布时间】:2012-05-29 08:24:14
【问题描述】:

我正在努力与一种奇怪的行为作斗争 - 感谢任何帮助。

我有一个长而复杂的 HTML 页面,一般结构如下:

+------------------------------------------+
| Page header                              |
+-----------------------------+------------+
|                             |  Right     |
| Main content                |  Column    |
|                             |            |
+-----------------------------+------------+

在“主要内容”中,所有的动作都在发生。可能发生的一件事是在用户单击按钮时,一个初始不可见的具有absolute 位置的 div 正在显示,并且它的内容使用 AJAX 填充(即我事先不知道那里有多少内容是)。

如果此 div 的整体 height 最终小于“主要内容”的可用高度,则此方法可以正常工作。然而,如果这个“弹出”div 由于内容很多而最终很长,那么它会在“主要内容”div 的底部被截断。由于下面没有任何内容,我什至无法向下滚动查看弹出窗口的所有内容。我希望“主要内容”能够增长以适应弹出窗口的整个高度,并且页面可以一直滚动到弹出窗口的底部,但这并没有发生。

这是我的“主要内容”的 CSS:

.content {
    width: 770px;
    position: relative;
    overflow-x: visible;
    overflow-y: hidden;
}

这是弹出窗口的 CSS:

#popupedit {
    background-color: #f1f0ec;
    width: 770px;
    z-index: 100001;
    position: absolute;
    left: 0px;
    top: 0px;
    display: none;
}

在 HTML 中,popupeditcontent 的直接子代。链中的任何地方都没有高度或最大高度限制。那么为什么“内容”没有增长以适应“弹出”呢?

【问题讨论】:

  • 尝试让overflow-y:.content中可见
  • 这可能是相关的。不幸的是,由于其他原因,我无法删除“overflow-y: hidden”。但是,据我所知,这仅在我明确控制父母的高度时才有效。就我而言,高度始终是“自动”
  • 绝对定位元素不会增加其父元素的自然高度或宽度。这就是为什么您的包含 div 不调整大小的原因。这类事情有一些技巧,但我建议将弹出窗口移到外面,最好将其直接附加到 body 元素。这也将使您的解决方案更加 OLD-IE-safe。

标签: jquery css height truncated


【解决方案1】:

看起来您正在 .content div 中创建弹出窗口。

这有 overflow-y: hidden 它将隐藏任何溢出。

尝试将弹出窗口移出内容 div。

【讨论】:

  • 我不能把它移到外面。至于“overflow-y: hidden”,我的理解是这只适用于我在父节点上明确设置“height”或“max-height”的情况。否则,应该调整父母的身高以适合孩子。
  • 为什么不能移动呢?您如何在需要时使弹出窗口可见?
  • 我根本无法控制“主要内容”之外的任何内容。布局引擎的设计方式,先输出​​表头,再输出右列。然后插入主要内容。最后是一个全局页脚。引擎负责所有布局,只需在需要的地方插入我的页面(这是进入“div”内部的内容,从父级打开和关闭)。
【解决方案2】:

您可以通过删除绝对定位并使用不同的技术(即浮动)来定位弹出窗口来解决此问题。让我猜猜,position: absolute 也是必需的吗? :) 如果是这样,那么仍有希望:您可以在内容加载后使用 JavaScript 调整内容 div 的大小。

$(".content").css("min-height", $("#popupedit").height()+"px");

当然,这必须在弹出窗口完全加载后运行,并且您可能应该在弹出窗口消失后撤消调整大小:

$(".content").css("min-height", "");

【讨论】:

  • 是的,这就是我的想法。当然,它有点复杂,因为内容包含图像,而我通过 AJAX 获得的只是图像的 URL。在加载所有图像之前,我不会知道弹出窗口的实际高度。 :)
  • 然后在刚刚插入的内容上运行上述代码后,将其绑定到弹出窗口中所有图像的load事件:$("#popupedit img").load(updateFunction);。调整大小的代码快速且幂等;您可以根据需要多次运行它(尽管您可能需要添加一个检查,以便在弹出窗口关闭后它不会运行)。
  • 啊哈!那是我缺少的部分:绑定图像的load。现在可以了。
【解决方案3】:

移除溢出 -y: hidden;它应该可以工作。另外我建议给 popupedit 固定高度

编辑:好的,试试这个技巧

JS:

var hh = document.getElementById('popupedit').offsetHeight;
document.getElementById('fix').style.height = hh + "px";

CSS:

.content {
    width: 770px;
    position: relative;
    overflow-x: visible;
    overflow-y: hidden;
    height: auto
}
#popupedit {
    background-color: #f1f0ec;
    width: 770px;
    z-index: 100001;
    position: absolute;
    left: 0px;
    top: 0px;
}

#fix { width: 770px; }

HTML:

<div class = "content">
    <div id = "popupedit">
        <p>Something important</p>                
    </div>
    <div id = "fix"></div>
</div> 

【讨论】:

  • 由于各种原因,我无法删除“overflow-y: hidden”。我的理解是“溢出-y:隐藏”仅适用于在父级上设置高度或最大高度时。否则,父母应该成长以适应孩子。弹出窗口的固定高度绝对是不可能的,因为内容的高度可以在 100 到 1000 像素之间,并且弹出窗口有自己的背景,它应该只在内容所在的地方可见。
【解决方案4】:

尝试删除 .content 的 position:relative;。无论如何都不需要它(除非你需要它来做你没有说过的事情)。这是一个很大的误解。很多人使用position: relative; 表示几乎所有元素。这根本不需要。

在这种情况下,它甚至会造成麻烦,因为#popupedit 现在将自己绝对定位到其父级而不是窗口。我的建议是,删除position: relative;,给弹出窗口一个静态的width 并用jQuery 计算它的水平位置以使其居中。也去掉top: 0;left: 0;

然后你将这个 sn-p 的代码添加到你调用的代码中以弹出它,或者在一个单独的文件中(并不重要):

$("#popupedit ").css({
    left: ($(window).width() - $('.className').outerWidth())/2,
    top: ($(window).height() - $('.className').outerHeight())/2
});​

【讨论】:

  • 你似乎完全误解了我的问题。这正是我在父级上具有“位置:相对”的原因:因为我需要绝对定位的 div 绝对定位到其父级而不是窗口。而且我不想调整弹出窗口的大小 - 我需要弹出窗口尽可能大 - 并让父级调整其高度以匹配。
  • 好吧,那么您完全错过了“弹出”的意义。无论如何,请提供一个测试用例。
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 2016-07-20
  • 1970-01-01
  • 2015-10-13
  • 2015-01-23
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
相关资源
最近更新 更多