Последний в родительском селекторе CSS

Самая последняя информация, которую я могу найти, это W3C Selectors Level 4 Editors Draft, но, насколько я вижу, это больше не упоминает родительский селектор.

Я знаю, что было опрос Google об этом, но это уже сейчас.

Что случилось с родительским селектором? Будет ли оно когда-либо введено или оно будет удалено?

Ответы

Ответ 1

Опрос завершился в селекторе темы (собственное имя так называемого "родительского селектора" ), заменяемого гораздо более универсальным псевдо-классом :has(), который документирован здесь (с интересным именем привязки, #relational, интересно, будет ли это приклеиваться).

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


Причина :has() более универсальна в том, что с селектором объектов в любом черновике никогда не было ясно, если в одном сложном селекторе может быть более одного селектора объектов (поскольку один комплексный селектор может иметь только один субъект) и/или если функциональные псевдоклассы, такие как :matches(), приняли селектор субъекта. Но поскольку псевдокласс является простым селектором, вы знаете, что :has() может быть принят везде, где будет принят псевдокласс.

В качестве примера это делает такие селекторы следующими теоретически возможными:

/* 
 * Select any p
 * that is a sibling of a ul
 * that has more than one li child.
 */
ul:has(> li:nth-of-type(2)) ~ p,     /* p follows ul */
p:has(~ ul:has(> li:nth-of-type(2))) /* p precedes ul */

Принимая во внимание, что, используя селектор объектов, это было бы возможно только в том случае, если :matches() принял селектор объекта, который никогда не указывался непосредственно в спецификации:

ul:matches(! > li:nth-of-type(2)) ~ p, /* p follows ul */
!p ~ ul:matches(! > li:nth-of-type(2)) /* p precedes ul */

Здесь вы также можете увидеть, почему мне не нравится имя "родительский селектор" для любой формы селектора - его можно использовать для гораздо большего.

Ответ 2

Согласно Wikipedia:

Селекторы не могут подняться

В настоящее время CSS не предлагает выбора родителя или предка элемента, который удовлетворяет определенным критериям. Селектор CSS Уровень 4, который все еще находится в статусе рабочего проекта, предлагает такой селектор, но только как часть "полного" профиля селектора, а не "быстрый" профиль, используемый в динамическом стилировании CSS. Более продвинутая схема выбора (например, XPath) позволит использовать более сложные таблицы стилей. Основные причины, по которым рабочая группа CSS ранее отвергала предложения для родительских селекторов, связаны с производительностью браузера и проблемами с постепенным рендерингом.

Как и в случае выбора селекторов уровня 4, хотя... ну, это зависит от того, когда основные браузеры поддерживают его поддержку. И когда достаточное количество пользователей обновится до этих версий браузера.

Изменить: Подробнее см. этот ответ.

Ответ 3

Ну в css нет родительского селектора. Но из-за небольшой хитрости я могу использовать .childinternal: parent {background-color: yellow} в своем локальном файле CSS, не углубляясь в jquery или javascript.

Уловка немного грязная, потому что она изменяет стиль родительского элемента (что не делает CSS) и не является настоящим псевдоклассом. Но в вашей таблице стилей CSS вы можете использовать ее как есть.

Есть два способа реализации (оба показаны). Первый - это псевдокласс: parent это можно сделать только в локальной таблице стилей, поскольку некоторые браузеры не допускают плохие псевдо-версии.

Другой - тот, который перебирает все таблицы стилей, проверяя "ссылку на класс GetParent".

Для меня это работает. Я обычно беру первый, который самый быстрый.

Решение:

$(function() {

  //First possibility when using local css file (=faster)//

  $.when($.get("your local filename.css")).done(function(response) {
    var spl = response.split(":parent");
    if (spl.length > 1) {
      var clas = $.trim((spl[0].split("}")[spl[0].split("}").length - 1]).replace(String.fromCharCode(10), '').replace(String.fromCharCode(13), ''));
      var cs = $.trim((spl[1].split("}")[0].split("{")[1]).replace(String.fromCharCode(10), '').replace(String.fromCharCode(13), ''));
      var eClas = $(clas).parent().attr('style');
      eClas = eClas == undefined ? '' : (eClas + '').toString;
      $(clas).parent().attr('style', eClas + ';' + cs);
    }
  });
});

// second possibility looping all used css files

for (var s = document.styleSheets.length - 1; s >= 0; s--) {
  var cssRules = document.styleSheets[s].cssRules || document.styleSheets[s].rules || []; // IE support
  for (var c = 0; c < cssRules.length; c++) {
    if (cssRules[c].selectorText) {
      if (cssRules[c].selectorText.indexOf('.GetParent') > -1) {
        var spl = cssRules[c].cssText.split(".GetParent");
        if (spl.length > 1) {
          var clas = $.trim((spl[0].split("}")[spl[0].split("}").length - 1]).replace(String.fromCharCode(10), '').replace(String.fromCharCode(13), ''));
          var cs = $.trim((spl[1].split("}")[0].split("{")[1]).replace(String.fromCharCode(10), '').replace(String.fromCharCode(13), ''));
          var eClas = $(clas).parent().attr('style');
          eClas = eClas == undefined ? '' : (eClas + '').toString;
          $(clas).parent().attr('style', eClas + ';' + cs);
        }
      }
    }
  }
}
.childinternal :parent {
  background-color: yellow
}

.childexternal .GetParent {
  Background-color: green
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  Not affected Main parent
  <div class="childinternal">
    <p>Not affected parent (no parent selector)</p>
  </div>
  <div class="childinternal:parent">
    <p>local css file used (:parent selector)
      <span style='color:grey;font-size:0.6em'>Only works on local files so not possible to show in this snippet
      </span>
    </p>
  </div>
</div>

<div>
  <div class="childexternal .GetParent">
    <p>external css file used (.GetParent class selector)</p>
    <div class="x"></div>
  </div>
</div>