Bir div'deki her 3 div'i sarmala


86

nth-child3 div'i kullanarak kaydırmak için seçicileri kullanmak mümkün müdür .wrapAll? Doğru denklemi çözemiyorum.

yani...

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

olur ...

<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 Tam olarak bunu yapmak için güzel bir jQuery eklentisi. Umarım yararlı bulursunuz.
iMoses

Yanıtlar:


180

Bunu şu şekilde yapabilirsiniz .slice():

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

Burada bir demo deneyebilirsiniz , burada tek yaptığımız, sarmak ve döngü yapmak istediğiniz öğeleri almak, .wrapAll()3'lü gruplar halinde bir sonraki 3'e geçmek vb. Her seferinde 3'ü saracak ve ancak birçoğu sonunda kalır, örneğin 3, 3, 3, 2 eğer durum buysa.


Bunu bir işlev ve sarmalanmış div'lerin sayısını bir bağımsız değişken yapardım. ApplyDivGrouping (divs, divsPerGroup) gibi bir şey;
Stefan Kendall

Vaov! Çabuk cevapladığınız için teşekkürler. Birkaç şey ... Yani, sadece açıklama için - nth-child kullanarak bu mümkün değil mi? & .. Tam bir jQuery acemi olarak - bunu nasıl çalıştırabilirim? Bunu bir jQuery (function ($)) içine mi
sarmalıyım

@csbourne - Hayır :nth-child(), buna pek uygun gelmiyor, bunu çağırmak için, sadece bir içine sarmak $(function() { });istiyorsanız document.ready, yoksa çalıştırmak istediğinizde arayın :)
Nick Craver

Harika yardım ve rehberlik için teşekkürler Nick - mükemmel çalışıyor.
csbourne

3
@Fahad, NickCraver mantığına göre, sadece küçük bir kod parçasını düzenleyebilirsiniz var divs = $("div > .classname");VEYA var divs = $("div .classname");Teşekkürler

23

Bunu yapmayı oldukça kolaylaştıran genel bir yığın işlevi yazdım:

$.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

Eklenti

$(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", "");
    }
});

Bu nasıl kullanılır.

EveryWhat()Öğeyi çağırın ve toplamak istediğiniz her öğe için bir numara girin.

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

wrapinner'ın alıntıları <div class="new" />, bir sınıf ve kapanış etiketi ile uygun şekilde biçimlendirilmiş olmalıdır . Stackoverflow, neye benzediğini göstermemi engelliyor ama burada kendi kendine kapanan bir div'in bağlantısı var.

Neye benzemeli

Bu, belirttiğiniz diğer tüm sayıyı saracaktır. Jquery 1.8.2 kullanıyorum. bu yüzden EveryWhat(3)her seferinde seçici arama ve bir numara kullanmayı unutmayın . Tabii ki sayfanın altına koyarak veya

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

Her n'yi ve sonra .wrapInner('<div class="new" />')aynı sonuçlar için kullanabilirsiniz.


1
Bunu zaten yapabilirsiniz $('div > div:nth-child(3n)')ve aslında üç öğeli iki grupla sonuçlanmaz.
Ja͢ck

7

İşte yukarıda Nick'in daha kullanışlı bir versiyonu:

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

Bunu şu şekilde kullanırsınız:

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

pencere, elbette İşleyiciler ad alanınızla değiştirilmelidir.

Güncellendi: jQuery'den yararlanan biraz daha iyi bir sürüm

(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);

Gibi kullanın:

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

Sarmalayıcı adı için ikinci parametre isteğe bağlıdır.


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'ın eklenti fikrini aldım ve onu otomatik olarak sarmaya ve iki argüman alacak şekilde genişlettim. Başlamak için işe yaramadı, ancak koda birkaç düzenleme ve eklemeyle çalıştırdım.

Fonksiyonu çağırmak için sadece sarmak istediğiniz şeyin ana öğesini kullanın ve ardından argümanlarınızı aşağıdaki gibi ayarlayın.

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

İlk bağımsız değişken, kaç öğeyi birbirine sarmak istediğinizdir ve ikinci bağımsız değişken, sarmak istediğiniz öğe türüdür.

Değişkenin altındaki ana işlevde sarma elemanının sınıfını değiştirebilirsiniz wrapClass.


0

Bu yanıtı, bunun kopyası olan başka bir soru için hazırladım. Yani belki benim varyantım biri için faydalı olacaktır:

Bence üç unsuru da sarmanın çözümü:

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)

Aynı kodu jsbin'de bazı iyileştirmelerle yazdım http://jsbin.com/necozu/17/ veya http://jsbin.com/necozu/16/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.