CSSは複数のスタイルを指定可能で、これにより以下のことが特徴として挙げられます。
しかし、複数のスタイルを指定するとどうしても競合が発生します。 この時にその競合を回避するためのルールが必要で、そのルールをカスケード処理といいます。 このカスケード処理では、HTML文書作成者とユーザー、ブラウザ間の優先度の付け方、またそれぞれの処理の仕方などを取り決めています。
ちなみに、将来的にはブラウザの整形やユーザーによるスタイル指定などが可能になるでしょう。 これにより、ユーザーは自分の好みのスタイルを他人のWebに適用可能で、例えば文字が小さく感じれば大きく指定したり、 行間が狭ければ広くしたりということが可能になります。 尤も、ブラウザの早急なCSSへの対応とその機能の拡張が無ければ意味がありませんが。
HTML文書作成者やユーザーは、指定したスタイルに対して重要度を指定できます。 その記述は下記のように指定し、それぞれの優先度は次のようになります。
H1 { color : blue ! important } /*H1要素のフォントカラー青を最重要指定*/ H2 { color : black } /*H2要素のフォントカラー黒を通常指定*/
スタイル同士が競合する場合、その処理の優先度などの問題もありますが、それだけでは回避できない場合もあります。 例えば、グループ化やクラスセレクタなどが緻密に設定されている場合などがそうです。 この状態に対処するために、ブラウザは次のようなアルゴリズムで処理しなければならないとされています。
実際にCSSを設計するに当たって、優先度や継承性、詳細度などを考慮に入れるべきと考えます。 つまり、あるスタイルはどの程度優先させたいのか、重要なのか、或いはユーザー任せでも良いのかなどを予め考慮する必要があります。
ここで詳細度とは、IDセレクタの数(これをA)、 クラスセレクタの数(これをB)、要素名の数(これをC)をそれぞれカウントし、その全てを十分大きな基数による記進法で数え、最も大きなものから詳細度が高いものとするものです。 言葉では分かりにくいでしょうが、下記の例を直感的に理解できれば問題ありません。
LI {}/* A=0 B=0 C=1 : 詳細度 = 1 */ UL LI {}/* A=0 B=0 C=2 : 詳細度 = 2 */ UL UL LI {}/* A=0 B=0 C=3 : 詳細度 = 3 */ LI.class {}/* A=0 B=1 C=1 : 詳細度 = 11 */ UL LI.class {}/* A=0 B=1 C=2 : 詳細度 = 12 */ #id {}/* A=1 B=0 C=0 : 詳細度 = 100 */ UL LI#id {}/* A=1 B=0 C=2 : 詳細度 = 102 */