2013-08-14 9 views
5

私は潜在的に入れ子リストの無限の量を持つことができる順序リストを持っています。私は動的に各ネストされたリストのbackground-colorを変更して、徐々に暗くなり、各リストのグループ化をはるかに理解しやすくしたいと考えています。ネストされたレベルに応じて背景色を変更できますか?

だから私は、この基本的な構造(つまり、無限に続けることができます)があります、私が欲しいものを私に与え

.top-level-list li ol li ol li { 
    background: #D4D4D4; 
} 

.top-level-list li ol li ol li ol li{ 
    background: #C7C7C7; 
} 

:今

<ol class="top-level-list"> 
    <li> 
     <ol> 
      <li> 
       <ol> 
        <li></li> 
       </ol> 
      </li> 
     </ol> 
    </li> 
</ol> 

を、私はこのようなものを使ってこれを実現することができます使用できるレベルは限られており、各レベルでCSSファイルにデータが追加されるため、ロード時間が長くなります。

1つのセレクタで色を動的に設定する方法はありますか?私はCSS3がいくつかの新しいCSSセレクタのトリックを追加したことを知っていますが、このようなことを文書化するものは何も見つかりません。セレクタ内の値をセレクタ自体に対応させる方法も見つけられません。

+1

それは、いくつかのCSSルールが大幅にあなたのロード時間に影響を与える可能性があると信じてするのは難しいですが、あなたはそれについては本当に心配している場合、セレクタから「オール」を省略する - 彼らは必要ありませんしています。 – fred02138

+1

JavaScriptを使ってCSSプロパティを変更しようとしましたか?バックグラウンドを取得し、プログラムで色を生成するために16進数値に少数を追加するのは難しいことではありません。 – Joshua

+1

次の 'li'はどのくらい'暗い 'でしょうか?この種の計算にはJavaScriptが必要です。 –

答えて

16

並べ替えあなたが探しているものと正確には一致しませんが、background-colorrgbaを使用すると、かなりまともなシミュレーションを行うことができます。 http://jsfiddle.net/jRdQC/

.top-level-list ol { 
    background-color:rgba(0,0,0,.2); 
} 

背景色は「レイヤー」なので、行くほど暗くなります。

+0

親要素 '.top-level-list'にデフォルトの' background-color:white'を設定する方が良いでしょう。 –

+1

これはエレガントです。私の場合は、各OLも背景色を持っているので動作しませんが、私はそれを取り除くために少しGUIを再加工することを見ることができます。それにかかわらず、素晴らしいアイデア。 +1私から –

+0

本当に良いアイデア! +1 –

3

CSSの負荷を避けるために、javascriptを使用してツリーを解析できます。

function luminance(hex, lum) { 
    // validate hex string 
    hex = String(hex).replace(/[^0-9a-f]/gi, ''); 
    if (hex.length < 6) { 
     hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]; 
    } 
    lum = lum || 0; 
    // convert to decimal and change luminosity 
    var rgb = "#", c, i; 
    for (i = 0; i < 3; i++) { 
     c = parseInt(hex.substr(i*2,2), 16); 
     c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16); 
     rgb += ("00"+c).substr(c.length); 
    } 
    return rgb; 
} 

そして、あなたは、ネストされたレベルに基づいて、暗い色を適用する必要があります:あなたは、最初の色彩輝度のための機能が必要になります。ここで

var color = '#efefef'; 

// You could also get the styled color by using: 
// var color = $('.class-goes-here').css('background-color'); 

$('ol').each(function() { 
    var depth = $(this).parents('ol').length; 
    var darken_ratio = depth * .1; 

    var darker_color = luminance(color, -darken_ratio); 

    $(this).css('background-color', darker_color); 
}); 

はフィドルです:http://jsfiddle.net/dDUaF/1/

あなたはdarken_ratio変数に小数を増やすことで色を暗くすることができます。これは、16進数の色でも機能します。たとえば:http://jsfiddle.net/dDUaF/4/

+0

これはかなりうまくいきます。私が必要とするのはまさにそれですが、リストのいくつかはかなり深くて非常に大きくなるので、私は可能な限りJSメソッドから逸脱します。答えをありがとう、私はこれが役に立つかもしれない他の例を見ることができます。 –

関連する問題