Ввод контура материала — создание выреза в Angular

Привет, я пытаюсь реализовать ввод контура пользовательского материала, который включает в себя выемку, где плавает метка.

Я знаю, что существует существующий компонент для Angular Material, но мне нужна собственная специальная настройка, поэтому я создаю свою собственную.

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

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

Вот мой стекблиц https://stackblitz.com/edit/angular-u5nxde-xdq3qy?file=src%2Fapp%2Fexample.comComponent.html,src%2Fapp%2Fexample.comComponent.ts,src%2Fapp%2Fexample.comComponent.css, src%2Fapp%2Fapp.comComponent.html,src%2Fapp%2Fapp.comComponent.css

ожидал:

Код:

     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 */
}

Сегодня вечером я не смогу дать ответ по коду, но, возможно, смогу помочь с некоторой информацией: в выделенном поле формы мата используются три элемента html для достижения этого контура с надрезом, у всех них есть специальные классы CSS с именами mdc-notched-outline__leading, mdc-notched-outline__notch и mdc-notched-outline__trailing. Граница в основном разделена на три части, а верхняя граница среднего элемента удаляется, когда ввод фокусируется.

Tibère B. 04.05.2024 03:32

Спасибо за ответ, было бы здорово!! Я порылся в Интернете, но многие CSS не работают. Интересно понять, так как до сих пор не знаю, как можно разделить каждую границу.

Ka Tech 04.05.2024 03:39
Приемы 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
2
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я попытался воспроизвести поведение контура с надрезом с минимальным количеством кода. Я использовал технику, описанную в моем предыдущем комментарии:

Граница с надрезом состоит из трех элементов 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/…

Ka Tech 04.05.2024 16:31

Да, для изменения положения плавающей метки определенно потребуется немного JS, рад, что смог помочь!

Tibère B. 04.05.2024 18:47

Спасибо, я заметил, что размер этикетки фиксирован. Если текст более длинный, он переносится. Есть идеи, как расширить его содержание? Stackblitz здесь: stackblitz.com/edit/…

Ka Tech 05.05.2024 13:34

Все хорошо, исправил! :)

Ka Tech 05.05.2024 13:37

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