Привет, я пытаюсь реализовать ввод контура пользовательского материала, который включает в себя выемку, где плавает метка.
Я знаю, что существует существующий компонент для Angular Material, но мне нужна собственная специальная настройка, поэтому я создаю свою собственную.
Я зашел так далеко в создании плавающего элемента, но у меня возникли проблемы с созданием настоящей выемки. Я видел решения, в которых за меткой был просто белый фон, но в моем случае это не работало, поскольку фон ввода имел другой цвет.
Любая помощь/стратегии, которые лучше всего помогут это сделать, была бы замечательной. Я согласен с использованием JS, что бы оно ни работало, главное, чтобы он был единообразным в нескольких браузерах. Спасибо заранее.
ожидал:
Код:
HTML
<div class = "material-textfield">
<input placeholder = " " type = "text" value = "test" />
<label class = "label-container">Label</label>
</div>
CSS
.material-textfield {
position: relative;
}
.label-container {
position: absolute;
font-size: 1rem;
left: 0;
top: 50%;
transform: translateY(-50%);
background-color: transparent;
color: gray;
padding: 0 0.3rem;
margin: 0 0.5rem;
transition: 0.1s ease-out;
transform-origin: left top;
pointer-events: none;
}
input {
font-size: 1rem;
outline: none;
border: 1px solid gray;
border-radius: 5px;
padding: 1rem 0.7rem;
color: gray;
transition: 0.1s ease-out;
background-color: beige;
}
input:focus {
border-color: #6200ee;
}
input:focus + .label-container {
color: #6200ee;
top: 0;
transform: translateY(-50%) scale(0.9);
border-color: #6200ee; /* Color on focus */
}
input:not(:placeholder-shown) + .label-container {
top: 0;
transform: translateY(-50%) scale(0.9);
border-color: #6200ee; /* Color when input is not empty */
}
Спасибо за ответ, было бы здорово!! Я порылся в Интернете, но многие CSS не работают. Интересно понять, так как до сих пор не знаю, как можно разделить каждую границу.
Я попытался воспроизвести поведение контура с надрезом с минимальным количеством кода. Я использовал технику, описанную в моем предыдущем комментарии:
Граница с надрезом состоит из трех элементов HTML, они содержатся в абсолютном гибком элементе div, расположенном позади фактического ввода.
Первое имя с именем Trailing находится в фиксированном дополнении, добавляемом перед входными данными.
Второй элемент с именем notch содержит метку, поэтому размер метки равен размеру метки.
Последний элемент с именем Trailing занимает оставшееся пространство после метки.
И вот реализация:
.form-field {
--input-pading: 16px;
--border: solid 1px black;
--border-radius: 4px;
padding-left: var(--input-pading);
min-width: 0;
max-height: 56px;
max-width: 248px;
position: relative;
box-sizing: border-box;
}
.form-field:focus-within {
--border: solid 2px black;
}
.notched-outline {
display: flex;
position: absolute;
top: 0;
right: 0;
left: 0;
width: 100%;
max-width: 100%;
height: 100%;
box-sizing: border-box;
pointer-events: none;
}
.notched-outline .leading {
border-radius: var(--border-radius) 0 0 var(--border-radius);
border-left: var(--border);
border-top: var(--border);
border-bottom: var(--border);
width: var(--input-pading);
}
.notched-outline .notch {
border-bottom: var(--border);
}
.notched-outline .notch .label {
position: relative;
transform: translateY(-50%);
padding-left: 4px;
padding-right: 4px;
}
.notched-outline .trailing {
border-radius: 0 var(--border-radius) var(--border-radius) 0;
border-right: var(--border);
border-top: var(--border);
border-bottom: var(--border);
width: 100%;
}
.form-field-infix {
width: 100%;
padding-bottom: var(--input-pading);
padding-top: var(--input-pading);
}
.form-field-infix input {
width: 90%;
outline: none;
border: none;
background-color: transparent;
}
<div class = "form-field">
<div class = "notched-outline">
<div class = "leading"></div>
<div class = "notch">
<div class = "label">Label</div>
</div>
<div class = "trailing"></div>
</div>
<div class = "form-field-infix">
<input placeholder = "test" type = "text"/>
</div>
</div>
вау, спасибо, что нашли время сделать это. Я реализовал нижнюю часть стека и идеально соответствует моим потребностям (метка, перемещающаяся от входа к верхней анимации, не входит в это решение, но она мне не нужна). Я очень удивлен, что все это было сделано без JS. Очень молодец еще раз спасибо! stackblitz.com/edit/…
Да, для изменения положения плавающей метки определенно потребуется немного JS, рад, что смог помочь!
Спасибо, я заметил, что размер этикетки фиксирован. Если текст более длинный, он переносится. Есть идеи, как расширить его содержание? Stackblitz здесь: stackblitz.com/edit/…
Все хорошо, исправил! :)
Сегодня вечером я не смогу дать ответ по коду, но, возможно, смогу помочь с некоторой информацией: в выделенном поле формы мата используются три элемента html для достижения этого контура с надрезом, у всех них есть специальные классы CSS с именами
mdc-notched-outline__leading
,mdc-notched-outline__notch
иmdc-notched-outline__trailing
. Граница в основном разделена на три части, а верхняя граница среднего элемента удаляется, когда ввод фокусируется.