Добавление элемента стиля в другой элемент и применение стилей только к родительскому элементу?

#html #css

Вопрос:

Предположим, сгенерированный фрагмент HTML и CSS, где CSS не должен применяться за пределами фрагмента.

 <div class="text">I am outside and should not be red.</div>
<div>
  <div class="text">I am inside and should be red.</div>

  <style type="text/css">
    .text {
      color: red;
    }
  </style>
</div>
 

Который производит:

пример

Как можно <style> изменить тег, чтобы он применялся только к содержащему его элементу ( <div> ) и его дочерним элементам? Учтите, что уникальный идентификатор/класс не может быть использован, поэтому это решение в данном случае недопустимо, хотя оно, естественно, приведет к желаемому результату:

 <div class="text">I am outside and should not be red.</div>
<div class="sandbox">
  <div class="text">I am inside and should be red.</div>

  <style type="text/css">
    .sandbox .text {
      color: red;
    }
  </style>
</div>
 

HTML и стиль (и JS) будут введены отдельно, будут завернуты и введены в DOM по желанию. Таким образом, цель состоит в том, чтобы этот введенный фрагмент был «изолирован» от внешнего элемента фрагмента. И я не хочу зависеть от автора, чтобы правильно применять уникальные селекторы ко всем своим классам CSS-вы знаете, потому что люди совершают ошибки. Вместо этого я хочу автоматически ограничить область внутри фрагмента сгенерированным родительским элементом, который его содержит.

Предположим, что «кусок» выглядит так, как показано ниже:

 <div class="text">I am inside and should be red.</div>

<style type="text/css">
  .text {
    color: red;
  }
</style>
 

«Сервер» вернет завернутый кусок, подобный этому (обратите внимание на обертку <div> ).:

 <div>
  <div class="text">I am inside and should be red.</div>

  <style type="text/css">
    .text {
      color: red;
    }
  </style>
</div>
 

Часть, которая отсутствует, — это то, как «охватить» любые <style> элементы внутри фрагмента, чтобы они применялись только к оболочке.

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

Комментарии:

1. Может быть, теневой дом?

2. что вы можете изменить (если вы не можете добавить пользовательский класс/идентификатор)? ты можешь просто сделать что-нибудь вроде div>div.text.... этого ?

3. Я полагаю, что в данном конкретном случае вы могли бы использовать div>div.text или .text:первый тип или .text:последний тип или множество n-го селектора. но если это масштабирование, а не только для этого примера, это может быть немного сложнее.

4. HTML и стиль (и JS) будут введены отдельно, будут завернуты и введены в DOM по желанию. Таким образом, цель состоит в том, чтобы этот введенный фрагмент был «изолирован» от внешнего элемента фрагмента. И я не хочу зависеть от автора, чтобы правильно применять уникальные селекторы ко всем своим классам CSS-вы знаете, потому что люди совершают ошибки. Вместо этого я хочу автоматически ограничить область <style> внутри фрагмента сгенерированным родительским элементом, который его содержит.

5. В отсутствие scoped, я думаю, вам придется прибегнуть к JS — это будет разрешено?

Ответ №1:

Просто используйте дочерний комбинатор, > :

 div > div.text {
  color: red;
} 
 <div class="text">I am outside and should not be red.</div>
<div>
  <div class="text">I am inside and should be red.</div>
</div> 

Вы могли бы стать еще более конкретными, используя комбинаторы sibling ( ) и child ( > ) вместе:

 div.text div>div.text {
  color: red;
} 
 <div class="text">I am outside and should not be red.</div>
<div>
  <div class="text">I am inside and should be red.</div>
</div> 

Комментарии:

1. Я, вероятно, был недостаточно ясен в этом вопросе. Пожалуйста, ознакомьтесь с моим пояснительным комментарием (также обновляющим текст вопроса).

2. Обратите внимание, что тот, кто редактировал вопрос, чтобы разделить HTML/CSS, изменил смысл вопроса. Я отменил это изменение.