根据父级和/或类包装具有新元素的元素

时间:2014-07-17 14:56:11

标签: javascript jquery

我有三个不同的div类:design-box-triple,double和single。有多个具有不同类别的div,它们都是浮动的,以便响应。

<div class="collageWidgets">
    <div class="design-box-double"></div> <!--width 50%-->
    <div class="design-box-triple"></div> <!--width 33%-->
    <div class="design-box-triple"></div> <!--width 33%-->
    <div class="design-box-triple"></div> <!--width 33%-->
    <div class="design-box-double"></div> <!--width 50%-->
    <div class="design-box-double"></div> <!--width 50%-->
    <div class="design-box-single"></div> <!--width 100%-->
    <div class="design-box-single"></div> <!--width 100%-->
</div>

我想要的是使用jQuery来检查div是否具有某些条件的类然后用div行包装以使它是100%宽度并且float:left divs在视觉上保持良好并且不会破坏流的浮动。

示例最终结果:

<div class="collageWidgets">
  <div class="row"> <!--width 100%-->
     <div class="design-box-double"></div> <!--width 50%-->
  </div>
  <div class="row"> <!--width 100%-->
     <div class="design-box-triple"></div> <!--width 33%-->
     <div class="design-box-triple"></div> <!--width 33%-->
     <div class="design-box-triple"></div> <!--width 33%-->
  </div>
  <div class="row"> <!--width 100%-->
     <div class="design-box-double"></div> <!--width 50%-->
     <div class="design-box-double"></div> <!--width 50%-->
  </div>
  <div class="row"><!--width 100%-->
     <div class="design-box-single"></div> <!--width 100%-->
  </div>
  <div class="row"><!--width 100%-->
     <div class="design-box-single"></div> <!--width 100%-->
  </div>
  <div class="row"> <!--width 100%-->
     <div class="design-box-triple"></div> <!--width 33%-->
     <div class="design-box-triple"></div> <!--width 33%-->
     <!-- Example missing triple, but won't look messed up because it is wrapped with a row 100% width, display block, and clearfix-->
  </div>
</div><!--End of Collage Widget Div-->

这是我的双重和单一工作的jQuery。 我在三重代码上苦苦挣扎。 divs with design-box-triple。

这是我的逻辑思维:

我需要检查前一个对象父级是否有class =“row”&amp;&amp;如果div有class design-box-triple。如果是,则将具有design-box-triple的第一个小部件推送到数组中。然后检查下一个对象是否具有design-box-triple类,如果没有,则将div三元组包装在div class = row中。然后我需要检查第一个类是否具有design-box-triple,然后是next-design-triple,然后接下来将在div class = row中进行design-box-triple wrap。但是如果只有两个div,类设计 - 盒 - 三元组彼此相邻,那么将它包装成一排。

以下是我的代码:

(function() {
var widgetArray = $(".careerCollageWidgets").find(".career-widget");
var prevClass = '';
var prevObject = '';
var prevPrevObject = '';
var tripleArray = [];
console.log(widgetArray.length);

$(widgetArray).each(function(index, value){
    console.log($(this));
    var widget = $(this);
    if (widget.hasClass('design-box-single')){
        widget.wrapAll('<div class="row"></div>');
        prevClass = 'design-box-single';
    } else if (widget.hasClass('design-box-double')){

        if(prevClass == 'design-box-double' && !prevObject.parent().hasClass('row')) {
            //var previousArray = [prevObject, widget];
            prevObject.add(widget).wrapAll('<div class="row"></div>');
        } else if (!widget.next().hasClass('design-box-double')){
            widget.wrapAll('<div class="row"></div>');
        }

        prevClass = 'design-box-double';

    } else if (widget.hasClass('design-box-triple')){
        tripleArray.push(widget);
        if (!prevObject.parent().hasClass('row')){
            tripleArray.push(widget);

            console.log(tripleArray);
            console.log("tripleArray");
            //tripleArray.wrap('<div class="row"></div>');
        }
        //else if(prevClass == 'design-box-triple' && !prevObject.parent().hasClass('row')) {

        //  if (!widget.next().hasClass('design-box-triple')){
        //      prevObject.add(widget).wrapAll('<div class="row"></div>');
        //  }

        //} 
        //else if (!widget.next().hasClass('design-box-triple')){
        //  widget.wrapAll('<div class="row"></div>');
        //}
        prevClass = 'design-box-triple';
    }

    prevObject = widget;
});

})();

$('.row').css({'width':'100%', 'display':'block'});
$('.row').addClass('clearfix');

1 个答案:

答案 0 :(得分:1)

http://jsfiddle.net/isherwood/7jpy4/

$('.single').wrap('<div class="row"></div>');

var doubles = $('.double');
for (var i=0; i<doubles.length;) {
   i += doubles.eq(i).nextUntil(':not(.double)').andSelf()
       .wrapAll('<div class="row"></div>').length;
}

var triples = $('.triple');
for (var i=0; i<triples.length;) {
   i += triples.eq(i).nextUntil(':not(.triple)').andSelf()
       .wrapAll('<div class="row"></div>').length;
}

请注意,我为了简化此演示的内容而分解了您的班级名称。此外,如果您连续超过两次或三次,您必须将计数器放入以防止叠加的双打和三次。

来自this question的灵感。