【问题标题】:Add a div below inline-block wrapped row - Part 2在行内块包装行下方添加一个 div - 第 2 部分
【发布时间】:2018-05-10 03:53:26
【问题描述】:

@musicnothing 在较旧的thread 中建议的解决方案在内联 div 行下方显示一个内容 div,当单击 div.wrapblock 本身时,这很有效。

http://jsfiddle.net/SYJaj/7/

function placeAfter($block) {
    $block.after($('#content'));
}

$('.wrapblock').click(function() {
    $('#content').css('display','inline-block');
    var top = $(this).offset().top;
    var $blocks = $(this).nextAll('.wrapblock');
    if ($blocks.length == 0) {
        placeAfter($(this));
        return false;
    }
    $blocks.each(function(i, j) {
        if($(this).offset().top != top) {
            placeAfter($(this).prev('.wrapblock'));
            return false;
        } else if ((i + 1) == $blocks.length) {
            placeAfter($(this));
            return false;
        }
    });
});

我遇到的问题。 我需要触发相同的效果,但通过将 click 事件添加到 wrapblock 本身的链接。

我的代码几乎相同。

我改变的是点击事件句柄,从 $('.wrapblock').click(function()$('.more').on('click', function() 我还需要为内容 div 添加 .closest(".wrapblock") 以将其自身定位在 wrapblock 之外。

$('.more').on('click', function() {
...
if ($blocks.length == 0) {
        placeAfter($(this).closest(".wrapblock"));
        return false;
    }

一切都可以看到和测试http://jsfiddle.net/7Lt1hnaL/

如果有人能阐明我如何使用偏移方法计算它需要遵循的块,那就太好了,在此先感谢。

正如您在最新的小提琴示例中所见,内容 div 未显示在 div 行下方。

我也很抱歉,我想在讨论帖上发帖,但我的发帖声望很小,这不让我发帖,谢谢。

【问题讨论】:

  • 如果你想让它在所有 wrapblocks 之后,你为什么要把它移动到被点击的那个之后呢?还是我误解了您要做什么?
  • 这就是问题所在。我需要计算并显示在该行中的最后一个 div 之后,而不是直接在单击的那个之后出现。因此,例如单击 1 时,它应该在 3 之后显示。如果我单击 5,它应该在 6 之后显示,依此类推,基于每行 3 个 div。因为它在顶部的第一个小提琴中起作用。

标签: javascript jquery html css


【解决方案1】:

var $chosen = null;
var $allBlocks = [];
$(function(){
	$allBlocks = $('.wrapblock');
})

$(window).on('resize', function() {
    if ($chosen != null) {
        $('#content').css('display','none');
        $('body').append($('#content'));
        $chosen.trigger('click');   
    }
});

$('.more').on('click', function() {
    $chosen = $(this);
    var position = $chosen.parent('.wrapblock').position();
    $('#content').css('display','inline-block');
    $allBlocks.filter(function(idx, ele){
    	return $(ele).position().top == position.top;
    })
    .last()
    .after($('#content'));
});
.wrapblock
{
    background: #963a3a;
    display: inline-block;
    width: 90px;
    height: 90px;
    color: white;
    font-size: 14px;
    text-align: left;
    padding: 10px;
    margin: 10px;
    vertical-align:top;
    position:relative;
}

#content
{
    display:none;
    vertical-align:top;
    width:100%;
    background: #5582c1;
    font-size: 12px;
    color: white;
    padding: 10px;
}
.more {
    position:absolute;
    bottom:15px;
    right:15px;
    cursor:pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<div class="wrapblock">1
<span class="more" data-ref="1">more</span>
</div>
<div class="wrapblock">2
<span class="more" data-ref="2">more</span>
</div>
<div class="wrapblock">3
<span class="more" data-ref="3">more</span>
</div>
<div class="wrapblock">4
<span class="more" data-ref="4">more</span>
</div>
<div class="wrapblock">5
<span class="more" data-ref="5">more</span>
</div>
<div class="wrapblock">6
<span class="more" data-ref="6">more</span>
</div>
<div class="wrapblock">7
<span class="more" data-ref="7">more</span>
</div>
<div class="wrapblock">8
<span class="more" data-ref="8">more</span>
</div>
<div class="wrapblock">9
<span class="more" data-ref="9">more</span>
</div>
<div id="content">Some Content</div>

似乎做你想做的事。基本上,它只是将所有块的集合过滤到您单击的块的行,假设它们都具有相同的垂直偏移(顶部),然后采用最后一个,因为 jQuery 会将它们保留在文档中顺序,所以这将是布局行中的最后一个。

哦,我更新了小提琴http://jsfiddle.net/7Lt1hnaL/1/

【讨论】:

  • 不要相信 :) 过去 2 天一直在研究这个问题,非常感谢!太棒了。完全按照它应该的方式工作。我相信您已经注意到,这也以响应方式工作。感谢您提供详细信息,以便每个人都能了解其工作原理。
  • @computerbarry 没问题,尽管您可以考虑通过检查滚动宽度是否没有改变来限制您的 onresize 调用。如果您想真正地使用它,您可以预先计算会导致回流的宽度并检测到它。
  • 一切都很顺利,直到今天早上我尝试将它添加到 CMS 中。我不断收到错误 Cannot read property 'top' of undefined 指向这段代码 return $(ele).position().top == position.top; 任何想法我可能做错了什么?
  • @computerbarry 选择器之一返回为空,因此当您调用 position() 时,它返回未定义。我的猜测是 $chosen.parent('.wrapblock') 因为 IIRC .parent() 在旧版本的 jQuery 中没有使用选择器过滤器参数。在过滤器回调中设置断点或在返回行上方添加console.log($(ele).position(), position); 以查看是什么。
  • 谢谢@dtanders,分享知识:) 好的,我已经按照建议添加了console.log,它返回Object { top: 0, left: 0 } undefined 我之前在这个CMS 版本中遇到过问题,很多代码冲突.你从上面有什么建议? jQuery 问题,还有什么?
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多