У меня есть родительский компонент:
<parent></parent>
И я хочу заполнить эту группу дочерними компонентами:
<parent>
<child></child>
<child></child>
<child></child>
</parent>
Родительский шаблон:
<div class="parent">
<!-- Children goes here -->
<ng-content></ng-content>
</div>
Детский шаблон:
<div class="child">Test</div>
Поскольку parent
и child
являются двумя отдельными компонентами, их стили привязаны к собственной области видимости.
В моем родительском компоненте я попытался сделать:
.parent .child {
// Styles for child
}
Но .child
стили не применяются к child
компонентам.
Я попытался использовать styleUrls
для включения parent
таблицы стилей в child
компонент для решения проблемы области:
// child.component.ts
styleUrls: [
'./parent.component.css',
'./child.component.css',
]
Но это не помогло, также попробовал другой способ, загрузив child
таблицу стилей, parent
но это тоже не помогло.
Так как же стилизовать дочерние компоненты, которые включены в родительский компонент?
css
angular
angular-components
Chrillewoodz
источник
источник
Ответы:
Обновление - Новейший путь
Не делай этого, если можешь этого избежать. Как отмечает Девон Санс в комментариях: эта функция, скорее всего, будет устаревшей.
Обновление - новый путь
Начиная с версии Angular 4.3.0 , все комбинаторы для пирсинга CSS устарели. Команда Angular представила новый комбинатор
::ng-deep
(все еще на экспериментальном уровне, а не полным и окончательным способом), как показано ниже,ДЕМО: https://plnkr.co/edit/RBJIszu14o4svHLQt563?p=preview
Старый способ
Ты можешь использовать
encapsulation mode
и / илиpiercing CSS combinators >>>, /deep/ and ::shadow
рабочий пример: http://plnkr.co/edit/1RBDGQ?p=preview
источник
::ng-deep
сейчас устарела , я не рекомендую использовать его в будущих приложенияхОБНОВЛЕНИЕ 3:
::ng-deep
также считается устаревшим, что означает, что вы больше не должны этого делать. Неясно, как это влияет на вещи, где вам нужно переопределить стили в дочерних компонентах из родительского компонента. Мне кажется странным, если это будет удалено полностью, потому что как это повлияет на вещи как библиотеки, где вам нужно переопределить стили в компоненте библиотеки?Прокомментируйте, если у вас есть понимание этого.
ОБНОВЛЕНИЕ 2:
С тех пор
/deep/
и все остальные теневые пирсинг селекторы теперь устарели. Угловой упал,::ng-deep
который следует использовать вместо для более широкой совместимости.ОБНОВИТЬ:
Если вы используете Angular-CLI, вам нужно использовать
/deep/
вместо этого,>>>
иначе он не будет работать.ОРИГИНАЛ:
После перехода на страницу Github на Angular2 и случайного поиска «style» я нашел этот вопрос: Angular 2 - styleHTML
Который сказал, чтобы использовать то, что было добавлено в
2.0.0-beta.10
,>>>
и::shadow
селекторы.Так просто делаешь
В
parent
российском файле стилей решена проблема. Обратите внимание, что, как указано в приведенной выше цитате, это решение является промежуточным, пока не поддерживается более продвинутый межкомпонентный стиль.источник
Вы не должны использовать
::ng-deep
, это устарело. В Angular правильным способом изменить стиль дочернего компонента от родительского является использованиеencapsulation
(прочитайте предупреждение ниже, чтобы понять последствия):И тогда вы сможете изменять css форму вашего компонента без необходимости из :: ng-deep
ВНИМАНИЕ: при этом все правила CSS, которые вы пишете для этого компонента, будут глобальными.
Чтобы ограничить область действия вашего css только этим компонентом, добавьте класс css в верхний тег вашего компонента и поместите ваш css «внутри» этого тега:
Scss файл:
источник
::ng-deep
. Как правило, компоненты в любом случае имеют свой собственный селектор (<my-component>, <div my-component>
и т. Д.), Поэтому нет необходимости в элементе-обертке со специальным классом.К сожалению, кажется, что / deep / selector устарел (по крайней мере, в Chrome) https://www.chromestatus.com/features/6750456638341120
Короче говоря, похоже, что (в настоящее время) нет долгосрочного решения, кроме как каким-то образом заставить ваш дочерний компонент динамически стилизовать вещи.
Вы можете передать объект стиля своему ребенку и применить его через:
<div [attr.style]="styleobject">
Или, если у вас есть определенный стиль, вы можете использовать что-то вроде:
<div [style.background-color]="colorvar">
Дополнительные обсуждения, связанные с этим: https://github.com/angular/angular/issues/6511
источник
Возникла та же проблема, поэтому, если вы используете angular2-cli с scss / sass, используйте «/ deep /» вместо «>>>», последний селектор еще не поддерживается (но отлично работает с css).
источник
Если вы хотите быть более нацеленным на фактический дочерний компонент, чем вы должны сделать следующее. Таким образом, если другие дочерние компоненты имеют одинаковое имя класса, они не будут затронуты.
Plunker: https://plnkr.co/edit/ooBRp3ROk6fbWPuToytO?p=preview
Например:
Надеюсь это поможет!
codematrix
источник
На самом деле есть еще один вариант. Что довольно безопасно. Вы можете использовать ViewEncapsulation.None, но поместите все стили вашего компонента в его тег (он же селектор). Но в любом случае всегда предпочитайте какой-нибудь глобальный стиль плюс инкапсулированные стили.
Вот модифицированный пример Дениса Рыбалки:
источник
Есть несколько вариантов для достижения этой цели в Angular:
1) Вы можете использовать глубокие селекторы CSS
2) Вы также можете изменить инкапсуляцию вида, для нее установлено значение Эмуляция по умолчанию, но ее можно легко изменить на Native, который использует реализацию собственного браузера Shadow DOM, в вашем случае вам просто нужно отключить ее.
Например:
источник
Не следует писать правила CSS для дочерних элементов компонента в родительском компоненте, поскольку компонент Angular является автономной сущностью, которая должна явно декларировать то, что доступно для внешнего мира. Если в будущем дочерний макет изменится, ваши стили для элементов этого дочернего компонента, разбросанных по файлам SCSS других компонентов, могут легко сломаться, что сделает ваш стиль очень хрупким. Это то что
ViewEncapsulation
для CSS. В противном случае было бы то же самое, если бы вы могли присваивать значения частным полям некоторого класса из любого другого класса в объектно-ориентированном программировании.Поэтому вам нужно определить набор классов, которые вы можете применить к дочернему элементу хоста, и реализовать, как дочерний элемент реагирует на них.
Технически это можно сделать следующим образом:
Другими словами, вы используете
:host
псевдо-селектор, предоставляемый Angular + набор CSS-классов, чтобы определить возможные дочерние стили в самом дочернем компоненте. Затем у вас есть возможность запускать эти стили извне, применяя предопределенные классы к<child>
элементу хоста.источник
parent.component.scss
связанных со стилем дочернего компонента. Это единственная цель этого подхода. Зачем вам нуженparent.component.scss
?ViewEncapsulation
только потому, что его значение по умолчанию - то, что приводит к вопросу OP. Вам не нужно присваивать другойViewEncapsulation
код для работы вышеуказанного кода.Я считаю намного чище передавать переменную @INPUT, если у вас есть доступ к коду дочернего компонента:
Идея состоит в том, что родитель сообщает ребенку, каким должно быть его состояние внешнего вида, а ребенок решает, как отобразить это состояние. Это хорошая архитектура
Путь SCSS:
Лучший способ: - использовать
selected
переменную:источник
На сегодняшний день (Angular 9) Angular использует Shadow DOM для отображения компонентов в виде пользовательских HTML-элементов . Одним из элегантных способов стилизации этих пользовательских элементов может быть использование пользовательских переменных CSS . Вот общий пример:
Как видно из приведенного выше кода, мы создаем пользовательский элемент, как Angular будет делать для нас с каждым компонентом, а затем переопределяем переменную, отвечающую за цвет фона в теневом корне пользовательского элемента, из глобальной области видимости. ,
В приложении Angular это может быть что-то вроде:
parent.component.scss
ребенок-element.component.scss
источник
Быстрый ответ: вам вообще не следует этого делать. Это нарушает инкапсуляцию компонентов и подрывает выгоду, которую вы получаете от автономных компонентов. Подумайте о том, чтобы передать флаг пропуска дочернему компоненту, тогда он сам может решить, как визуализировать по-другому или применить другой CSS, если это необходимо.
Angular осуждает все способы воздействия на дочерние стили от родителей.
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
источник
У меня также была эта проблема, и я не хотел использовать устаревшее решение, поэтому я закончил с:
в отрыве
дочерний компонент
у ребенка в HTML Div
и в коде
работает как положено и не должно быть устаревшим;)
источник
По мере обновления интернета я сталкивался с решением.
Сначала несколько предостережений.
Во-первых, пометьте инкапсуляцию вашего дочернего компонента как теневую, чтобы он отображался в реальной теневой области. Во-вторых, добавьте атрибут part к элементу, который вы хотите разрешить родительскому стилю. В таблице стилей компонента вашего родителя вы можете использовать метод :: part () для доступа
источник
Я предлагаю пример, чтобы сделать его более понятным, так как angular.io/guide/component-styles заявляет:
В случае необходимости
app.component.scss
импортируйте ваш файл*.scss
._colors.scss
имеет некоторые общие значения цвета:Применить правило ко всем компонентам
Все кнопки, имеющие
btn-red
класс, будут стилизованы.Применить правило к одному компоненту
Все кнопки, имеющие
btn-red
класс дляapp-login
компонента, будут стилизованы.источник
Я решил это за пределами Angular. Я определил общий scss, который я импортирую своим детям.
shared.scss
child.scss
Мой предложенный подход - это способ решить проблему, о которой спрашивал ОП. Как уже неоднократно упоминалось, :: ng-deep,: ng-host будет устаревать, и отключение инкапсуляции - это слишком большая утечка кода, на мой взгляд.
источник