jQuery选项卡:面板以100%高度覆盖选项卡

12

我正在尝试使用jQuery-UI的选项卡小部件,其中包含面板内容以扩展到整个可用空间。

以下是迄今为止我所拥有的简化版本:http://jsfiddle.net/MhEEH/3/

当我使用以下CSS时,您将看到#tab-1的绿色面板内容仅覆盖整个页面,而不仅仅是面板空间:

 #tab-1 {
    background: green;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

我可以使用“top: 27px;”来解决这个问题,但是这会与两件事发生冲突:

  1. 如果我更改选项卡的“主题”,高度(27px)可能会改变
  2. 如果我有很多选项卡,在第一行下面会有第二行。因此,我的面板内容将覆盖第二行…

一个简洁而短小的解决方案就可以了。

可以使用JavaScript,但最好使用(清爽的!)CSS-only的解决方案...

--敬礼,

Stefan

10个回答

17

使用jQuery UI内置的功能,而不是使用自己的CSS。

var tabs = $("#tabs").tabs({heightStyle: "fill"});

来自API文档

heightStyle

类型:字符串

默认值:"content"

控制选项卡小部件和每个面板的高度。可能的值:

  • "auto":所有面板将设置为最高面板的高度。
  • "fill":根据选项卡父容器的高度扩展到可用高度。
  • "content":每个面板的高度仅与其内容一样高。

虽然您是正确的,纯CSS解决方案会非常好,但由于您已经使用JavaScript构建选项卡功能,因此最好使用您已经拥有的脚本的现有功能。


更新:


看起来可以工作了!有一些小错误,但是它正在运行...我修改了其中一个小例子,使用了heightStyle选项。实际上,似乎需要添加一个填充整个空间的虚拟div作为父元素。当仅调整框架大小时,它不会更新(但会对窗口调整大小做出反应)。非常感谢!--这是小例子:http://jsfiddle.net/MhEEH/42/ - SDwarfs
如果您也有一个简单的解决方案来解决框架调整大小问题,我会非常高兴。 - SDwarfs
使用http://benalman.com/projects/jquery-resize-plugin/ 来监测父元素的尺寸变化。 - Moshe Katz
这个方法可行!但是,除非用户手动调整大小,否则不会调用resize函数,因此在那之前无法使用(这是不可接受的)。我已经尝试将脚本放置在许多其他地方(document.ready()等),但只有在resize()中才能正常工作。除了resize之外,是否有其他地方可以设置样式并刷新? - diox8tony

3
我尝试将选项卡放入选项卡容器,并使用以下样式:
#tab-container {position:relative; min-height:100%;}

看起来它是可行的:

http://jsfiddle.net/MhEEH/8/


抱歉Pete,与其他两个答案一样的问题:面板内容(选项卡容器)在屏幕下方仍然不可见。只需删除“overflow:hidden”=>http:/ / jsfiddle.net/MhEEH/10/ - 这样您就可以看到我所说的了。 - SDwarfs
啊,我在想是否有某种溢出隐藏属性阻止它显示。你需要使用jQuery调整大小-找到窗口的高度,然后是选项卡列表,并使选项卡容器的高度为差值(除非选项卡更大,然后使高度为最大选项卡的大小)。 - Pete
现在已经有3个人使用CSS未能解决它,因此采用JavaScript方法似乎越来越有意义。您知道我应该使用哪个事件挂钩吗?我也想知道这是否是jquery-ui实现中的“错误”。对于那种选项卡应用程序,至少应该有一些内置支持... - SDwarfs
1
我从未使用过内置的UI选项卡 - 我总是选择Coda滑块,因为它可以为您处理所有的调整大小问题。 - Pete
好的,我快速查看了“coda滑块”。看起来是一个选项。会尝试一下... - SDwarfs

2

你需要的是这个吗?

http://jsfiddle.net/MhEEH/5/

html, body {
    height: 100%;   
}
#tabs {
    position: absolute;
    top: 0;
    bottom:0;
    left: 0;
    right: 0;
}
#tab-1 {
    background: green;
    height: 100%;
}

1
不幸的是,这会导致垂直滚动,并使面板内容超出屏幕高度。一开始就采用了这种方法,但对我来说行不通...但无论如何,还是谢谢你尝试了一下。 - SDwarfs

2
我刚刚尝试使用了这个代码:
#tab-1 {
    background: green;
    position: relative;
    height:100%;
}

在jsfiddle中它能正常工作。不确定在您的页面上会有什么影响。 http://jsfiddle.net/MhEEH/7/


看起来不错...我会在实际设置中尝试一下...等一下! - SDwarfs
我在 #tabs 中添加了 overflow: hidden,目前看起来还不错 =) http://jsfiddle.net/MhEEH/12/ 再次检查一下 - AnilkaBobo
我添加了更多的内容。而且...哦,惊奇:有些部分隐藏在屏幕底部。我的天啊:我甚至没有滚动条可以向下滚动!!! ---这不是我想要的;-)--请参见:http://jsfiddle.net/MhEEH/13/ - SDwarfs
1
这就是为什么我讨厌 CSS... 我总是试图去做一些东西,而不是知道如何去做它... 并且知道它会起作用! - SDwarfs
使用 CSS 时,你总是需要猜测 =) - AnilkaBobo
显示剩余3条评论

2
以下是我 CSS 解决方案的链接,希望对您有用:

http://jsfiddle.net/MhEEH/17/

html, body {
    margin: 0;
    padding: 0;
    overflow: hidden;
}
#tab-list {
    position: absolute;
    z-index: 10;
    top: 0;
    left: 0;
    width: 100%;
}
#tabs {
    position: absolute;
    top: 0;
    bottom:0;
    left: 0;
    right: 0;
}
#tab-1, #tab-2 {
    background: green;
    position: absolute;
    top: 48px;
    bottom: 0;
    left: 0;
    right: 0;
    padding-top: 10px;
}

有人提到了 Coda 滑块,这也是一个不错的解决方案。作为另一种选择,我可能会建议使用来自 Codrops 的弹性内容滑块。

http://tympanus.net/codrops/2013/02/26/elastic-content-slider/

希望能对你有所帮助,

祝好!


2

OP,

请查看此Fiddle

父级元素#tabs设置了overflow: hidden;。除此之外,子元素:#tabs div[id*=tab]也设置了overflow:auto。这样可以确保父级元素设置边界,在选项卡中有溢出内容的情况下,滚动条的外观将由选项卡本身代理。

另外,对于那些不熟悉#tabs div[id*=tab]语法的人,通配符将匹配任何#tabs的子div,其id包含“tab”。这可以用多种方式实现,但我选择这个路线进行快速原型制作。

希望这能帮到你。


我稍微修改了你的JSFiddle:http://jsfiddle.net/xZxHf/3/ ... 我在#tab-1中添加了一些内容。如果我减小框架的高度,它就开始滚动... 但是:滚动条的末端在框架底部以下是不可见的。这实际上就是问题所在... - SDwarfs
@StefanK. - 公平竞争。检查更新http://jsfiddle.net/xZxHf/4/ — 在额外的<p>标签中包裹,并在overflow:auto上进行了双重处理。 - couzzi
已检查 http://jsfiddle.net/xZxHf/4/ ... 不幸的是,这并没有改变行为(我使用的是Firefox 20.0); 另外:公平竞争。你不能只是引入“错误”,然后期望它被接受。我理解这是一个棘手的问题。但需要的是一个完全可行的解决方案...对吧?---这是一个屏幕截图,显示发生了什么:http://s14.directupload.net/images/130318/dh6cgh4o.png; 在右下角,您可以看到滚动条的某些部分(以及一些内容)在底部以下。对于某些框架高度,甚至不存在滚动条,同时隐藏了内容。 - SDwarfs
@StefanK - “公平竞争”是一种习语表达,意思是“哦,是的,完全同意你指出的问题”。我不确定你是否意识到了这一点,因为你的回答是“你不能只是引入错误并期望它被接受”。我引入了什么“错误”?是在<p>标签中包装文本吗?请记住,我和其他人一样,都希望通过回答问题来提供帮助,而不是受到责备。希望你能解决这个问题。祝你好运。 - couzzi
谢谢您解释“公平竞争”;-)。嗯,我认为有人通过jQuery-UI框架本身找到了解决方案...(见“Moshe Katz”)。当然,还是要感谢您的尝试... - SDwarfs

2

最简单的解决方案,只需要在CSS中进行两个更改即可解决问题:#tabs{height:100%;}

并且 #tab-1{top:45px;}

这样就可以了 :) 更新的演示


1
这样做可以让滚动条完全可见,如果内容溢出的话。

http://jsfiddle.net/uHk5f/

<div id="tab-1" class="customPanel">This content shall: fill up the entire space (left to right) until  the bottom of the page. But it shall -NOT- cover the tabs!</div>

并为该类提供样式,使用以下代码

    html, body {
    margin: 0;
    padding: 0;
    overflow: hidden;
}
#tabs {
    position: absolute;
    top: 0;
    bottom:0;
    left: 0;
    right: 0;
     overflow:auto;
}

 #tabs .customPanel {
    background: green;

}

希望这有所帮助!!!

0

我认为在基本样式修改中没有必要使用 JavaScript。最近,我将一个全屏单页面应用从使用 JavaScript 进行所有大小调整转换为使用纯 CSS,包括定位等。

现在进入解决方案- 试试这个。

http://jsfiddle.net/MhEEH/16/

#tab-1 {
    background: green;
    height: 100%;
}

我认为在绿色框元素上使用绝对定位是没有必要的,因为父元素填充了空间,你现在只需要添加 height: 100% 就可以填满剩余的空间。

编辑

这个版本中似乎存在内容无法滚动的问题。我正在努力寻找解决方法。我觉得 jQuery UI 添加了一堆样式和东西到 #tab-1 div 中,可能导致了你的问题。尝试重置 #tab-1 的样式,看看会留下什么。


0

我在#tab-1 id中添加了一个顶部位置值,以使其位于选项卡下方。

请参见:http://jsfiddle.net/MhEEH/40/

以下是相关的CSS:

#tab-1 {
    background: green;
    position: absolute;
    top: 50px;
    bottom: 0;
    left: 0;
    right: 0;
}

希望能对你有所帮助!


1
正如我在问题中所写的,这个解决方案是不可行的:你不能依赖于“top: 50px;”因为这个高度不是一个常数!如果使用另一个主题或者有多行选项卡(如果我打开很多选项卡,你会有多行),它可能会改变。 - SDwarfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接