【问题标题】:jQuery tabs: panel covers tabs at 100% heightjQuery 选项卡:面板覆盖 100% 高度的选项卡
【发布时间】:2013-01-26 15:39:48
【问题描述】:

我正在尝试使用具有面板内容的 jQuery-UI 的选项卡小部件扩展到整个可用空间。

这是我目前所掌握的简化版本: http://jsfiddle.net/MhEEH/3/

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

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

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

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

干净简洁的解决方案就可以了。

JavaScript 是可以接受的,而(干净的!)纯 CSS 解决方案更可取...

-- 问候,

斯蒂芬

【问题讨论】:

    标签: jquery css jquery-ui tabs jquery-tabs


    【解决方案1】:

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

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

    来自API documentation

    heightStyle

    类型:字符串

    默认:“内容”

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

    • “auto”:所有面板都将设置为最高面板的高度。
    • “填充”:根据选项卡的父级高度展开到可用高度。
    • “content”:每个面板的高度仅与其内容一样高。

    虽然您是对的,一个简单的 CSS 解决方案会非常好,因为您使用 JavaScript 无论如何 来构建选项卡功能,最好使用您已经使用的脚本的现有功能有。


    更新

    【讨论】:

    • 似乎有效!小错误,但工作......我修改了其中一个小提琴以使用 heightStyle-Option。实际上,似乎需要添加一个虚拟 div 作为填充整个空间的父级。此外,当仅调整框架大小时它不会更新(但会对窗口大小调整做出反应)。非常感谢! -- 这是小提琴:jsfiddle.net/MhEEH/42
    • 我真的很高兴,如果你也有这样一个简单的框架调整问题的解决方案......
    • 使用benalman.com/projects/jquery-resize-plugin 观察父级的大小变化。
    • 这成功了!但是,除非用户手动调整大小,否则不会调用 resize 函数,因此在此之前这不起作用(这是不可接受的)。我已经尝试将脚本放在许多其他地方,(document.ready(),,,,etc) 但仅适用于 resize()。除了resize还有什么地方可以设置样式和刷新吗?
    【解决方案2】:

    我尝试将标签放入标签容器并使用以下样式

    #tab-container {position:relative; min-height:100%;}
    

    它似乎有效:

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

    【讨论】:

    • 对不起皮特,与其他两个答案相同的问题:面板内容(选项卡容器)继续在屏幕下方不可见。刚刚删除了 "overflow: hidden" => jsfiddle.net/MhEEH/10 - 所以你可以明白我的意思。
    • 啊我想知道是否有某种溢出隐藏属性阻止它显示。您需要做的是使用 jquery 调整它的大小 - 找到窗口的高度,然后是选项卡列表,并使选项卡容器的高度有所不同(除非选项卡更大,然后将高度设置为最大的标签)
    • 现在已经有 3 个人无法使用 CSS 解决它,JavaScript 方法似乎越来越有意义。你知道我应该使用哪个事件挂钩吗?我还想知道这是否是 jquery-ui-implementation 中的“错误”。至少应该有一些支持这种标签应用程序的构建......
    • 我从未使用过内置的 ui 选项卡 - 我一直使用 coda 滑块,因为它可以为您处理所有调整大小的问题
    • 好吧,快速浏览一下“尾声滑块”。似乎是一种选择。会试试...
    【解决方案3】:

    这就是你所追求的吗?

    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%;
    }
    

    【讨论】:

    • 不幸的是,这会导致垂直滚动并使面板内容超出屏幕高度。一开始就有这种方法,但这对我不起作用......但无论如何感谢您尝试一下。
    【解决方案4】:

    我只是想用这个:

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

    在 jsfiddle 中它工作正常。不知道它会在你的页面上 http://jsfiddle.net/MhEEH/7/

    【讨论】:

    • 看起来不错...我会在实际设置中试一试...一秒钟!
    • 嗯,对不起,和比利护城河的问题一样。面板内容继续低于屏幕高度。只要您启用滚动条和/或删除“溢出:隐藏;”,就可以看到它。对于 html/正文。看看你的方法的这个修改:jsfiddle.net/MhEEH/9——你还有其他想法吗? (到目前为止谢谢)
    • 我在 #tabs 中添加了溢出:隐藏现在看来还不错 =) jsfiddle.net/MhEEH/12 再检查一遍
    • 我添加了更多内容。而且......哦,奇怪:有些部分隐藏在屏幕底部下方。我的上帝:我什至没有滚动条向下滚动!!! --- 这不是我想要的 ;-) -- 见:jsfiddle.net/MhEEH/13
    • PS:这就是我讨厌 CSS 的原因...我总是以“尝试”某些东西而告终,而不是仅仅知道如何去做...并且知道它会起作用!跨度>
    【解决方案5】:

    OP,

    检查this Fiddle

    #tabsoverflow: hidden;。 除了孩子:#tabs div[id*=tab] 设置了overflow:auto。这确保了父级将设置边界,并且如果选项卡中的内容溢出,滚动条的外观将由选项卡本身委托。

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

    希望这会有所帮助。

    【讨论】:

    • 我稍微修改了你的小提琴:jsfiddle.net/xZxHf/3 ...我在#tab-1 中添加了更多内容。如果我降低框架的高度,它会开始滚动......但是:滚动条的末端在框架底部下方是不可见的。这才是真正的问题所在……
    • @StefanK。 - 公平竞争。检查更新 http://jsfiddle.net/xZxHf/4/ — 包含在额外的 <p> 中,并在 overflow:auto 上加倍。
    • 已检查 jsfiddle.net/xZxHf/4 ... 不幸的是,这并没有改变行为(我使用的是 Firefox 20.0);并且:这是公平竞争。您不能只引入“错误”并期望它被接受。我明白这是一个令人讨厌的问题。但需要的是一个完全有效的解决方案......对吗? --- 这是发生了什么的截图:s14.directupload.net/images/130318/dh6cgh4o.png;在右下角,您会看到滚动条的某些部分(以及某些内容)位于底部下方。对于框架的某些高度,滚动条甚至不存在,而内容被隐藏。
    • @StefanK - “公平竞争”是一个惯用的表达方式,意思是“哦,是的,完全,既然你已经指出了这一点,我同意你的看法”。我不确定您是否意识到这一点,因为您的回答是“您不能只引入错误并期望它被接受” 我引入了什么“错误”?在<p> 标签中换行?请记住,我和其他所有人一样,选择回答问题是为了提供帮助,而不是受到谴责。希望你能弄清楚这一点。祝你好运。
    • 感谢您解释“公平竞争”;-)。好吧,我认为有人通过 jQuery-UI-Framework 本身找到了解决方案……(参见“Moshe Katz”)。当然感谢您的尝试...
    【解决方案6】:

    最简单的解决方案, CSS 的两个变化,问题解决了,#tabs{height:100%;}

    #tab-1{top:45px;}

    这样就可以了 :) 更新 fiddle

    【讨论】:

      【解决方案7】:

      以下是我的 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/

      希望对你有帮助,

      干杯

      【讨论】:

        【解决方案8】:

        这个怎么样...如果内容溢出,您将看到滚动条完全可见

        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;
        
        }
        

        希望对你有帮助!!!

        【讨论】:

          【解决方案9】:

          我认为没有必要在此处使用 javascript 进行基本样式修改。我最近将单页全屏样式应用程序从使用定位和其他东西从 javascript 调整大小转换为纯 CSS。

          现在找到一个解决方案 - 试试这个。

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

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

          我认为不需要在绿色框元素上使用绝对定位,因为父元素会填满空间,您现在需要做的就是height: 100%,它应该会填满剩余的空间。

          编辑

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

          【讨论】:

            【解决方案10】:

            我在 #tab-1 id 中添加了一个顶部位置值,以将其推到选项卡本身下方。

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

            这里是相关的 CSS:

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

            希望对你有帮助!

            【讨论】:

            • 正如我在问题中所写,这个解决方案是不可行的:你不能依赖“top:50px;”因为这个高度不是一个常数!如果在使用其他主题或有超过一行选项卡的情况下可能会发生变化(如果我打开很多选项卡,您将有多行)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多