Применение CSS из компонента Angular к подкомпоненту

У нас есть собственная библиотека компонентов Angular (один проект), каждый компонент имеет базовые стили.

Мы используем эту библиотеку в нашем приложении (другой проект).

Компонент в приложении содержит компонент из нашей библиотеки.

Из глобального файла styles.scss в приложении я могу легко настроить таргетинг на элементы в библиотечном компоненте.

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

приложение-component.html

<div class = "outter">
  <library-component specificityattr></library-component>
</div>

библиотека-component.html

<div class = "generic-styles">
  <p class = "hello">Hello</p>
</div>

приложение-component.scss

library-component[specificityattr] p.hello {
    background: red;
}

стили.scss

library-component[specificityattr] p.hello {
    background: green;
}

Без селектора в styles.scss я ожидаю, что тег P будет иметь красный фон. Только когда я помещаю тот же селектор в styles.scss, я получаю зеленый фон.

Как это терпит неудачу?

Каков правильный способ стилизации подкомпонентов компонентов?

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
0
4 808
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш компонент :host - это th library-component, и вы хотите применить CSS к некоторым "глубоким" DOMS, поэтому это означает :ng-deep

Вот рабочий пример

Использовать

:host library-component[specificityattr] ::ng-deep p.hello {
    background: green;
}

скажите мне для получения дополнительной помощи

לבני מלכה 28.05.2019 13:37

Спасибо - я нашел время, чтобы прочитать эту страницу: blog.angular-university.io/angular-host-context Это помогло мне понять, что происходило выше: :host нацелен на экземпляр этого компонента, а ::ng-deep удаляет попытку нацелить этот компонент на прямое содержимое (и именно эта часть позволяет вам нацеливаться на подкомпонент) Что беспокоит, так это то, что он неопределенно помечен как «устаревший», но реализуемая идея кажется здравой. Время покажет!

Nathan 28.05.2019 16:17

То, что вы испытываете, является эффектом компонентов по умолчанию ViewEncapsulation в Angular.

Когда вы определяете компонент, как показано ниже, инкапсуляция представления компонента будет значением по умолчанию, которое я включил в комментарий. Это означает, что Angular не будет создавать так называемый «теневой DOM» для вашего компонента, и все стили будут применяться только к вашему компоненту.

Инкапсулированный компонент

@Component({
    selector: 'my-component',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css'],
    //encapsulation: ViewEncapsulation.Emulated
})

Если вместо этого вы хотите применить стили не только к вашему компоненту, вы можете указать конкретный ViewEncapsulation в объявлении вашего компонента. Использование ViewEncapsulation.None переместит стили в заголовок DOM, но все равно не создаст теневой DOM.

Без инкапсуляции

@Component({
    selector: 'my-component',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css'],
    encapsulation: ViewEncapsulation.None
})

Взгляните на этот пример StackBlitz

Важно иметь в виду, что ViewEncapsulation.None будет "утечка" ваших стилей для других компонентов, что, в свою очередь, усложнит стилизацию вашего приложения, если вы точно не знаете, где определены ваши стили.

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

Nathan 28.05.2019 16:25

если, он должен иметь возможность стилизовать дочерний компонент, в первую очередь основан на мнении, и я ответил на как. Вы специально спросили "Как это не удается?", на что я и ответил. Я рад, что вы нашли мой ответ полезным, но будьте более точными, если вам нужны более подходящие ответы! :)

Daniel B 28.05.2019 17:06

ты спаситель жизни, братан, проголосовал, это решило мою проблему, застрявшую в этом за последние 7 дней

Deepak Goyal 02.09.2020 10:46

Рад, что ответ был полезен, @DeepakGoyal!

Daniel B 02.09.2020 13:01

но жарко, чтобы остановить утечку css, когда мы переходим к какой-либо другой ссылке, чем ее использование на предыдущей странице css, возможно ли это, например, из url1, я использую скин2 путем инкапсуляции, но мой скин по умолчанию — skin1.css, но когда я перехожу на URL 2, он все еще использует скин2 не использую skin1.css в качестве скина по умолчанию

Deepak Goyal 16.09.2020 13:44

Другие вопросы по теме