Как изменить рост в mat-form-field с помощью appearance = "outline"?
Мне нужно уменьшить поле мат-формы.
это то, что я имею в виду, но я хочу уменьшить контроль и просто уменьшить внутренний элемент, а не поле формы мата.
можете ли вы представить картину того, что вы хотели достичь
добавил картинку...
еще один связанный вопрос здесь, stackoverflow.com/questions/59977079/…






Добавьте их в свой CSS в файле оригинальный стекблиц.
::ng-deep .mat-form-field-flex > .mat-form-field-infix { padding: 0.4em 0px !important;}
::ng-deep .mat-form-field-appearance-outline .mat-form-field-label { margin-top:-15px; }
::ng-deep label.ng-star-inserted { transform: translateY(-0.59375em) scale(.75) !important; }
ОБНОВЛЕНО: с переходом для метки...
::ng-deep .mat-form-field-flex > .mat-form-field-infix { padding: 0.4em 0px !important;}
::ng-deep .mat-form-field-label-wrapper { top: -1.5em; }
::ng-deep .mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label {
transform: translateY(-1.1em) scale(.75);
width: 133.33333%;
}
Я добавил это в свой код, это изменило поведение заполнителя.
Это сделано намеренно, из-за третьего оператора CSS в моем ответе удалите или поэкспериментируйте со значением в третьем операторе CSS, чтобы увидеть эффекты.
@StackOverflow: я также добавил эффект перехода, вы можете поиграть со значениями, чтобы получить именно тот эффект, к которому вы стремитесь.
Спасибо за код stackblitz. Это полезно для удаления лишнего заполнения. Как я могу убедиться, что высота поля матовой формы похожа на 36px?
@rainversion_3, добавьте это в css ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-thick{ height: 36px; } ::ng-deep .mat-form-field-flex > .mat-form-field-infix { border-top: 5px solid transparent; } ... дайте мне знать, если это сработает для вас.
Высота меняется, когда я навожу курсор и фокусируюсь, иначе это высота по умолчанию. Как узнать, какой класс и свойство нужно изменить? Есть ли документация на него?
высота фиксируется на 36 пикселей независимо от того, не касаетесь ли вы ее, фокусируете или наводите на нее курсор... вы можете проверить рабочую демонстрацию: stackblitz.com/edit/…
Чтобы применить указанный стиль к текущему компоненту и всем его потомкам, обязательно включите селектор :host перед ::ng-deep :) спасибо @akber за его работу как шарм :)
stackblitz не работал, задал вопрос сюда, спасибо stackoverflow.com/questions/59977079/…
::ng-deep — это устарел.
переместите свой стиль в файл styles.scss, чтобы сделать его глобальным, потому что, скорее всего, вам понадобятся одинаковые стили для всех ваших полей во всем приложении, не забудьте удалить ::ng-deep, когда вы перемещаете его в файл styles.scss, он там не требуется.
Использование решения @AkberIqbal испортило мой стиль для полей формы мата, а не outline. Также это решение не нуждается ни в каких !important;. С !important; ты уже потерялся :D.
Итак, вот безопасный способ добавить ваши глобальные стили: (кажется излишним, но я скорее сэкономлю, чем сожалею)
mat-form-field.mat-form-field.mat-form-field-appearance-outline > div.mat-form-field-wrapper > div.mat-form-field-flex > div.mat-form-field-infix { padding: 0.4em 0px }
mat-form-field.mat-form-field.mat-form-field-appearance-outline > div.mat-form-field-wrapper > div.mat-form-field-flex > div.mat-form-field-infix > span.mat-form-field-label-wrapper { top: -1.5em; }
.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label {
transform: translateY(-1.1em) scale(.75);
width: 133.33333%;
}
Итак, как вы видите. Я «выслеживаю» каждый класс, пока не найду схему! Мне нравится, когда стиль контура применяется только к полям контура..
ты знаешь ответ на это? stackoverflow.com/questions/59977079/…
Я понятия не имею, что такое "формула". Я скопировал значения из верхнего ответа. Вы можете прочитать источник github, чтобы найти подсказки.
Вот мое недавнее решение для поля высотой 32 пикселя с закругленными углами.
& .mat-form-field-wrapper {
height: 44.85px;
& .mat-form-field-flex {
height: 32px;
& .mat-form-field-outline {
$borderRadius: 25px;
height: 28px;
& .mat-form-field-outline-start {
border-radius: $borderRadius 0 0 $borderRadius;
width: 13px !important; // Override Material in-line style
}
& .mat-form-field-outline-end {
border-radius: 0 $borderRadius $borderRadius 0;
}
}
& .mat-form-field-infix {
left: 4px;
padding: 0;
top: -7px;
& .mat-form-field-label,
& .mat-input-element {
font-size: 12px;
}
& .mat-form-field-label-wrapper {
top: -1.04375em;
& .mat-form-field-label {
height: 16px;
}
}
}
}
}
Размер в библиотеке материалов основан на em(rem). Лучше не смешивать.
Смешивать и сочетать что? Используйте px, когда вы всегда хотите одного и того же размера. Используйте (r)em, когда хотите, чтобы это было относительно.
Если кто-то хочет сделать ответ Акбера Икбала классовым (чтобы были доступны оба размера):
:host ::ng-deep {
.my-custom-component-small { // add my-custom-component-small class to your mat-form-field element
.mat-form-field-flex > .mat-form-field-infix { padding: 0.4em 0 !important;}
.mat-form-field-label-wrapper { top: -1.5em; }
&.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label {
transform: translateY(-1.1em) scale(.75);
width: 133.33333%;
}
}
}
Надеемся, что команда Angular добавит поддержку пользовательского интерфейса высокой плотности в будущих выпусках (высокая плотность является частью спецификации дизайна материалов).
TLDR: настроить размер шрифта окружающего контейнера.
Длиннее: Функциональность для изменения размеров полей формы встроена в Angular Material, поэтому, если вы не хотите изменять относительные пропорции в поле, вам не нужно заморачиваться с изменением размеров отдельных компонентов (см. документацию).
Ключом к настройке размера поля на самом деле является просто настройка размера шрифта в окружающем контейнере. Как только вы это сделаете, все остальное будет масштабироваться вместе с ним. например
<div style = "font-size: 12px">
<mat-form-field appearance = "outline">
<mat-label>Your name</mat-label>
<input matInput placeholder = "Jane Doe">
</mat-form-field>
<mat-form-field appearance = "outline">
<mat-label>Your email</mat-label>
<input matInput placeholder = "[email protected]">
</mat-form-field>
</div>
Результирующая форма:
<div style = "font-size: 18px">
<mat-form-field...
</div>
Результирующая форма:
Это не решение для вас, если вас не устраивает соотношение заполнения внутри форм. Однако это другой вопрос, чем просто изменить размер форм. Изменить размер просто, изменить соотношение отступов и полей еще сложнее!
этот вопрос не касается изменения размера шрифта. Речь идет об отношении расстояния от текста/метки к границам, которое на какой-то вкус слишком широкое.
Андре спросил, как изменить высоту поля формы, и он ответил, что: высота всех элементов формы определяется относительно размера шрифта, так что это все, что вам нужно изменить. Вы правы в том, что он не изменит относительных пропорций — он сохранит все пропорциональным и масштабирует все это. но вопрос не в изменении пропорций. Ваш вопрос отличается от ОП.
Пожалуйста, оцените отмеченный ответ (он меняет пропорции, и ОП доволен этим и отмечает его как ответ). И внимательно посмотрите на изображения ОП. На изображениях видно, что пропорции должны измениться. Хороших выходных.
По какой-то причине исходные изображения не загружались, когда я смотрел на вопрос, поэтому был виден только текст. По картинкам видно, что вы правы в своей интерпретации.
Это лучший ответ! Работал как шарм. Спасибо!
Спасибо ! очень быстрое решение
Это то, что я использовал:
.small-input.mat-form-field-appearance-outline .mat-form-field-infix {
padding: .25em 0 .75em 0;
font-size: 14px;
}
.small-input.mat-form-field-appearance-outline .mat-form-field-infix .mat-select-arrow{margin-top: 10px;}
.small-input.mat-form-field-appearance-outline .mat-select-empty + .mat-form-field-label-wrapper .mat-form-field-label{margin-top: -0.75em;}
Я пробовал этот код, и он работал для полей ввода, но не для меток (в моих вводах мат-автозаполнения). Переименовав small-input в compact-input, я использовал этот селектор, чтобы расположить метку на пустом объекте: .compact-input.mat-form-field-appearance-outline .mat-form-field-infix .mat-form-field-label-wrapper .mat-form-field-label.mat-empty.mat-form-field-empty { margin-top: -0.75em; }
Вот еще один подход:
/* Angular Material Overrides */
.mat-form-field-appearance-outline .mat-form-field-outline {
color: #ccc; /* Override outline color. */
}
.mat-form-field-appearance-outline .mat-form-field-infix {
padding: .65em 0; /* Original top/bottom value was 1em. */
}
.mat-input-element {
position: relative;
top: -1.2em; /* Adjust accordingly to keep placeholder/input text vertically centered. */
}
.mat-form-field-label-wrapper {
top: -1.2em; /* Adjust accordingly to keep <mat-label> text vertically centered. */
}
TL;DR Поля формы материала основаны на font-size свойстве поля.
Не делайте ошибку, регулируя высоту материала, гребля и т. д. в вашем CSS/SCSS... Элементы материальной формы, такие как ввод и выбор, основаны на font-size. Кроме того, встроенные стили не рекомендуются, поэтому вы можете просто добавить немного CSS. Атрибут «внешний вид» не имеет значения.
::ng-deep .mat-form-field {
font-size: 12px; // example
}
12 пикселей? это просто не очень хорошая практика .. не будет так читабельно на мобильном телефоне: P
Эта «проблема» невозможности скрыть плавающую метку упоминается здесь: https://github.com/angular/components/issues/11845
Упомянутый приятный обходной путь заключается в том, чтобы не включать метку мата в поле формы мата и добавлять его в свой css, локальный или глобальный. Вам может понадобиться использовать ::ng-deep.
.mat-form-field:not(.mat-form-field-has-label) .mat-form-field-infix {
border-top-width: 0;
}
Как объяснили многие постеры, поле угловой формы материала основано на размере шрифта, поэтому для всех вас, кто хочет определить пользовательское поле формы, вот мой код для изменения размера как высоты, так и ширины, не затрагивая входной шрифт или значок переключить размер.
.custom-form-field {
width: 200px;
font-size: 10px;
margin-top: 3px;
margin-bottom: -1.25em;
mat-datepicker-toggle {
font-size: 12px;
}
input.mat-input-element {
padding-bottom: 2px;
font-size: 12px;
color: $title-color;
}
}Вы можете глубоко переопределить значение заполнения стиля контура:
::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
padding: .5em;
}
Для меня это было хорошим решением
Примените изменение к селектору .mat-form-field .mat-form-field-infix. В Sass это будет:
.mat-form-field {
.mat-form-field-infix {
height: 16px;
}
}
в css:
input.mat-input-element {height:105px}- это то, что вы имеете в виду?