nth-child
セレクターを使用して、.wrapAll
を使用して3つのdivをラップできますか?正しい方程式を解くことができないようです。
そう...
<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>
.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。
これを非常に簡単にする汎用チャンク関数を作成しました。
$.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>');
$.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>');
div > div {
width: 50px;
height: 50px;
background: blue;
margin: 2px;
float: left;
}
div.new {
background: red;
height: auto;
width: auto;
overflow: auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
_$(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のリンクがあります。
これは、指定した他のすべての番号をラップします。 jquery 1.8.2を使用しています。そのため、毎回セレクター呼び出しEveryWhat(3)
と数字を使用することを忘れないでください。もちろん、ページの下部に置くか、
_$(document).ready(function() {
//place above code here
});
_
同じ結果を得るには、n番目ごとに.wrapInner('<div class="new" />')
を使用します。
上記のニックのより使いやすいバージョンは次のとおりです。
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');
もちろん、windowsは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番目のパラメーターはオプションです。
$(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番目の引数は、ラップする要素タイプです。
変数wrapClass
の下のmain関数でラッピング要素のクラスを変更できます。
この回答は、この質問と重複する別の質問に対して準備しました。だから多分私のバリアントはいくつかのために役に立つでしょう:
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/