私のHTML構造では、次のように設定しています。
<body>
<main>
<section>
...
</section>
<aside>
...
</aside>
</main>
</body>
問題は、すべてのページに<aside>
がないことです
<section>
を選択してmax-width: 500px;
を指定する必要があるのは、<aside>
が存在する場合のみです。デフォルトはsection { max-width: 1000px; }
です(<aside>
がない場合)
セレクタとは異なり、1つのタグの直後に別のタグが続きます ;ユーザー[質問]は常に「B」のスタイルを設定したいと考えています。また、この質問では、ユーザーは(「A」ではなく)「B」を選択したいと考えています。
<section>
が存在する場合のみ、<aside>
をスタイルする必要があります。_<section>
_要素が_<main>
_.の唯一の要素であるかどうかを確認するトリックを使用して、必要なことを達成できます他の要素がある場合は機能しません。あなたの場合、それはこのように動作するはずです( http://jsfiddle.net/Ljm323qb/2/ ):
_section {
max-width: 500px;
}
/* The STAR of the show */
section:only-child {
max-width: 1000px;
}
_
このコードペンに示されているように: http://codepen.io/omarjuvera/pen/ByXGyK?editors=11
要素の直後にある兄弟を選択する_+
_セレクターがあります( https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_selectors )
そして、以下のすべての兄弟を選択する_~
_セレクターがあります( https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_selectors )
_<aside>
_要素の前に_<section>
_要素を配置し、兄弟セレクターを使用することで、これを実現できます。
次に例を示します。 http://jsfiddle.net/Ljm323qb/1/
将来の概要
すぐにこれが可能になります。新しい_:has
_疑似クラス( http://dev.w3.org/csswg/selectors-4/#relational )main:has(> aside) > section { ... }
のようなものを呼び出すことができますが、残念ながらそれを待つ必要があります:(
クラス_.haveSidebar
_をbodyタグにjQueryを使用して切り替え、を作成できますsection
タグの[〜#〜] css [〜#〜]は、このクラスがbodyタグに存在するかどうかによって異なります。
[〜#〜] html [〜#〜]
_<main>
<section>
</section>
<aside>
</aside>
</main>
_
[〜#〜] css [〜#〜]
_main {
width:100%;
}
main aside {
width:300px;
background:red;
min-height:300px;
float:left;
}
main section {
width:100%;
background:green;
min-height:300px;
float:left;
}
body.haveSidebar main section {
width: calc(100% - 300px);
}
_
[〜#〜] js [〜#〜]
_var sideBar = $('body > main > aside');
if (sideBar.length > 0) {
$('body').addClass('haveSidebar');
} else {
$('body').removeClass('haveSidebar');
}
_
更新
_margin-left
_プロパティを使用して、calc()
を使用しないソリューション
_main aside {
width:300px;
background:red;
min-height:300px;
position:relative;
}
main section {
width:100%;
background:green;
min-height:300px;
float:left;
}
.haveSidebar main section {
margin-left:301px;
}
_
<body>
<main>
<aside>
...
</aside>
<section>
...
</section>
</main>
</body>
aside ~ section {
max-width: 500px;
}
これは最も簡単な方法ではありませんが、ドキュメント対応のJavaScript関数を実行して、サイドタグが存在するかどうかを確認し、それに応じてインラインCSSをセクションタグに挿入できます。
JavaScriptでこれを達成するのはかなり簡単です。
たとえば、これは動作します:
<script>
window.onload = function() {
if (document.getElementsByTagName('aside')[0]) {
document.getElementsByTagName('section')[0].style.max-width = '500px';
} else {
document.getElementsByTagName('section')[0].style.max-width = '1000px';
}
}
</script>
これを試してください、それはいくつかのjavascriptでしかできないと思います。
if ($('main').find('aside').length>0)
{
$('main').find('section').addClass('specificSection');
}
CSSには隣接する兄弟セレクタがあります: http://www.w3.org/TR/CSS21/selector.html#adjacent-selectors
section + aside { ... }
これは、IE8 +を含むすべての最新のブラウザーでサポートされています。注意してください。セクションと側面がドキュメントツリーで同じ親を共有し、セクションがすぐにある場合、セレクターは一致しますが先行します。さておき
これでうまくいかない場合は、jQueryでJavaScriptを試すことができます。
if($('aside').length)) $('section').addClass('specificSection');
そして、すべてのスタイルをクラス '.specificSeciton'に追加します。
Aside要素をセクション1の前に置く可能性がある場合は、 隣接する兄弟セレクター を使用できます。
aside + section{ max-width: 500px }
JQueryを使用して、次のようなことを試すことができます。
if($('aside')) $('section').css('max-width','500px');
CSSのみを使用して、余白が含まれているページのタイプに異なるスタイルを設定し、どういうわけかそれらのページにそのスタイルのみを含めることができます。そのスタイルを独自の小さなスタイルシートに入れ、必要な場所に含めることができます。これは、ページをレンダリングしてからJavaScriptを使用して変更するよりも、おそらくよりクリーンな方法です。