【问题标题】:Wrap elements with new element depending on parent and/or class根据父级和/或类用新元素包装元素
【发布时间】:2014-09-08 12:38:24
【问题描述】:

我有三个不同的 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 div 保持视觉美观并且不会破坏漂浮。

示例最终结果:

<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。 我在三重代码上苦苦挣扎。 带有 design-box-triple 的 div。

这是我的逻辑思维:

我需要检查前一个对象父级是否有 class="row" && 如果 div 有类 design-box-triple。如果是,则将第一个具有 design-box-triple 的小部件推送到数组中。然后检查下一个对象是否具有设计框三重类,如果没有,则将三重小部件包装在 div class= row 中。然后我需要检查第一个类是否有 design-box-triple,下一个有 design-box-triple,然后下一个有 design-box-triple 将所有内容包装在一个 div class= row 中。但是,如果只有两个具有类 design-box-triple 的 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');

【问题讨论】:

  • 您应用到.row 的 CSS 是 div 的默认值。应该没有必要。

标签: javascript jquery


【解决方案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

【讨论】:

  • 我添加了 .slice(0,3) 来选择三个连续的相同类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多