jQuery Finden Sie die Anzahl der Elemente pro Zeile in Float-Lis
Lesezeit: 7 Minuten
Deeptechn
Gibt es eine Möglichkeit, die Anzahl der Artikel zu finden (li Tag) in a ul was hat es schweben: einstellen links. Angenommen, ich habe jede Menge Ordner, die visuell dargestellt werden durch li Stichworte. Aufgrund des Schwimmverhaltens sobald die li passt nicht in eine einzelne Reihe, sie werden nach unten gedrückt, wodurch sie wie Reihen und Spalten aussehen. Meine Fragen sind
Mit jQuery ..etc Gibt es eine Möglichkeit, die Anzahl der li Für jede Reihe
ul,li{margin:0 0;padding:0 0;}
ul li{display:inline;float:left}
Für meine Auflösung macht li bis F eine Zeile und der Rest eine andere wie unten. Ich möchte eine Jquery-Methode, um die Anzahl der Elemente (in meinem Fall 6) in Zeile 1 abzurufen.
A B C D E F
G H I J
Kontext
Ich füge Tastaturereignisse hinzu, um mit links, rechts, oben, unten zu jedem Ordner (li) zu navigieren. Links rechts ist so einfach wie das Hervorheben der nächsten und vorherigen Lis. Obere und untere Tasten müssen zur nächsten Reihe und darüber gehen. Jetzt kriegst du es 🙂
Hast du versucht $("ul li").length?
– Furqan Hameedi
18. Juli 2012 um 10:18 Uhr
Dies könnte schwierig sein, da Sie sich auf eine Browser-Layout-Engine verlassen, um die erforderliche Layout-Logik zu erstellen. Ich würde vorschlagen, eine andere Methode anzuwenden. Dies mit jQuery zu tun, könnte in der Tat sehr schwierig sein, da die Standard-jQuery-DOM-Funktionen aussehen werden beim Markup eher das Layout. Sie könnten etwas mit .position machen, aber ich würde empfehlen, Ihre Strategie zu überdenken (soweit ich es verstehe).
– El Ronnoco
18. Juli 2012 um 10:19 Uhr
@Furqan habe ich deutlich erwähnt Anzahl von li in pro Zeile nicht die ganze ul
– Deeptechn
18. Juli 2012 um 10:20 Uhr
@ElRonnoco Möglicherweise wird die bearbeitete Frage alle Zweifel beseitigen 🙂
– Deeptechn
18. Juli 2012 um 10:25 Uhr
Interessant! Sind Lis von fester Breite? In diesem Fall können Sie die Anzahl der Lis pro Reihe berechnen, indem Sie die Breite von ul durch li dividieren. Auf diese Weise können Sie bestimmen, wie viele Lis in einer einzelnen Reihe erscheinen. Sie können auch $(“li”).length nehmen und damit bestimmen, wie viele li in der letzten Reihe sind, dh total_li%li_per_row
– HOCH
18. Juli 2012 um 10:31 Uhr
techfoobar
Wir können dies tun, indem wir die Anzahl der LIs überprüfen, deren obere Positionen (y-Achse) mit denen ihrer vorherigen Geschwister übereinstimmen.
Hinweis: Die Neuberechnung wird auch bei der Fenstergrößenänderung durchgeführt, um die Logik vollständig zu demonstrieren.
Code:
function calculateLIsInRow() {
var lisInRow = 0;
$('ul li').each(function() {
if($(this).prev().length > 0) {
if($(this).position().top != $(this).prev().position().top) return false;
lisInRow++;
}
else {
lisInRow++;
}
});
console.log('No: of lis in a row = ' + lisInRow);
}
calculateLIsInRow();
$(window).resize(calculateLIsInRow);
HINWEIS
Die Anzahl der LIs ist für alle Zeilen gleich, außer vielleicht für die letzte, wenn die Gesamtzahl der LIs kein Vielfaches von lisInRow ist. Die Anzahl der LIs in der letzten Zeile kann leicht herausgefunden werden, indem man Folgendes tut: $('ul li').length % lisInRow
Ich sehe keine Möglichkeit, dies für nachfolgende Zeilen zu tun. Nur die erste Reihe
– Deeptechn
18. Juli 2012 um 10:42 Uhr
Die Zählung ist für alle Zeilen gleich, außer vielleicht für die letzte. Die Anzahl der LIs in der letzten Zeile kann leicht herausgefunden werden, indem Sie Folgendes tun: $('ul li').length % lisInRow
– techfoobar
18. Juli 2012 um 10:44 Uhr
Er hat dich da 🙂 Das ist eine sehr elegante Lösung
– Milimetrisch
18. Juli 2012 um 10:46 Uhr
Die obige Demo wurde aktualisiert, um auch die Anzahl der LIs in der letzten Reihe anzuzeigen.
– techfoobar
18. Juli 2012 um 10:48 Uhr
Ihr JSFiddle wurde aktualisiert, um Zeilen mit unterschiedlicher Anzahl von Elementen (dh nicht einheitliche Größen) zu ermöglichen. Versuchen Sie hier, den Mauszeiger über Elemente zu bewegen: jsfiddle.net/KgBpx/107
– Stephen Saucier
20. März 2013 um 11:07 Uhr
Die Verwendung von filter() sorgt für eine geringere Codemenge.
function filterByTop(top) {
return function(i) { return $(this).offset().top == top; };
}
var el = $('li:first');
var rowSz = $('li').filter(filterByTop(el.offset().top)).length;
Sie können die folgende Funktion verwenden, um ein Array zu erhalten, das die Anzahl der Li-Elemente pro Zeile enthält. Wenn Sie nur die li-Elemente mit Float übrig haben möchten, können Sie diese Bedingung einfach hinzufügen.
function computeItemsPerRow() {
var itemsInRows = new Array();
var countLi = $('ul li');
var rowWidth = $('#rowContainer').width(); // TODO: Replace with the proper row container selector.
var curRowWidth = 0;
var itemsInCurRow = 0;
for (var i = 0; i < countLi; i++) {
var itemWidth = $('li:eq(' + i + ')').width();
if (curRowWidth + itemWidth > rowWidth || i == countLi - 1) {
itemsInRows[itemsInRows.length] = itemsInCurRow;
itemsInCurRow = 1;
curRowWidth = itemWidth;
}
else {
itemsInCurRow++;
curRowWidth = curRowWidth + itemWidth;
}
}
return itemsInRows;
}
Ich denke, Sie müssen auch die Marge berücksichtigen.
– Milimetrisch
18. Juli 2012 um 10:48 Uhr
Janis
Sie können es durch Spitzenposition tun:
var arr = [];
$('ul li').each(function(i){
arr[i] = $(this).position().top;
});
Dann zählen Sie übereinstimmende Werte im resultierenden Array – So zählen Sie übereinstimmende Werte im Array von Javascript
vvMINOvv
Probieren Sie dies aus (wirklich raus, benötigt möglicherweise etwas Debugging)
var numberPerRow = [];
var offsets = [];
$("li").each(function(){
var thisOffset = $(this).offset().top;
var index = $.inArray(thisOffset, offsets);
if(index >=0){
numberPerRow[index]++;
}else{
offsets.push(thisOffset);
numberPerRow.push(1);
}
});
Aktualisieren
Um den höchsten Zeilenwert in einem Array zu erhalten, können Sie Folgendes verwenden:
@yckart Ich habe es getestet und es funktioniert. aber warum funktioniert es … apply (soweit ich weiß) ruft in diesem Fall nur diese Funktion auf Math.maxund der erste Parameter ist der Geltungsbereich, also übergeben Sie ihn Math aber ich sehe hier keinen Schleifenmechanismus :s . Bitte erkläre deine Zauberei 😀
– vvMINOvv
18. Juni 2013 um 12:50 Uhr
@wMINOw Diese Funktion verwendet apply, um das maximale Element in einem numerischen Array zu finden. getMaxOfArray([1,2,3]) ist äquivalent zu Math.max(1, 2, 3)aber Sie können verwenden getMaxOfArray auf programmgesteuert erstellten Arrays beliebiger Größe. Die geschickte Verwendung von apply ermöglicht es Ihnen, integrierte Funktionen für einige Aufgaben zu verwenden, die andernfalls wahrscheinlich durch Schleifen über die Array-Werte geschrieben worden wären. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– yckart
18. Juni 2013 um 14:32 Uhr
var rows = 0;
$('li').each(function() {
var $this = $(this);
var $prev = $this.prev();
if ($prev.length && $this.position().top === $prev.position().top) rows++;
});
console.log(rows);
@yckart Ich habe es getestet und es funktioniert. aber warum funktioniert es … apply (soweit ich weiß) ruft in diesem Fall nur diese Funktion auf Math.maxund der erste Parameter ist der Geltungsbereich, also übergeben Sie ihn Math aber ich sehe hier keinen Schleifenmechanismus :s . Bitte erkläre deine Zauberei 😀
– vvMINOvv
18. Juni 2013 um 12:50 Uhr
@wMINOw Diese Funktion verwendet apply, um das maximale Element in einem numerischen Array zu finden. getMaxOfArray([1,2,3]) ist äquivalent zu Math.max(1, 2, 3)aber Sie können verwenden getMaxOfArray auf programmgesteuert erstellten Arrays beliebiger Größe. Die geschickte Verwendung von apply ermöglicht es Ihnen, integrierte Funktionen für einige Aufgaben zu verwenden, die andernfalls wahrscheinlich durch Schleifen über die Array-Werte geschrieben worden wären. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– yckart
18. Juni 2013 um 14:32 Uhr
Camilo Vitorino
Ein kleines Update des @techfoobar-Skripts:
Sie können die letzte Zeile ausblenden, wenn die Anzahl der Elemente von der Anzahl der allgemeinen Elemente abweicht
Hast du versucht
$("ul li").length
?– Furqan Hameedi
18. Juli 2012 um 10:18 Uhr
Dies könnte schwierig sein, da Sie sich auf eine Browser-Layout-Engine verlassen, um die erforderliche Layout-Logik zu erstellen. Ich würde vorschlagen, eine andere Methode anzuwenden. Dies mit jQuery zu tun, könnte in der Tat sehr schwierig sein, da die Standard-jQuery-DOM-Funktionen aussehen werden beim Markup eher das Layout. Sie könnten etwas mit .position machen, aber ich würde empfehlen, Ihre Strategie zu überdenken (soweit ich es verstehe).
– El Ronnoco
18. Juli 2012 um 10:19 Uhr
@Furqan habe ich deutlich erwähnt Anzahl von li in pro Zeile nicht die ganze ul
– Deeptechn
18. Juli 2012 um 10:20 Uhr
@ElRonnoco Möglicherweise wird die bearbeitete Frage alle Zweifel beseitigen 🙂
– Deeptechn
18. Juli 2012 um 10:25 Uhr
Interessant! Sind Lis von fester Breite? In diesem Fall können Sie die Anzahl der Lis pro Reihe berechnen, indem Sie die Breite von ul durch li dividieren. Auf diese Weise können Sie bestimmen, wie viele Lis in einer einzelnen Reihe erscheinen. Sie können auch $(“li”).length nehmen und damit bestimmen, wie viele li in der letzten Reihe sind, dh total_li%li_per_row
– HOCH
18. Juli 2012 um 10:31 Uhr