CSS: выберите элемент, только если существует более поздний брат

В моей структуре HTML я настроил ее так:

<body>
   <main>
      <section>
      ...
      </section>

      <aside>
      ...
      </aside>
   </main>
</body>

Проблема заключается не в всех страницах <aside>

Мне нужно выбрать <section> и дать ему max-width: 500px; ТОЛЬКО, когда <aside> присутствует. По умолчанию используется section { max-width: 1000px; } (если <aside> отсутствует)

В отличие от Селектора для одного тега, за которым следует другой тег; пользователь [задающий вопрос] хочет стилизовать "B" ВСЕ ВРЕМЯ. Кроме того, в этом вопросе пользователь хочет выбрать "B" (не "A" )


  • Мне нужно стирать <section> ТОЛЬКО, если присутствует <aside>.
  • Я не могу изменить порядок HTML > _ <
  • Можно ли это сделать только с помощью CSS?
  • Какой селектор мне нужен или как его настроить?
  • Если это невозможно сделать с CSS (я скорее это только CSS), как я могу это сделать?

Ответ 1

Утонченный маленький трюк

Вы можете добиться того, чего хотите, используя трюк, чтобы проверить , если элемент <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=110


Общие сведения о селекторах для сиблинга

Вот селектор +, который выберет брата, который появится сразу после элемента (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> и используя селектор sibling.

Вот пример: http://jsfiddle.net/Ljm323qb/1/

Быстрый взгляд в будущее
Вскоре это будет возможно, с новым псевдо-классом :has (http://dev.w3.org/csswg/selectors-4/#relational)
Вы можете назвать что-то вроде main:has(> aside) > section { ... }, но нам придется ждать этого, к сожалению: (

Ответ 2

Вы можете переключить класс .haveSidebar на тег body с помощью jQuery и сделать свой CSS для тега section зависимым от того, будет ли этот класс существует в теге 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');
}

Fiddle with side tag

Скриншот без тега

Обновление

Решение без calc(), используя свойство margin-left

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;
}

Fiddle without calc()

Ответ 3

БЕЗ JAVASCRIPT

Если вы можете изменить порядок своих элементов html на:

<body>
   <main>
      <aside>
      ...
      </aside>

      <section>
      ...
      </section>
   </main>
</body>

Вы можете сделать это так, используя селектор:

aside ~ section {
    max-width: 500px;
}

Ответ 4

Несмотря на то, что это не самый аккуратный способ сделать что-то, вы можете запускать функцию javascript, готовящуюся к документу, чтобы проверить, существует ли в стороне тег, и вставлять встроенный css в тег раздела соответственно.

Ответ 5

Было бы довольно просто выполнить это с помощью 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>

Ответ 6

Попробуйте это, я считаю, что это можно сделать только с помощью javascript.

if ($('main').find('aside').length>0)
{
    $('main').find('section').addClass('specificSection');
}

Ответ 7

В CSS есть смежные селекторные функции: http://www.w3.org/TR/CSS21/selector.html#adjacent-selectors

section + aside { ... }

Это поддерживается всеми современными браузерами, включая IE8 + И будьте осторожны: селектор соответствует, если раздел и в стороне имеют один и тот же родительский элемент в дереве документов, а раздел сразу предшествует

Если это не сработает для вас, вы можете попробовать JavaScript с помощью jQuery:

if($('aside').length)) $('section').addClass('specificSection');

Затем добавьте все свои стили в класс .specificSeciton '.

Ответ 8

Если у вас есть возможность отложить свой элемент до раздела 1, вы можете использовать смежные селекторные ролики:

aside + section{ max-width: 500px }

Ответ 9

Используя jQuery, вы можете попробовать что-то вроде:

if($('aside')) $('section').css('max-width','500px');

Только с использованием CSS, у вас может быть другой стиль для типа страницы, в который включено приложение, и как-то только включить этот стиль на эти страницы. Вы можете поместить этот стиль в небольшую таблицу стилей и включить его там, где это необходимо, что, вероятно, является более чистым способом сделать это, чем отображать страницу, а затем изменить ее с помощью JavaScript.