, поскольку .mat-form-field-infix имеет фиксированную ширину 180px, нет способа уменьшить размер поля формы до 180px.неизбежно .mat-form-field-infix должен быть переопределен.
вы можете получить тот же результат с помощью :: ng-deep двумя способами;
1.отключить инкапсуляцию представления для этогоконкретный компонент.Однако у этого подхода есть огромный недостаток, заключающийся в том, что все стили в вашем компоненте становятся глобальными, поэтому их необходимо тщательно контролировать.
@Component({
selector: 'app-co-input-field',
templateUrl: './co-input-field.component.html',
styleUrls: ['./co-input-field.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CoInputFieldComponent {}
, а затем в co-input-field.component.scss
вы делаете следующее
app-co-input-field {
.mat-form-field-infix {
width: auto !important;
}
// all other component styles goes in here
// in order to keep them isolated from global scope
}
2.не отключать инкапсуляцию вида.используйте селектор элемента родительского компонента в глобальных стилях.
вставьте следующее в styles.scss
app-co-input-field {
.mat-form-field-infix {
width: auto !important;
}
// co-input-field.component.scss still can be used for encapsulated styles
}
3. не отключайте инкапсуляцию вида.определите глобальное правило для этой конкретной ситуации.
поместите следующее в styles.scss
.shrinking-mat-form-field {
.mat-form-field-infix {
width: auto !important;
}
}
и примените класс .shrinking-mat-form-field
к соответствующему элементу
<mat-form-field style="width: 100%" class="shrinking-mat-form-field">
<input matInput placeholder="placeholder" />
<mat-hint align="end">hint text</mat-hint>
</mat-form-field>
Хотя второй и третий подходы в основном совпадают, я лично предпочитаю третий подход, чтобы сделать его читаемым, обеспечить его согласованность с проектом, иметь минимальные побочные эффекты и управлять ими из одной точки.