3divごとにdivでラップする


85

nth-childセレクターを使用して、を使用して3つのdivをラップすることは可能.wrapAllですか?私は正しい方程式を解くことができないようです。

そう...

<div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
</div>

になる...

<div>
   <div class="new">
        <div></div>
        <div></div>
        <div></div>
   </div>
   <div class="new">
        <div></div>
        <div></div>
        <div></div>
   </div>
</div>

2
gist.github.com/3181731まさにそれを行うための素晴らしいjQueryプラグイン。お役に立てば幸いです。
iMoses 2012

回答:


179

あなたは.slice()このように、それを行うことができます:

var divs = $("div > div");
for(var i = 0; i < divs.length; i+=3) {
  divs.slice(i, i+3).wrapAll("<div class='new'></div>");
}

ここデモを試すことができます。ここで行っているのは、ラップする要素を取得してループし、.wrapAll()3つのバッチで実行してから、次の3に移動することです。一度に3つをラップし、ただし、多くは最後に残されます。たとえば、その場合は3、3、3、2です。


これを関数にして、ラップされたdivの数を引数にします。applyDivGrouping(divs、divsPerGroup);のようなもの
Stefan Kendall

うわー!迅速な返信ありがとうございます。いくつかのこと...それで、明確にするために-これはn番目の子を使用して不可能ですか?&..完全なjQuery初心者として-これを機能させるにはどうすればよいですか?jQuery(function($)...でラップしますか?ありがとうございます
csbourne 2010

@ csbourne-いいえ、これに:nth-child()は適していません。これを呼び出す$(function() { });場合は、実行する場合はaでラップするだけですdocument.ready。それ以外の場合は、実行するときに呼び出します:)
NickCraver

素晴らしいヘルプとガイダンスを提供してくれたニックに感謝します-完璧に機能します。
csbourne 2010

3
@Fahad、NickCraverロジックあたりなど、あなたかもしれないコードの単に編集小さなピースvar divs = $("div > .classname");OR var divs = $("div .classname");おかげ

23

これを非常に簡単にする汎用チャンク関数を作成しました。

$.fn.chunk = function(size) {
    var arr = [];
    for (var i = 0; i < this.length; i += size) {
        arr.push(this.slice(i, i + size));
    }
    return this.pushStack(arr, "chunk", size);
}

$("div > div").chunk(3).wrap('<div class="new"></div>');


8

プラグイン

$(function() {
    $.fn.EveryWhat = function(arg1) {
        var arr = [];
        if($.isNumeric(arg1)) {
            $.each(this, function(idx, item) {
                var newNum = idx + 1;
                if(newNum%arg1 == 0)
                arr.push(item);
            });
        }
        return this.pushStack(arr, "EveryWhat", "");
    }
});

それを使用する方法。

EveryWhat()要素を呼び出し、収集したいすべての要素の番号を入力します。

$("div").EveryWhat(2).wrapInner('<div class="new" />');

wrapinnerの引用符は<div class="new" />、クラスと終了タグで適切にフォーマットされている必要があります。Stackoverflowを使用すると、どのように表示されるかを表示できませんが、ここに自己終了divのリンクがあります。

それはどのように見えるべきか

これにより、指定した1つおきの数値が折り返されます。私はjquery1.8.2を使用しています。したがってEveryWhat(3)、毎回セレクター呼び出しと番号を使用することを忘れないでください。もちろん、ページの下部に配置するか、

$(document).ready(function() {  
    //place above code here
});

n番目ごとに使用して.wrapInner('<div class="new" />')、同じ結果を得ることができます。


1
すでにこれを行うことができますが、$('div > div:nth-child(3n)')実際には3つの要素からなる2つのグループにはなりません。
ジャック

7

上記のニックのより使いやすいバージョンは次のとおりです。

window.WrapMatch = function(sel, count, className){
  for(var i = 0; i < sel.length; i+=count) {
    sel.slice(i, i+count).wrapAll('<div class="'+className+'" />');
  }
}

次のように使用します。

var ele = $('#menu > ul > li'); 
window.WrapMatch(ele, 5, 'new-class-name');

もちろん、ウィンドウはHandlers名前空間に置き換える必要があります。

更新:jQueryを活用するわずかに優れたバージョン

(function($){
  $.fn.wrapMatch = function(count, className) {
    var length = this.length;
    for(var i = 0; i < length ; i+=count) {
      this.slice(i, i+count).wrapAll('<div '+((typeof className == 'string')?'class="'+className+'"':'')+'/>');
    }
    return this;
  }; 
})(jQuery);

次のように使用します。

$('.list-parent li').wrapMatch(5,'newclass');

ラッパー名の2番目のパラメーターはオプションです。


1
$(function() {
    $.fn.WrapThis = function(arg1, arg2) { /*=Takes 2 arguments, arg1 is how many elements to wrap together, arg2 is the element to wrap*/

        var wrapClass = "column"; //=Set class name for wrapping element

        var itemLength = $(this).find(arg2).length; //=Get the total length of elements
        var remainder = itemLength%arg1; //=Calculate the remainder for the last array
        var lastArray = itemLength - remainder; //=Calculate where the last array should begin

        var arr = [];

        if($.isNumeric(arg1))
        {
            $(this).find(arg2).each(function(idx, item) {
                var newNum = idx + 1;

                if(newNum%arg1 !== 0 && newNum <= lastArray){
                    arr.push(item);
                }
                else if(newNum%arg1 == 0 && newNum <= lastArray) {
                    arr.push(item);
                    var column = $(this).pushStack(arr);
                    column.wrapAll('<div class="' + wrapClass + '"/>'); //=If the array reaches arg1 setting then wrap the array in a column
                    arr = [];
                }
                else if(newNum > lastArray && newNum !== itemLength){ //=If newNum is greater than the lastArray setting then start new array of elements
                    arr.push(item);
                }
                else { //=If newNum is greater than the length of all the elements then wrap the remainder of elements in a column
                    arr.push(item);
                    var column = $(this).pushStack(arr);
                    column.wrapAll('<div class="' + wrapClass + '"/>');
                    arr = []
                }
            });
        }
    }
});

私はKyleのプラグインのアイデアを採用し、それを拡張して自動的にラップし、2つの引数を取りました。そもそもうまくいきませんでしたが、コードをいくつか編集して追加するだけで実行できました。

関数を呼び出すには、ラップするものの親要素を使用してから、次のように引数を設定します。

$('#container').WrapThis(5, 'li');

最初の引数は、一緒にラップする要素の数であり、2番目の引数は、ラップする要素タイプです。

main関数の変数wrapClass。の下でラッピング要素のクラスを変更できます。


0

私はこれと重複した別の質問のためにこの答えを用意しました。だから多分私の変種は誰かのために役立つでしょう:

3つの要素すべてをラップするソリューションは次のとおりだと思います。

var $lines = $('.w-col'), // All Dom elelements with class .w-col
     holder = []; //Collect DOM elelements

$lines.each(function (i, item) {
  holder.push(item);

  if (holder.length === 3) {
    $(holder).wrapAll('<div class="w-row" />');
    holder.length  = 0;
  }
});

$(holder).wrapAll('<div class="w-row" />'); //Wrap last elements with div(class=w-row)

私はjsbinで同じコードを書きましたが、いくつかの改善点がありますhttp://jsbin.com/necozu/17/またはhttp://jsbin.com/necozu/16/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.