代码之家  ›  专栏  ›  技术社区  ›  Gabriele Petrioli

CSS能处理类似沙漏的情况吗?

  •  5
  • Gabriele Petrioli  · 技术社区  · 15 年前

    我很难想出解决以下问题的办法。
    让我先说明一下:

    情境
    我有26个项目(在本例中,通常不知道数字….),但一次只能看到12个。我还有一些导航元素(绿色框)

    紫色和绿色框的宽度是固定的,但紫色的高度可以根据内容而变化。

    一切都是正常的,我可以用CSS来完成。

    我正在为我的项目使用无序列表(浮动项目),并且我已经将前两个元素指定为导航元素。第一个是向左浮动,第二个是向右浮动。 一切正常,其余项目的流程介于两个绿色项目之间。

    问题 但是现在我需要绿色项目在第二行(或者最后一行,如果这个概念有帮助的话,因为只有两行)

    我希望能够隐藏前x个元素,显示下x个元素,然后它们就可以自己定位了。

    为了重新表述这个问题,我可以这样定位一些元素(绿色元素)来控制它们的位置,但仍然允许它们干扰来自新位置的流吗?

    我希望这是清楚的。如果不询问,我将提供尽可能多的信息。

    我尝试过的不起作用的东西

    • 移动具有负下边距或正上边距的绿色项。它们将离开自己的位置,但其他元素不会填充它们的位置。
    • 使用绝对位置,但随后元素将完全从流中移除,并且它们不会影响其他元素,因此它们与其他元素重叠。

    [ 它们灰显的项是隐藏的,我只显示它们,这样您就知道它们存在。. >]

    一些代码让您开始

    <style type=“text/css”>
    ul,li填充:0;页边距:0;列表样式类型:无;
    UL{
    宽度:155Px;
    职位:相对;
    高度:125px;
    边框:1倍纯红;
    }
    李{
    浮动:左;
    背景色:紫色;
    左边距:5px;
    利润上限:5PX;
    宽度:25px;
    文本对齐:居中;
    线高:25px;
    颜色:白色;
    }
    .上一个{
    颜色:黑色;
    背景色:绿色;
    }
    下一个{
    颜色:黑色;
    浮动:正确;
    右边距:5px;
    背景色:绿色;
    }
    &风格/风格;
    < /代码> 
    
    

    <body>
    <ul>
    <li class=“prev”>&lt;</li>
    <li class=“next”>&gt;</li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
    <li>11</li>
    <li>12</li>
    <li>13</li>
    <li>14</li>
    <li>15</li>
    <li>16</li>
    <li>17</li>
    &L/UL & GT;
    和/身体;
    < /代码> <Navigation Interface - Hourglass like

    情况
    我有26个项目(在本例中,通常不知道数字….),但一次只能看到12个。我还有一些导航元素(绿色框)

    紫色和绿色框的宽度是固定的,但紫色的高度可以根据内容而变化。

    一切都很正常,我可以用CSS来完成。

    我正在为我的项目使用无序列表(浮动项目),我已经指定了前两个<li>元素作为导航元素。第一个是向左浮动,第二个是向右浮动。 这一切都是可行的,其余项目的流程介于两个绿色项目之间。

    问题
    但是现在我需要绿色项目在第二行(或者最后一行,如果这个概念有帮助的话,因为只有两行)

    我希望能够隐藏前x个元素,显示下x个元素,然后它们就可以自己定位了。

    为了重新表述这个问题,我可以这样定位一些元素(绿色元素)来控制它们的位置,但仍然允许它们干扰来自新位置的流吗?

    我希望这是清楚的。如果不询问,我将提供尽可能多的信息。

    我试过的东西没用

    • 移动具有负下边距或正上边距的绿色项。它们将离开自己的位置,但其他元素不会填充它们的位置。
    • 使用绝对位置,但随后元素将完全从流中移除,并且它们不会影响其他元素,因此它们与其他元素重叠。

    [它们灰显的项目是隐藏的,我只是显示它们,以便您知道它们存在。]

    一些让你开始的代码

    <style type="text/css">
        ul,li{padding:0;margin:0; list-style-type:none;}
        ul{
            width:155px;
            position:relative;
            height:125px;
            border:1px solid red;
        }
        li{
            float:left;
            background-color:purple;
            margin-left:5px;
            margin-top:5px;
            width:25px;
            text-align:center;
            line-height:25px;
            color:white;
        }
        .prev{
            color:black;
            background-color:green;
        }
        .next{
            color:black;
            float:right; 
            margin-right:5px;
            background-color:green;
        }
    </style>
    

    <body>
        <ul>
            <li class="prev">&lt;</li>
            <li class="next">&gt;</li>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
            <li>6</li>
            <li>7</li>
            <li>8</li>
            <li>9</li>
            <li>10</li>
            <li>11</li>
            <li>12</li>
            <li>13</li>
            <li>14</li>
            <li>15</li>
            <li>16</li>
            <li>17</li>
        </ul>
    </body>
    
    4 回复  |  直到 6 年前
        1
  •  5
  •   Gabriele Petrioli    14 年前

    很明显,这不能只用css/html来解决。

    所以,为了解决这个问题,我使用了一些CSS 内联块 crossbrowser )还有一些jquery可以移动导航按钮,使它们始终保持在我想要的位置。

    这里的解决方案供参考。

    CSS

    <style type="text/css">
        ul,li{padding:0;margin:0; list-style-type:none;}
        #performances{
            width:155px;
            border:1px solid red;
            line-height:0;
            font-size:0;
        }
        #performances li{
            font-size:12px;
            background-color:purple;
            margin-left:5px;
            margin-bottom:5px;
            margin-top:5px;
            width:25px;
            text-align:center;
            line-height:25px;
            color:white;
            display:none;
            vertical-align:top;
        }
        #performances .prev{
            color:black;
            background-color:green;
            display: -moz-inline-stack;
            display:inline-block;
        }
        #performances .next{
            color:black;
            background-color:green;
            display: -moz-inline-stack;
            display:inline-block;
        }
        #performances .shown{
            display: -moz-inline-stack;
            display:inline-block;
        }
        #performances .placeholder{visibility:hidden;}
    </style>
    <!--[if lte IE 7]><style>
        #performances .prev,#performances .next,#performances .shown{zoom:1;*display:inline;}
    </style><![endif]-->
    

    javascript(jquery)

    <script type="text/javascript">
        function resetNextPrev( ){
            $next.insertAfter('#performances li.shown:eq('+ ($perpage-1) +')');
            $prev.insertAfter('#performances li.shown:eq('+ ($perline-1) +')');
        }
        $(document).ready(function(){
            $perpage = 8;
            $perline = ($perpage+2) / 2;
            $page = 1;
            $itemcount = $('#performances li.performance').length;
            $pages = Math.ceil ( $itemcount / $perpage);
            $next = $('#performances li.next');
            $prev = $('#performances li.prev');
    
            $('#performances li.performance').slice(0,$perpage).addClass('shown');
    
            if (($pages * $perpage) > $itemcount )
                    for (var i =0;i< ($pages * $perpage)-$itemcount;i++) 
                            $('<li class="performance placeholder">test</li>').appendTo('#performances');
            resetNextPrev();
    
            $('li.next').click(function(){
                if ($page < $pages)
                    $('#performances li.performance').filter('.shown').removeClass('shown').end().slice($perpage * (++$page-1),$perpage * $page).addClass('shown');
                resetNextPrev( $perline );
    
            });
            $('li.prev').click(function(){
                if ($page > 1)
                    $('#performances li.performance').filter('.shown').removeClass('shown').end().slice($perpage * (--$page-1),$perpage * $page).addClass('shown');
                resetNextPrev( $perline );
    
            });
        });
    </script>
    

    …以及 HTML

        <ul id="performances">
            <li class="prev">&lt;</li>
            <li class="next">&gt;</li>
            <li class="performance">1</li>
            <li class="performance">2</li>
            <li class="performance">3</li>
            <li class="performance">4 dfs s sf</li>
            <li class="performance">5</li>
            <li class="performance">6</li>
            <li class="performance">7</li>
            <li class="performance">8</li>
            <li class="performance">9</li>
            <li class="performance">10</li>
            <li class="performance">11</li>
            <li class="performance">12</li>
            <li class="performance">13</li>
            <li class="performance">14</li>
            <li class="performance">15</li>
            <li class="performance">16</li>
            <li class="performance">17</li>
            <li class="performance">18</li>
            <li class="performance">19</li>
        </ul>
    

    里面有一些硬编码的值,但我会留给任何可能从中获得新东西的人…

    感谢大家的指导:)

    工作实例 ( 无论是谁想看到它的行动 ): http://www.jsfiddle.net/gaby/Ba3UT/

        2
  •  4
  •   Christian Oudard    15 年前

    在这种复杂的情况下使用JavaScript可能是值得的。像jquery这样的库可以让它非常轻松。在JS中显式地定义这些包装规则将比使用许多CSS规则隐式地定义这些包装规则更清晰、更容易维护。

        3
  •  2
  •   Chetan S    15 年前

    使 li 除了导航系统 display: inline-block 也许可以移动导航 到名单的最后?

        4
  •  1
  •   Ben Hoffman    15 年前

    没有看到你的代码,我无法确定。但是,您是否尝试将绿色元素放入标签并将其标记为清晰:两者都是;?不过,这可能会将它们移到第三行。这是你应该结账的东西。