Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Эта статья также участвует "Проект "Звезда раскопок"" , чтобы выиграть творческие подарочные пакеты и бросить вызов творческим поощрениям
предисловие
Когда мы используем сторонние плагины в обычных проектах разработки, мы должны использовать некоторые компоненты element-ui. Когда нам нужно изменить стиль, нам всегда нужно добавить селектор /deep/depth. Раньше я знал, как использую его, но я не знаю его принципа. Кроме того, в стиль каждого компонента обычно добавляется scoped, но конкретного его принципа я не знаю. Сегодня я возьму вас, чтобы понять и понять
1. Принципы ограниченного CSS
1.1 Разница
Давайте сначала посмотрим на отсутствие настроекScopedс настройкамиScopedв чем разница
нет настройкиScoped
<div class="login">登录</div>
<style>
.login {
width: 100px;
height: 100px
}
</style>
Результат после упаковки точно такой же, как и у нашего кода, разницы нет.
настраиватьScoped
<div class="login">登录</div>
<style scoped>
.login {
width: 100px;
height: 100px
}
</style>
Результат после упаковки отличается от нашего кода. следующим образом:
<div data-v-257dda99b class="login">登录</div>
<style scoped>
.login[data-v-257dda99b] {
width: 100px;
height: 100px
}
</style>
В приведенном выше примере нетрудно найти дополнительный атрибут data-v-hash, что означает добавление области действия, PostCSS добавляет уникальный динамический атрибут ко всем доменам в компоненте, а затем добавляет дополнительные селекторы CSS. Используется соответствующий селектор атрибутов. чтобы выбрать дом в компоненте.Этот подход заставляет стиль воздействовать только на дом, содержащий атрибут - внутренний дом компонента, чтобы стили между компонентами не загрязняли друг друга.
1.2 Принцип
Идея реализации стиля Vue Scoped CSS выглядит следующим образом:
- Создайте идентификатор для каждого экземпляра компонента (примечание: это экземпляр компонента, а не класс компонента), который может однозначно идентифицировать экземпляр компонента, который я называю идентификатором экземпляра компонента, именуемым идентификатором экземпляра и обозначаемым InstanceID. ;
- Добавьте атрибут label к элементу Dom, соответствующему каждой метке в шаблоне компонента (элемент Dom, соответствующий метке компонента, является корневым элементом компонента) в формате
data-v-实例标识, пример:<div data-v-e0f690c0="" >; - Стили с заданной областью для компонентов
<style scoped>Наконец, селектор каждого селектора увеличивает селектор атрибута原选择器[data-v-实例标识], пример: предположим, что исходный селектор.cls #id > div, измененный селектор.cls #id > div[data-v-e0f690c0];
1.3 Особенности
-
Область действия стиля компонента ограничена меткой самого компонента, то есть: внутри компонента включена корневая метка подкомпонента, но другие метки, кроме корневой метки подкомпонента, не включены; поэтому селектор CSS компонента не может быть выбран Элементы в дочерних компонентах и компонентах-потомках (кроме корневого элемента дочернего компонента);
Поскольку он добавляет селектор атрибута к последней селекторной ячейке селектора
[data-v-实例标识], а селектор атрибутов может выбирать только теги в текущем шаблоне компонента, а для подкомпонентов только корневой элемент имеет атрибуты тегов, которые могут представлять подкомпоненты.data-v-子实例标识, и есть свойство знака, которое может представлять текущий компонент (родительский компонент)data-v-父实例标识, другие некорневые элементы дочернего компонента, только атрибут метки, который может представлять дочерний компонентdata-v-子实例标识; -
Если у рекурсивного компонента есть селектор потомков, селектор нарушит ограничение подкомпонента, упомянутое в функции 1, тем самым выбрав средний элемент рекурсивного подкомпонента;
Причина: предположим, что стиль области действия рекурсивного компонента A имеет селекторы с селекторами-потомками.
div p, то в каждой рекурсии будет создаваться новый экземпляр компонента для этой рекурсии, а также для экземпляра будет генерироваться соответствующий селектор.div p[data-v-当前递归组件实例的实例标识], для всех, кроме первого рекурсивного экземпляра рекурсивного компонента, хотяdiv p[data-v-当前递归组件实例的实例标识]не будет выбирать элементы p в экземплярах дочерних компонентов (экземплярах рекурсивных дочерних компонентов) (по особым причинам, описанным в функции 1), но выберет все элементы p в текущем экземпляре компонента, поскольку экземпляр родительского компонента (экземпляр рекурсивного родительского компонента ) имеет соответствующий элемент div;
2. Принцип >>>, /deep/, ::v-глубокий селектор
2.1 Пример
Пример, встречающийся в реальной разработке: когда мы разрабатываем страницу, использующую подкомпонент, если нам нужно изменить стиль подкомпонента в это время, но это не влияет на другие страницы, использующие стиль подкомпонента. Например:
Родительский компонент: Parent.vue
<template>
<div class="parent" id="app">
<h1>我是父组件</h1>
<div class="gby">
<p>我是一个段落</p>
</div>
<child></child>
</div>
</template>
<style scoped>
.parent {
background-color: green;
}
.gby p {
background-color: red;
}
// 把子组件的背景变成红色,原组件不变
.child .dyx p {
background-color: red;
}
</style>
Дочерний компонент: Child.vue
<template>
<div class="child">
<h1>我是子组件</h1>
<div class="dyx">
<p>我是子组件的段落</p>
</div>
</div>
</template>
<style scoped>
.child .dyx p {
background-color: blue;
}
</style>
Тогда мы обнаружим, что это не имеет никакого эффекта. Но если мы используем>>>,/deep/,::v-deepМожет быть реализован один из трех селекторов глубины. см. код:
<template>
<div class="parent" id="app">
<h1>我是父组件</h1>
<div class="gby">
<p>我是一个段落</p>
</div>
<child></child>
</div>
</template>
<style scoped>
.parent {
background-color: green;
}
.gby p {
background-color: red;
}
// 把子组件的背景变成红色,原组件不变
::v-deep .child .dyx p {
background-color: red;
}
</style>
2.2 Принцип
Если вы хотите, чтобы селектор в стиле области действия мог выбирать элементы в подгруппе или компоненте-потомке, мы можем использовать深度作用选择器, его можно записать тремя способами:
-
>>>, пример:.gby div >>> #dyx p -
/deep/, пример:.gby div /deep/ #dyx pили.gby div/deep/ #dyx p -
::v-deep, пример:.gby div::v-deep #dyx pили.gby div::v-deep #dyx p
Его принцип в основном такой же, как у Scoped CSS, но третий шаг немного отличается (первые два шага одинаковы):
- Создайте идентификатор для каждого экземпляра компонента (примечание: это экземпляр компонента, а не класс компонента), который может однозначно идентифицировать компонент, я называю его идентификатором экземпляра, обозначаемым как InstanceID;
- Добавьте атрибут label к элементу Dom, соответствующему каждой метке в шаблоне компонента (элемент Dom, соответствующий метке компонента, является корневым элементом компонента) в формате
data-v-实例标识, пример:<div data-v-e0f690c0="" >; - Стили с заданной областью для компонентов
<style scoped>Каждый селектор действия глубины, предшествующий блоку селектора, добавляет селектор атрибута.[data-v-实例标识], пример: предположим, что исходный селектор.cls #id >>> div, измененный селектор.cls #id[data-v-e0f690c0] div;
Поскольку Vue не добавляет селекторы атрибутов в ячейки селекторов за селекторами глубокого действия.[data-v-实例标识], поэтому следующий модуль селектора может выбирать элементы в дочерних компонентах и компонентах-потомках;
Это конец этой статьи. Позвольте мне рассказать о моих личных привычках использования. Лично я предпочитаю использовать его.
::v-deepУ этого селектора глубины все-таки наилучшая совместимость.Его уже кастрировали два других, поэтому я не решаюсь его использовать. Я тоже записал опыт питтинга, а заинтересованные друзья могут глянуть.Станет ли решение проблем (ям), с которыми сталкивается плагин sass, необходимым знанием для фронтенда?