是否可以使用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>
答案 0 :(得分:174)
您可以使用.slice()
执行此操作,如下所示:
var divs = $("div > div");
for(var i = 0; i < divs.length; i+=3) {
divs.slice(i, i+3).wrapAll("<div class='new'></div>");
}
You can try out a demo here,我们在这里所做的就是获取你想要包裹的元素并循环遍历它们,分批执行.wrapAll()
3然后移动到下一个3,等等。一次包裹3个,但最后留下多个,例如3,3,3,2,如果是这样的话。
答案 1 :(得分:18)
我已经写了一个通用的块函数,这使得这很容易做到:
$.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>');
&#13;
div > div {
width: 50px;
height: 50px;
background: blue;
margin: 2px;
float: left;
}
div.new {
background: red;
height: auto;
width: auto;
overflow: auto;
}
&#13;
<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>
&#13;
答案 2 :(得分: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的链接。
这将包装您指定的每个其他数字。我正在使用jquery 1.8.2。所以请记住每次都使用选择器调用EveryWhat(3)
和一个数字。当然把它放在页面的底部或将其包装在
$(document).ready(function() {
//place above code here
});
您可以使用每个n和.wrapInner('<div class="new" />')
来获得相同的结果。
答案 3 :(得分:7)
以上是Nick的更实用版本:
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');
包装器名称的第二个参数是可选的。
答案 4 :(得分: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的插件创意并将其扩展为自动换行并采用两个参数。它起初并不适用于我,但我通过对代码进行了一些编辑和添加来运行它。
要调用该函数,只需使用要包装的内容的父元素,然后按如下方式设置参数。
$('#container').WrapThis(5, 'li');
第一个参数是要包装的元素数量,第二个参数是要包装的元素类型。
您可以在变量wrapClass
下的main函数中更改包装元素的类。
答案 5 :(得分:0)
我为另一个与此问题重复的问题准备了这个答案。所以也许我的变体对某些人有用:
我认为包装所有三个元素的解决方案是:
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/