他の人が述べたように、これは純粋な CSS では不可能です。ただし、js を使用すると、かなり可能であり、かなり簡単でもあります。
簡単にするためにこれを jQuery で実装しましたが、純粋な JS でも実行できます。
http://jsfiddle.net/sg3s/Suf3p/
私は基本的に、適用するセレクターをプライマリ カラーで色付けし、サブセレクトを使用して一致する子をセカンダリ カラーで色付けする小さな jQuery プラグインを作成しました。
jQuery(function($) {
$.fn.alternateNestedBgColor = function(subselect, colors) {
// While not a great optimization, length of the colors array always stays the same
var l = colors.length;
// Itterate over all element in possible array
// jQuery best practice to handle initializing multiple elements at once
return this.each(function() {
var $sub = $(this), i = 0;
// Executes code, at least once
do {
// Set bg color for current $sub element
$sub.css('backgroundColor', colors[i++ % l]);
// Set $sub to direct children matching given selector
$sub = $sub.children(subselect);
// Will repeat the do section if the condition returns true
} while ($sub.length > 0);
});
};
// target first div in the body
// first argument = child selector
// second argument = array list of colors
$('body>div').alternateNestedBgColor('div', ['red', 'green', 'blue', 'purple', 'grey']);
});
更新apply
とがどのように使用されたかを詳述する更新が要求modulo
されました。
これを最近投稿してから、ほぼ2年が経ちました。そして、作業中、当時私が作成したソリューションは少し冗長で混乱を招くものでしapply
た。スコープに少し慣れてきたので、関数をもっとシンプルに改訂しました。
が役立つ唯一の状況は、関数スコープ内apply
の変数に値を渡す必要がある場合です。クラスを操作しない限り、 orthis
が必要な状況はあまりありません。それについて読みたい場合は、クラスのコンテキストで説明しているこの回答を参照してください。MDN リンクも優れたリソースです (これおよびその他の JavaScript 構成要素/概念用)。apply
call
に関してはmodulo
、これは基本的な数学であり、この質問は操作を非常によく説明しています。つまり、数値を別の数値で割った後の完全な整数の余りが得られます。したがって、js のように33 % 8 = 1
記述できますが、それは非常に非効率的です。33-parseInt(33/8)*8
演算の結果は常に 0 (数値が完全に割り切れる場合) から 2 番目の引数から 1 を引いた値 (私の例では 7) になります。
0 % 3 = 0 // technically doesn't exist (as you can't divide 0 with anything) but 0 for practicality in all programming languages afaik(?)
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2
6 % 3 = 0 etc...
これは、CPU にとって本質的に単純な操作の 1 つです。実際、これができなければ、コンピューターはありません。
JavaScript リビジョンでは、指定された配列からの色の選択を として記述しましたcolors[i++ % l]
。
書くと、これは私に残りを与え、i / l
その整数をcolors
使用する色を返す配列のインデックスとして使用します。
は、モジュロで使用するため++
に の値を返した後にのみ 1 を追加しますi
。この動作は、私が書いた場合は逆になりますが++i
、ここでの目的にはうまくいきません。
参考までに、 do...while に関する MDN の記事を参照してください。
いくつかの問題が解決したことを願っています!:)