#css #angular #typescript #angular2-template #css-specificity
#css #angular #typescript #angular2-template #специфичность css
Вопрос:
В блоке styles моего компонента верхнего уровня я определяю /deep/
класс css, который задает поля для любых элементов, которые будут отображаться в его ng-контенте. Как я могу сделать так, чтобы этот css-класс имел приоритет — даже если дочерний компонент применяет свой собственный css-класс, у которого определены разные поля.
Например:
ParentComponent.ts:
@Component({
selector: 'my-parent',
styles: [`
/deep/ .child-item { /* I WANT THIS TO TAKE PRECEDENCE */
margin-right: 10px;
margin-left: 10px;
}
`],
template: `
<div>
<ng-content></ng-content>
<div>
`
})
export class ParentComponent {}
Дочерний компонент.ts
@Component({
selector: 'my-child',
styles: [`
.less-important-class { /* THESE MARGINS SHOULD BE IGNORED IN CONFLICTS */
margin-right: 5px;
margin-left: 5px;
background-color: rgba(255, 0, 0, 1.0);
}
`],
template: `
<button type="button" class="less-important-class child-item">My Little Button</button>
`
})
export class ChildComponent {}
Я думаю, поскольку дочерний элемент появляется первым в скомпилированной таблице стилей, менее важный класс обладает более высокой специфичностью css и выигрывает в любых конфликтах между двумя классами. Как я могу присвоить дочернему элементу более высокий приоритет?
Комментарии:
1. Как всегда, вы можете присвоить правилам, которые принадлежат менее конкретному селектору (deep), более высокий приоритет
!important
.2. добавление !important в этом случае не помогает, потому что способ работы angular гарантирует, что стили дочерних компонентов имеют приоритет, что бы вы ни делали.
3. Я обнаружил, что использование
:host
селектора перед моим/deep/
классом css дало этому классу приоритет над классами css, определенными в дочерних компонентах. До тех пор, пока эти компоненты также не использовали:host
селектор.
Ответ №1:
/deep/ используется для переопределения родительского стиля, поэтому, допустим, вы хотите изменить поле div в parent, вы можете использовать /deep/ {margin: **px}
Насколько я знаю, вы определяете стили в дочернем компоненте, когда не хотите, чтобы родительский компонент вмешивался в стили дочерних компонентов. Если вы хотите, чтобы родительский стиль имел приоритет, я бы сказал, не определяйте эти стили в дочернем. Это означает, что в вашем случае не указывайте поля в стилях, определенных в дочернем компоненте.
Другой способ — не определять эти стили ни в родительском, ни в дочернем элементах, а создать новую глобальную таблицу стилей и добавить туда только глобальные стили, конечно, вам нужно ссылаться на эту таблицу стилей index.html Поэтому в вашем случае я бы удалил margin из стилей как родительского, так и дочернего и добавил его в файл styles.css и сослалсяstyles.css в index.html
Комментарии:
1. В документации говорится
We can use the /deep/ selector to force a style down through the child component tree into all the child component views. The /deep/ selector works to any depth of nested components, and it applies both to the view children and the content children of the component.
2. Но я понимаю, что вы говорите. Моя проблема в том, что иногда дочерний компонент появляется за пределами родительского компонента, и когда это происходит, поля должны быть разными. Поэтому я надеялся, что родительский элемент изменит их, если внутри него появится дочерний элемент.
3. Что ж, в таком случае, я думаю, наличие контейнера в родительском, окружающем дочерний компонент, должно помочь вам применить поля.