【问题标题】:expanding an inline-block jumps to above row扩展内联块跳转到上一行
【发布时间】:2015-10-06 14:30:56
【问题描述】:

我有一系列文章

<section>
<article>1</article>
<article>2</article>
<article>3</article>
....
<article>999</article>
<section>

以每行三个的网格排列

section { 
  position: relative 
}
article { 
  display: inline-block; 
  width: 33%;
} 

并且我希望它们在单击时水平扩展以完全占据其行。

所以我创建了一个expanded

.expanded {
  position:absolute;
  left:0px;
  width: 100%;
}

并在点击时应用它

$("article").click(function(){ 
  $(this).toggleClass("expanded"); 
});

我快到了,你可以在这里看到http://jsfiddle.net/aqw339r0/1/

当我点击任何一篇文章时,它们会扩大到该行的全宽;但问题是,当我单击一行的第一篇文章(第一行除外)时,它“跳转”到正上方的行。

我已尝试更改 article.expandedpositiondisplay 属性,但我无法获得所需的行为。例如:当我更改.expandedposition:absolute 时,第5 和第6 块,“跳转”到下面的行。当我删除 display:inline-block 并更改为 float:left 时类似。

您对为什么会发生这种情况以及如何纠正它有任何想法吗?

【问题讨论】:

  • 如果您删除 position:absolute 会怎样?这似乎解决了它
  • 我认为不可能创建行,真的吗?也就是说,将每 3 个元素包装在一个相对位置的框中。可以吗?
  • 为什么会发生这种情况很清楚...您正在更改文档流程
  • 绝对位置将元素从文档流中取出

标签: javascript jquery html css


【解决方案1】:

使用@Rick 的解决方案(减去 css 顶部编辑),然后切换一个附加元素以保持其他元素就位,这应该可以满足需要:Fiddle

  $("article").click(function() { 
        $(this).toggleClass("expanded"); 
        if ($(this).hasClass("expanded"))
        {
            $(this).before("<article class='blank'>&nbsp;</article>");
        }
        else
        {
            $(this).prevAll('.blank').first().remove();
        }
  });

进一步解释,当元素被点击时:

如果添加类'expanded',那么这还将添加一个空白文章元素(之前)作为占位符以保持流程一致。这很重要,因为当具有类 'expanded' 的元素变为 position: absolute 时,它​​将从内容的正常流中删除。

如果删除类 'expanded',那么这也将删除空白文章占位符元素。 prevAll 函数查看所有具有“空白”类的先前元素,然后获取 first() 并将其删除。因为它是在“之前”插入的,所以可以保证删除正确的空白文章占位符。

【讨论】:

  • 请详细说明prevAll() 方法。如果可能,请包含一个简化示例。
  • prevAll() 方法查看所有先前的元素(在本例中为“空白”类)。此解决方案使用 first() 不同,但可能会更详细地解释:stackoverflow.com/questions/2310270/…
【解决方案2】:

position:absolute 设置在&lt;article&gt; 元素上时,会将其移出正常的内容流,并导致偏移。我们可以通过在点击触发时添加一个空的&lt;article&gt; 作为占位符来纠正它,并在再次点击时将其删除。

var open = false;

jQuery("article").click(function () {
    open = !open;

    if (open) {
        $(this).addClass("expanded");
        $(this).before("<article class='holder'>&nbsp;</article>");
    } else {
        $("article").removeClass("expanded");
        $(".holder").remove();
    }
});

附言我不太擅长jQuery,欢迎提出任何建议。

jsfiddle

【讨论】:

  • 我接受这个,因为它有助于理解原因并解决根本原因,尽管我正在实施一个略有不同的解决方案。
【解决方案3】:

我想不出一个纯粹的 CSS 解决方案,但既然您使用的是 jQuery,只需硬编码扩展元素的 top

$("article").click(function() { 
  $(this).css('top', $(this).position().top);
  $(this).toggleClass("expanded"); 
});

Fiddle

一旦扩展类被移除,top 样式将被忽略。

【讨论】:

  • 这不是一个纯 css 解决方案,但它很简单,足以满足我的需求。我也喜欢它,因为它可以帮助我解决另一个讨厌的 css 问题
  • 使用此解决方案,当您单击“3”时,下面编号的文章每篇都会跳一个位置。那还可以吗?我最初不明白这个问题,但现在我开始明白了。
  • 这使用@Rick 的解决方案和添加的 jQuery 来保持其他文章的位置:jsfiddle.net/fn2zv8va
【解决方案4】:

试试这个

 <section>
    <article>1</article>
    <article>2</article>
    <article>3</article>
    </section>
    <section>
    <article>4</article>
    <article>5</article>
    <article>6</article>
    <section>
    <section>
    <article>7</article>
    <article>8</article>
    <article>9</article>
    </section>

    section {
        position:relative;
    }

    article { 
        width: 30%;
        min-width: 200px;
        min-height: 200px;
        display: inline-block;
        border: 1px solid black;
    }

    .expanded {
        width: 100%;
        background-color:#eef;
        left:0px;
        top:0;
        position:absolute;
        transition: 0.2s linear;
    }

    // if you want others to close while expanding
    $("article").click(function(){ 
       $('article').removeClass("expanded");
        $(this).toggleClass("expanded"); 
    });


// esle if you want everything to be expanded
   $("article").click(function(){ 
        $(this).toggleClass("expanded"); 
    });

【讨论】:

  • 您好 faisal,这是一项勇敢的努力,但是,您应该更好地解释您的目标并具体解决问题。此外,您可以使用 jsFiddle 等免费工具来提供示例。我不会投反对票,但其他人可能会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多