【问题标题】:Is there a way to detect implicit vs. explicit CSS height values in jQuery?有没有办法在 jQuery 中检测隐式和显式 CSS 高度值?
【发布时间】:2014-07-31 14:20:44
【问题描述】:

在 jQuery 中,$('#foo').height()$('#foo').css('height') 都返回一个值,即使没有使用 CSS 显式设置 height 属性。有没有办法检测一个元素是否没有明确的高度,即它只是根据其内容呈现?

这是我写的一个例子来演示:http://jsfiddle.net/Enn6p/2/

编辑

为了进一步澄清我的问题,$('#foo').css('min-height')$('#foo').css('max-height') 如果未明确设置,则已经正确返回空字符串。我正在寻找一种方法来确定是否通过 CSS 设置了明确的 height 值。

用例

我有一个脚本试图使浮动元素具有相同的高度。它通过遍历元素来查看哪个元素最高,然后将该高度应用于所有元素。在某些情况下,这些元素已经明确设置了高度,但其他元素是隐式渲染的。

我现在想添加撤消此操作的功能,并使一切恢复到原来的高度。为此,我需要知道元素最初是否设置了高度,或者高度是否为“自动”。一旦我可以做到这一点,我可以将原始值存储在元素的数据集合中,然后使用它来恢复到原始高度。

【问题讨论】:

  • 好问题。我最初的想法是这并不简单,但我有兴趣看到答案
  • @Chrisbloom7 style 属性在所有浏览器中都可用,但不是您想的那样。仅当style 属性提供height 值时,才会设置.style.height。如果元素具有设置height 值的class,则不会设置它。 style 可能不是要走的路
  • 谢谢,伊恩。我现在看到它只适用于内联样式。
  • 看看这个:jsfiddle.net/strikernl/y3P3A 还有我的答案

标签: javascript jquery html css


【解决方案1】:

基本上,如果你去掉一个元素的内容并测量它的高度,它将等于 0,除非它之前设置了一个高度(作为一种样式)。所以根据这个推理:

 function hasSetHeight(elem){
    var html=elem.html();
    elem.html('');
    height = elem.height();
    elem.html(html);
    return (height > 0);
}

删除元素的所有内容,测量它的高度,如果元素有设定的高度,则返回真或假。

【讨论】:

  • 为什么会被否决?当我测试它时它似乎工作,但想知道它是否会导致内容在大页面上闪烁。 jsfiddle.net/Enn6p/4
  • 它可能被否决了,因为您只是提供了代码。你没有提供任何解释。
  • 这似乎可行,但前提是您正在测量的元素已经在 DOM 中呈现。如果您尝试对尚未添加到 DOM 的元素执行此操作,即使已设置显式高度,它也会始终报告错误。它适用于我的目的,但我想我会提到它以防其他人过来查看。
  • @Chrisbloom7 还有什么可以改进的吗?
  • 其实我又测试了一遍,还是不行。请参阅jsfiddle.net/Enn6p/11 它为外部 B 返回 true,即使它只指定了一个 min-height,它为内部 B 返回 false,即使它指定了一个 height
【解决方案2】:

在一些旧版本的 jQuery 中是可能的:

http://jsfiddle.net/strikernl/y3P3A/

但现在你应该只使用如下函数:

function sizeDefined(obj){
   var tmp = obj.clone().html('').appendTo($('body'));
    var w = (tmp.width()==0  ? "no":"yes");
    var h = (tmp.height()==0  ? "no":"yes");
    tmp.remove();
   return  [w,h];
}

http://jsfiddle.net/Enn6p/12/

【讨论】:

  • 如果有最小高度但没有高度,则返回假阴性。 jsfiddle.net/Enn6p/5
  • @Chrisbloom7 现在怎么样?
  • 似乎仍然不起作用。 jsfiddle.net/Enn6p/9 我认为是因为克隆的元素永远不会被 DOM 渲染,所以永远不会有任何高度。
  • return [tmp.width()==0 && tmp.css('min-width')=='', tmp.height()==0 && tmp.css('min-height')==''] 就可以了,不需要三元赋值。
  • 谢谢,但它仍然无法正常工作。它为外部 B 返回 true,即使它只指定了一个 min-height,它为内部 B 返回 false,即使它指定了一个 height
猜你喜欢
  • 2011-12-17
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2012-10-23
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多