Как добавить миксин для высоты в текстовое поле mwc?

Я использую полимер 3 и элемент освещения (2.2.1). Версия mwc-textfield — 0.13.0. Я прочитал документацию, относящуюся к этой версии. В этой документации, я обнаружил, что мы можем добавить миксин для высоты. Я пробовал несколько способов, но не удалось. Может быть, синтаксис, который я использую, неверен. Я хочу уменьшить высоту моего текстового поля. Это мое текстовое поле

<mwc-textfield id="textBox" .type="text" .value=${this.title} .placeholder='' minLength="10" maxLength="256"></mwc-textfield>

и мой CSS

 #textBox{
  text-transform: none;
   --mdc-theme-primary: transparent;
   --mdc-text-field-fill-color: #fff;
   --mdc-text-field-hover-line-color: #f5f5f5;
   --mwc-text-width: 100%;
   width:100%;
 }

Применяемый css по умолчанию:

:host(:not([disabled])) .mdc-text-field:not(.mdc-text-field--outlined) {
    background-color: transparent;
}
.mdc-text-field:not(.mdc-text-field--disabled) {
    background-color: rgb(245, 245, 245);
}
.mdc-text-field {
    display: flex;
    width: 100%;
}
.mdc-text-field {
    height: 56px;
    display: inline-flex;
    position: relative;
    box-sizing: border-box;
    will-change: opacity, transform, color;
    border-radius: 4px 4px 0px 0px;
    overflow: hidden;
}
.mdc-text-field {
    --mdc-ripple-fg-size:  0;
    --mdc-ripple-left:  0;
    --mdc-ripple-top:  0;
    --mdc-ripple-fg-scale:  1;
    --mdc-ripple-fg-translate-end:  0;
    --mdc-ripple-fg-translate-start:  0;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
user agent stylesheet
label {
    cursor: default;
}
<style>
#textfield {
    width: var(--text-field-width,80%);
    height: 100%;
    position: absolute;
    left: 0;
    top: -12px;
    text-transform: capitalize;
    --mwc-text-width: 100%;
}
<style>
mwc-textfield {
    --mdc-theme-primary: transparent;
    --mdc-text-field-ink-color: black;
    --mdc-text-field-fill-color: transparent;
    --mdc-text-field-disabled-fill-color: transparent;
}

Высота по умолчанию, применяемая к текстовому полю, составляет 56 пикселей. То, что я пробовал, это

 #textbox.mdc-text-field--height{
    height:45px;
    }

и

#textbox.mdc-text-field--height('45px');

а также добавлен миксин в файл модулей узла как height:var(--mdc-text-field-height,56px); и используется в css как

#textBox{
--mdc-text-field-height:45px;
}

Любая помощь будет принята с благодарностью! Заранее спасибо.


person Himabindu    schedule 29.02.2020    source источник


Ответы (1)


Компоненты Material Design и веб-компоненты Material

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

Первое, на что следует обратить внимание, это наличие двух разных библиотек компонентов материалов: та, на которую вы ссылаетесь, — это MDC (компоненты дизайна материалов, распространяемые на npm как @material/<component>), которая является реализацией компонентов материала SASS+JS. Другой — MWC (материальные веб-компоненты, распространяемые как @material/mwc-<component>), набор фактических веб-компонентов. на основе бывшей библиотеки. Поэтому имейте в виду, что документация относится к MDC-аналогу компонента MWC, который вы фактически используете (<mwc-textfield>).

Внешний стиль

Что вы пытаетесь сделать здесь

#textbox.mdc-text-field--height {
  height: 45px;
}

не работает в основном потому, что выбор внутри теневого корня пользовательского элемента невозможен (по крайней мере, больше нет); также за высоту отвечает элемент <label>, класс которого .mdc-text-field.

Способ querySelector

Самый быстрый способ изменить высоту, который приходит мне на ум, это:

import { LitElement, html, property, customElement, css, query } from 'lit-element';
import '@material/mwc-textfield';

@customElement('my-component')
export class MyComponent extends LitElement {
  // Select the text field
  @query('mwc-textfield') textField;

  async firstUpdated() {
    // Wait for its dom to be ready
    await this.field.updateComplete;
    // Programmatically select the label
    // and change the height
    this.field
    .shadowRoot
    .querySelector('.mdc-text-field')
    .style
    .height = '45px';
  }

  render() {
    return html`<mwc-textfield></mwc-textfield>`;
  }
}

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

Способ расширения

Вы также можете установить высоту, расширив TextField и переопределив стили:

import {LitElement, html, customElement, css} from 'lit-element';
import {TextField} from '@material/mwc-textfield/mwc-textfield';

@customElement('my-textfield')
export class MyTextfield extends TextField {
  static styles = [TextField.styles, css`
    .mdc-text-field {
      height: 45px;
    }
  `];
}

// Then use <my-textfield> instead of <mwc-textfield>

но опять же, как и выше, используйте на свой страх и риск...

Использование миксина

Я предполагаю, что на данный момент единственный способ использования миксина height — это создание пользовательской версии TextField, которая выглядит примерно так:

  • клонируйте репозиторий mwc (да, это монорепозиторий, так что вы получите все другие компоненты тоже, но я уверен, что вы можете удалить все те, которые не импортированы mwc-textfield)
  • установка нпм
  • в packages/mwc-textfield/src/mwc-textfield.scss используйте примесь:
    @include mixins.height(45px);
    
    вероятно около здесь
  • npm запустить сборку
  • скопируйте папку mwc-textfield и вставьте ее в свой проект (удалите исходные файлы, npm pack может быть удобно для этого), затем измените импорт с @material/mwc-textfield на ./path/to/custom-textfield.

Конечно, слишком много работы для изменения высоты... Хорошая новость заключается в том, что MWC все еще находится в разработке, и нельзя исключать, что они добавят пользовательское свойство CSS или какой-либо другой способ настроить высоту. Кроме того, в MWC внедряются новые концепции плотности (к сожалению, пока не в TextField), что может быть именно тем, что вам нужно.

Существует также открытая проблема по этому поводу, давайте посмотри, что они говорят

person Umbo    schedule 06.03.2020
comment
То, что я не хочу расширять как настраиваемое текстовое поле, заключается в том, что при обновлении веб-компонентов мне приходится снова и снова определять свое собственное настраиваемое текстовое поле. Поэтому я хочу использовать исходное текстовое поле, используя данные миксины. - person Himabindu; 09.03.2020
comment
Ясно... Но позвольте мне указать, что миксин, о котором вы говорите, является дерзким миксином, который можно использовать в контексте нескомпилированные компоненты MDC. В MWC такого нет: они поставляются с предварительно скомпилированным CSS; извините, если я не ясно дал понять это в своем ответе. В любом случае, если вы не хотите устанавливать высоту с помощью querySelector, рассматривали ли вы возможность перехода на версию MDC? - person Umbo; 09.03.2020
comment
Хорошо, я понял это в вашем ответе, но я вижу другие альтернативы в MWC, а не переход на MDC. - person Himabindu; 11.03.2020
comment
Спасибо @Umbo, у меня часть расширения работала с небольшими изменениями. - person Himabindu; 18.03.2020