Есть ли в CSS способ использовать «последнее определенное правило»?

#css

#css

Вопрос:

Я не уверен, как это объяснить, если не с примерами.

Допустим, у меня есть этот класс

 .padding1 {
    padding-top: 100px;
}
  

применяется к этому элементу

 <div class="myDiv padding1"></div>
  

с его собственными правилами, определенными позже, которые переопределят .padding1 правило. Как указать .myDiv , чтобы по умолчанию использовалось последнее полезное правило, определенное в .padding1?

 .myDiv {
    padding-top: 0; 
}
.specialPage .myDiv {
   padding-top: /* ignore my override */
}
  

Я знаю, что мог бы сделать это наоборот, но мне было интересно, можно ли это сделать таким образом, что может быть полезно в некоторых сложных проектах.

ОБНОВЛЕНИЕ: я, конечно, спрашивал, есть ли правило, которого мне не хватает. Я не хочу объявлять его снова и не использовать initial или inherit .

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

1. Я думаю, вы можете сделать это, добавив !important в стиль, подобный: « .padding1 { padding-top: 100px !important; } «

2. Вот документ о переопределении правил в CSS: developer.mozilla.org/en-US/docs/Web/CSS/Specificity

Ответ №1:

Я только что узнал об этом, есть возможный способ отменить использование стилей css revert-layer .

Предупреждение ⚠: По состоянию на 2022 год это ключевое слово является экспериментальным и не широко совместимым. В настоящее время только для Firefox и Firefox Android v97.

Ключевое слово revert-layer CSS возвращает значение свойства в каскадном слое к значению свойства в правиле CSS, соответствующему элементу в предыдущем каскадном слое.

Если нет другого каскадного слоя, к которому нужно вернуться для соответствующего правила CSS, значение свойства возвращается к вычисленному значению, полученному из текущего слоя. Кроме того, если в текущем слое нет соответствующего правила CSS, значение свойства для элемента возвращается к стилю, определенному в предыдущем источнике стиля.

Отличается от revert ключевого слова, которое возвращается непосредственно к настройкам браузера по умолчанию.


Дополнительные ресурсы:


Следующее должно работать (опять же, если ваш браузер совместим)

Элементы с классом ‘padding1‘ будут иметь размер заполнения 100 пикселей, если только у них также нет класса ‘myDiv‘, и в этом случае заполнение будет возвращено на 0, но если указанный элемент находится внутри родительского элемента с классом ‘specialPage‘, заполнение будет возвращено обратно на 100 пикселей.

 @layer base {
  .padding1 {
    padding-top: 100px;
  }
}

@layer special {
  .myDiv {
      padding-top: 0;
   }
  .specialPage .myDiv {
    padding-top: revert-layer;
  }
}  
 <div class="specialPage">
  <div class="myDiv padding1">Inside specialPage original padding</div>
</div>

<div class="myDiv padding1">Outside specialPage no padding</div>  

Ответ №2:

Вы можете использовать padding-top: unset; , которое полностью нейтрализует все предыдущие свойства с тем же именем для того же класса. Но для того, чтобы «перемотать» свойство, которое было раньше padding-top: 0; , вам нужно объявить его снова.

Ответ №3:

Как я понимаю, вы хотите, чтобы стиль .padding1 был реализован для обоих div. Я прав? Это можно сделать следующим образом

 <style>
   .padding1{
    padding-top: 100px !important;
}
 .myDiv {
    padding-top: 0; 
}
<style>
  

На странице HTML

 <div class="myDiv padding1"></div>
  

Теперь .myDiv будет иметь padding-top:100 пикселей;

У As .myDiv есть собственный «padding-top: 0», но он покажет «padding-top: 100 пикселей».

Надеюсь, это решит вашу проблему.

Ответ №4:

Вы могли бы использовать initial , чтобы установить для него значение по умолчанию.

     .myDiv {
        padding-top: 0;
    }

    .padding1 {
        padding-top: 100px;
    }

    .specialPage .myDiv {
        padding-top: initial;
    }