Можем ли мы наследовать пользовательскую переменную, определенную в классе другого класса? - PullRequest
2 голосов
/ 03 февраля 2020

Я изучал основы c CSS, и у меня возникла небольшая путаница. Буду признателен за любую помощь в этом. Ниже приведены два примера, демонстрирующие причину путаницы

Сценарий 1: Наследование переменной из :root

:root {
  --red-color: red;
}
.red-box {
  background: red;
  background: var(--red-color);
  height: 200px;
  width:200px;
}
<div class="red-box"></div>

Сценарий 2: Наследование переменной из другого класса. [У меня путаница с этим делом]

.penguin {

  /* change code below */
  --penguin-skin: gray;
  --penguin-belly: white;
  --penguin-beak: orange;
  /* change code above */

  position: relative;
  margin: auto;
  display: block;
  margin-top: 5%;
  width: 300px;
  height: 300px;
}

.penguin-top {
  top: 10%;
  left: 25%;
  background: var(--penguin-skin, gray);
  width: 50%;
  height: 45%;
  border-radius: 70% 70% 60% 60%;
}

.penguin-bottom {
  top: 40%;
  left: 23.5%;
  background: var(--penguin-skin, gray);
  width: 53%;
  height: 45%;
  border-radius: 70% 70% 100% 100%;
}

.right-hand {
  top: 0%;
  left: -5%;
  background: var(--penguin-skin, gray);
  width: 30%;
  height: 60%;
  border-radius: 30% 30% 120% 30%;
  transform: rotate(45deg);
  z-index: -1;
}

.left-hand {
  top: 0%;
  left: 75%;
  background: var(--penguin-skin, gray);
  width: 30%;
  height: 60%;
  border-radius: 30% 30% 30% 120%;
  transform: rotate(-45deg);
  z-index: -1;
}

.right-cheek {
  top: 15%;
  left: 35%;
  background: var(--penguin-belly, white);
  width: 60%;
  height: 70%;
  border-radius: 70% 70% 60% 60%;
}

.left-cheek {
  top: 15%;
  left: 5%;
  background: var(--penguin-belly, white);
  width: 60%;
  height: 70%;
  border-radius: 70% 70% 60% 60%;
}

.belly {
  top: 60%;
  left: 2.5%;
  background: var(--penguin-belly, white);
  width: 95%;
  height: 100%;
  border-radius: 120% 120% 100% 100%;
}

.right-feet {
  top: 85%;
  left: 60%;
  background: var(--penguin-beak, orange);
  width: 15%;
  height: 30%;
  border-radius: 50% 50% 50% 50%;
  transform: rotate(-80deg);
  z-index: -2222;
}

.left-feet {
  top: 85%;
  left: 25%;
  background: var(--penguin-beak, orange);
  width: 15%;
  height: 30%;
  border-radius: 50% 50% 50% 50%;
  transform: rotate(80deg);
  z-index: -2222;
}

.right-eye {
  top: 45%;
  left: 60%;
  background: black;
  width: 15%;
  height: 17%;
  border-radius: 50%;
}

.left-eye {
  top: 45%;
  left: 25%;
  background: black;
  width: 15%;
  height: 17%;
  border-radius: 50%;
}

.sparkle {
  top: 25%;
  left: 15%;
  background: white;
  width: 35%;
  height: 35%;
  border-radius: 50%;
}

.blush-right {
  top: 65%;
  left: 15%;
  background: pink;
  width: 15%;
  height: 10%;
  border-radius: 50%;
}

.blush-left {
  top: 65%;
  left: 70%;
  background: pink;
  width: 15%;
  height: 10%;
  border-radius: 50%;
}

.beak-top {
  top: 60%;
  left: 40%;
  background: var(--penguin-beak, orange);
  width: 20%;
  height: 10%;
  border-radius: 50%;
}

.beak-bottom {
  top: 65%;
  left: 42%;
  background: var(--penguin-beak, orange);
  width: 16%;
  height: 10%;
  border-radius: 50%;
}

body {
  background:#c6faf1;
}

.penguin * {
  position: absolute;
}
<div class="penguin">
      <div class="penguin-bottom">
        <div class="right-hand"></div>
        <div class="left-hand"></div>
        <div class="right-feet"></div>
        <div class="left-feet"></div>
      </div>
      <div class="penguin-top">
        <div class="right-cheek"></div>
        <div class="left-cheek"></div>
        <div class="belly"></div>
        <div class="right-eye">
          <div class="sparkle"></div>
        </div>
        <div class="left-eye">
          <div class="sparkle"></div>

Мой вопрос:

Я ясно видел учебники, в которых упоминалось, что мы можем использовать переменные из :root в других классах, но согласно примеру в Сценарии 2 я не могу понять, как переменная наследуется от одного класса к другому? Я спрашиваю об этом, так как я не видел упомянутое специально, и я просто хочу быть уверенным в своих знаниях.

Заранее спасибо за помощь:)

1 Ответ

2 голосов
/ 03 февраля 2020

От спецификация :

Пользовательские свойства обычные свойства , поэтому они могут быть объявлены для любого элемента, разрешаются с помощью обычные правила наследования и каскада , можно сделать условными с помощью @media и других условных правил, можно использовать в атрибуте стиля HTML, можно прочитать или установить с помощью CSSOM, et c.

А также:

Наследуется: да

Так что речь идет не о наследовании от другого класса, а об обычном наследовании от родителя (или ancestor) точно так же, как и любое унаследованное свойство.

В вашем случае penguin-top является дочерним элементом penguin, поэтому он будет наследовать свои пользовательские свойства.


Стоит отметить, что :root - это элемент html, который является предком всех элементов, поэтому все они будут логически наследовать пользовательское свойство, определенное внутри :root

...