【问题标题】:How to style the placeholder text of an Ionic <ion-select> component?如何设置 Ionic <ion-select> 组件的占位符文本的样式?
【发布时间】:2020-10-12 05:24:55
【问题描述】:

如何在 Ionic 框架中设置&lt;ion-select&gt; 组件的默认/占位符文本的样式?默认文本位于 shadow root 内,因此 HTML 元素有一个“select-placeholder”类,无法通过传统 CSS 访问。

framework.com/docs/api/select#css-custom-properties

ion-select 的文档提到使用自定义属性,但只有两个自定义属性:

--placeholder-color

--placeholder-opacity

两者都可以很好地更新颜色和不透明度,但我真的很想专门更新字体粗细和字体样式,并且没有自定义属性。

Ionic team mentions 表示如果没有自定义属性,“访问元素的影子根并在 JS 中自己应用样式”。但他们没有详细说明如何做到这一点。

具体来说,如何在未提供自定义属性的 Ionic 组件的影子根中添加样式?

【问题讨论】:

  • 您能给您的ion-select 提供一个ID 并检查document.getElementById("the-id").shadowRoot.querySelector(".select-text").class 返回的内容吗?
  • 它返回“未定义”,但如果我将“class”更改为“className”,它会返回该元素上的 2 个类:“select-text select-placeholder”
  • 所以,根据你的建议,我尝试了这个: document.getElementById("mySelectBoxThing").shadowRoot.querySelector(".select-text").style.color = "hotpink" 这很有效。但想知道是否有更好的方法。
  • 我使用 Ionic4 是因为它的价值。

标签: css ionic-framework ionic4 shadow-dom


【解决方案1】:

TLDR;将 part 属性添加到 shadow dom 内的占位符元素,然后在 css 中使用 ::part(thePartName) 设置样式。

这是我的解决方案(我不喜欢它)。顺便说一句,我正在使用 Ionic 4。

因此,最终,在某些 ionic 组件的 shadow DOM 中样式元素的问题在于,来自外部*样式样式表的传统 CSS 选择器对 shadow dom 中的元素的影响为零。这是 shadow DOM 的要点之一:创建封装的组件,其中 CSS 不会泄漏,也不会泄漏。我知道有两个例外:

1 - 使用 Ionic 的CSS variables (aka CSS Custom Properties) 之一。这些仅限于 Ionic 4 中的 --placeholder-coloradding --placeholder-opacity in ionic 5。我碰巧在 ionic 4 上,所以我无法利用 opacity 变量。但是,要使用这些自定义属性,您可以这样做:

ion-select {
 --placeholder-color: 'hotpink';
}

我需要设置字体粗细、字体样式和不透明度的样式,因此我需要 CSS 自定义属性以外的其他解决方案。

  1. 还有第二种方法可以在 shadow dom 中设置元素样式,那就是使用 ::part() 伪元素。

位于 Ionic 提供的 shadow dom 中的 html:

<div part="SorryIonicDoesntAddThisAttribute" class="select-text select-placeholder>my text</div>

你的 CSS:

::part(thePartName) {
  opacity: 1;
  font-style: italic;
  font-weight: normal;
}

如果“part”HTML 属性存在于 shadow dom 内的元素上,则它就像进入 shadow dom 的入口。

但是在 Ionic 4 中,Ionic 不会将 part 属性添加到 shadow dom 中的 ion-select 组件的元素

我使用 javascript 添加它(受@ivanreutkers 评论启发)来添加 part 属性,因此我可以在 CSS 中设置它的样式。

document.getElementById("the-id").shadowRoot.querySelector(".select-placeholder").setAttribute("part", "myPartName");

*Outside,指的是我的网站/应用程序的样式表,而不是 Ionic 提供的位于 Web 组件内部的特定样式。

【讨论】:

【解决方案2】:

尝试在您的 app.scss 文件中添加以下行,如下所示:

::ng-deep {
  .select-text {
    color: white;
    ...
  }
}

【讨论】:

  • 感谢建议,可惜普通的CSS选择器无法进入shadow root。
  • 好的,你添加了 !important 吗?喜欢这种颜色:白色!重要;
  • 据我所知,这不是“css 特异性”的问题。更重要的是这些标志性元素位于 shadow dom 中,因此它们不受来自 ionic web 组件外部的样式的影响。
猜你喜欢
  • 2017-02-26
  • 2020-02-26
  • 1970-01-01
  • 2017-12-14
  • 2015-03-18
  • 2016-11-24
  • 2012-03-08
  • 1970-01-01
  • 2018-08-26
相关资源
最近更新 更多