2015-07-10 8 views
7

Ich möchte das CSS Counter-Inkrement Attribut auf ".demo:before" mit jQuery festlegen.CSS-Zählerinkrement über jQuery setzen

Das Problem ist, dass jQuery auf ein Pseudoelement nicht zugreifen kann. Ein anderer S.O. antwort (was ich jetzt nicht finden kann) schlug vor, ein datenattribut zu setzen und diesen wert dann in der CSS zu verwenden, aber das funktioniert auch nicht. Ist das etwas, das erreicht werden kann?

Vereinfachtes Beispiel: http://jsfiddle.net/4h7hk8td/

HTML:

<ul class="demo"> 
    <li></li> 
    <li></li> 
    <li></li> 
    <li></li> 
    <li></li> 
</ul> 

JS:

// 1) User Sets Unit Size 
var myUnit = 100; 

// 2) Unit size is saved via data attribute 
$('.demo li').attr('data-unit', myUnit); 

CSS:

.demo { 
    counter-reset: list; 
} 

.demo li:before { 
    /* 3) CSS gets data attribute and applies as the increment. Not working :(*/ 
    counter-increment: list attr(data-unit); 
    content: counter(list); 
} 
+1

hm ... Wenn Sie Datenattribute verwenden, ist es möglich, 'content: attr (data-unit) 'zu verwenden und den Counter-Teil komplett zu überspringen? http://jsfiddle.net/jmarikle/js6gzt5q/. –

+1

Fun Tatsache: wenn es nicht für die Tatsache war, dass [CSS3 Attr() nirgends unterstützt wird] (http://StackOverflow.com/Questions/8769786/Css3S-Attr-doesnt-Work-in-major-Browsers/8769922 # 8769922), Sie könnten tatsächlich 'counter-increment: list attr (Dateneinheits-Ganzzahl) schreiben;' und es würde einfach funktionieren. – BoltClock

+0

Ja, ich könnte das tun, wenn das der einzige Weg ist. Ich habe nur eine Sache, die bereits mit den CSS-Zählern erstellt wurde, also hoffte ich, dass ich nur modifizieren könnte, was bereits da war. – kthornbloom

Antwort

1

Erhöhen Sie den Zähler für jede li und nicht :before: http://jsfiddle.net/7vt0kf2c/.

var myUnit = 100; 
$(".demo li").css("counter-increment", "list " + myUnit); 
$("button").click(function(e) { 
    $(".demo li").css("counter-increment", "list " + 200);  
}); 
+0

Obwohl dies nicht das ist, wonach ich gefragt habe, scheint meine Frage keine gute Antwort zu haben. Da dies ein besserer Weg ist, das Problem anzugehen, akzeptiere ich dies als Antwort. – kthornbloom

3

Sie können tatsächlich einen CSS-Präprozessor verwenden, um die CSS zu kompilieren.

ich ein Beispiel unter Verwendung von SCSS geben werde:

Es tatsächlich verschiedene Zählerinkrementierungen für die übergebenen Zahlen macht. Diese Lösung funktioniert, wenn Sie die Werte kennen, die zum Erhöhen verwendet werden. Wenn die übergebenen Werte beispielsweise 100, 200 und 300 sind, können Sie @each loop verwenden, um CSS für diese bekannten Zahlen zu kompilieren.

Wenn Sie zumindest wissen, wie viele Werte übergeben werden, können Sie @for loop (verwenden, wenn begrenzte Nummern vorhanden sind).

$values: 100, 200, 300; 
@each $i in $values { 
    .demo[data-num="#{$i}"]{ 
    & > li::before{ 
     counter-increment: list #{$i}; 
    } 
    } 
} 

.demo { 
    counter-reset: list; 
} 

.demo li:before { 
    content: counter(list); 
} 

Working Fiddle (Änderung des data-num Attributwert auf 200 oder 300)

Hier ist die kompilierte CSS:

.demo[data-num="100"] > li::before { 
    counter-increment: list 100; 
} 

.demo[data-num="200"] > li::before { 
    counter-increment: list 200; 
} 

.demo[data-num="300"] > li::before { 
    counter-increment: list 300; 
} 

.demo { 
    counter-reset: list; 
} 

.demo li:before { 
    content: counter(list); 
} 
+0

wird css, sollte als richtig markiert werden – Ben

-1

die akzeptierte Antwort, im Grunde den gleichen Netto-Effekt ohne CSS :

var myUnit = 100; 
$('.demo').data('unit', myUnit); 
$('.demo li').each(function() { 
    $(this).text($('.demo').data('unit') * ($(this).index() + 1)); 
});