Ionic 2中Toast的样式设计

20

有没有办法在ionic 2 toast中样式文本消息?

我已经尝试过这个:

    let toast = Toast.create({
      message: "Some text on one line. <br /><br /> Some text on another line.",
      duration: 15000,
      showCloseButton: true,
      closeButtonText: 'Got it!',
      dismissOnPageChange: true
    });

    toast.onDismiss(() => {
      console.log('Dismissed toast');
    });

    this.nav.present(toast);
  }

但显然您不能在文本中使用 html,所以我猜我的问题的答案是否定的?

11个回答

32

您必须在您的 toastCtrl 函数中添加 'cssClass: "yourCssClassName"'。

 let toast = Toast.create({
      message: "Some text on one line. <br /><br /> Some text on another line.",
      duration: 15000,
      showCloseButton: true,
      closeButtonText: 'Got it!',
      dismissOnPageChange: true,
      cssClass: "yourCssClassName",
    });

如果您将任何功能添加到您的CSS类中,那么您可以在默认页面之外使用它们。例如:

   page-your.page.scss.name {
     //bla bla
    }
 .yourCssClassName {
   text-align:center;
  }

我把类放在了page-your.page.scss里面,你的答案帮了我大忙!谢谢@Burhan Gül!!! :D - Skizo-ozᴉʞS ツ
这只是对齐文本。HTML标签<br />将不起作用。 - Ari
我必须使用!important来使text-align:center生效:text-align:center !important;否则它将不起作用! - Hamid Araghi
@Skizo-ozᴉʞS 我也犯了同样的错误。有人能告诉我将其放在页面外部的原因吗?-your.page.scss.name。 - Waleed Naveed

25

我通过在烤面包机创建时添加自定义类,成功实现了烤面包机颜色的更改。

let toast = this.toastCtrl.create({
    message: 'Foobar was successfully added.',
    duration: 5000,
    cssClass: "toast-success"
  });
  toast.present();
}

在那个页面的scss文件中,我跳出了默认嵌套的页面名称(因为烤面包机不在ion页面名称的根目录中)。虽然这有点hacky,但我只是明确地针对我添加的自定义类后面的下一个
元素。
.toast-success {
  > div{
       background-color:#32db64!important;
   }
}

我说这是 hacky 的,因为你必须在其上使用 !important。你可以通过将 .toast-success 包裹在 .md,.ios,.wp{... 中来避免使用 !important。

您可以通过在 theme/variables.scss 文件中覆盖主要的烤面包机变量来覆盖样式默认值。

$toast-ios-background:(#32db64);
$toast-md-background:(#32db64);
$toast-wp-background:(#32db64);

这只会覆盖默认值,而不是自定义值。还有一些其他的变量也可以进行样式设置。


这个已经可以工作了。我必须删除在类.toast-message中定义的background-color,才能让自定义的cssClass背景可见。 - A.W.
你应该强调将.toast-success放在页面名称之外。我忽略了它,因为粗心大意而花费了1个小时进行调试。=( - Ka Mok
好的,div的问题解决了,因为我漏掉了div,所以它把整个屏幕都变成了红色。 - Skizo-ozᴉʞS ツ

7

首先,从ionic-angular中导入toast控制器,并在构造函数中创建该对象。

import { ToastController } from "ionic-angular";

constructor(private _tc: ToastController) {
}

之后,无论您想在哪里显示您的弹出消息,请编写该代码。

let options = {
  message: "Your toast message show here",
  duration: 3000,
  cssClass: "toast.scss"
 };

this._tc.create(options).present();

这是我的 SCSS:

.toast-message {
  text-align: center;
}

或者您可以查看来自此链接的最佳示例。我认为它会对您有所帮助。 :)

否则,请检查此链接上的答案。


6
如果您在app.scss(而不是page.scss)中定义自己的css类,您可以使用.toast-wrapper和.toast.message样式它。无需使用> div{
例如:
.yourtoastclass {
  .toast-wrapper {
    background: blue;
    opacity: 0.8;
    border-radius: 5px;
    text-align: center;
  }
  .toast-message {
    font-size: 3.0rem;
    color: white;
  }
}

在主题/variables.scss文件中,您可以设置默认值。
例如(红色和略带透明度):
$toast-width:   75%;  /* default 100% */
$toast-ios-background: rgba(153, 0, 0, .8);
$toast-md-background: rgba(153, 0, 0, 0.8);

谢谢@Ralf。我们如何在theme/variable.scss中设置border-radius: 5px;text-align: center;?当宽度不为100%时,我们如何将toast对齐以显示在屏幕中央? - Hamid Araghi
$toast-ios-border-radius .65rem: - Ralf Viellieber

4
Ionic 2 提供了一种非常有用的方法来覆盖其组件样式。您可以通过在 src/theme/variables.scss 中添加代码来覆盖烤面包机(toaster)的 SASS 变量。
$toast-ios-title-color: #f00 ;
$toast-md-title-color:#f00;

这将覆盖默认样式,请参考此覆盖Ionic Sass变量

3
您可以实现此操作,但需要修改toast组件的模板本身。
通过浏览器: \node_modules\ionic-angular\components\toast\toast.js
更改第194行(模板): {{d.message}} 改为

2
不建议这样做,因为您将覆盖核心Ionic文件,因此来自Ionic的任何更新都会破坏您所做的更改。这也会使项目维护变得非常麻烦,特别是如果其他开发人员正在进行工作。 - user1752532
1
这是这个问题的正确答案。到目前为止,Ionic Toast不支持该行为。也许请求更新会是一个好主意。 - aorfevre

2

您应该能够使用.toast-message选择器在css中更改任何消息的样式:

.toast-message { 
    font-family: Helvetica,
    color: red
}

或者,如果您查看文档(http://ionicframework.com/docs/v2/api/components/toast/Toast/),您可以使用cssClass属性为您的提示框分配特定的类,然后进行样式设置。


是的,我知道如何更改字体等。但我需要更改消息的布局,包括段落和缩进等。 - Bill Noble
2
啊,我认为目前没有干净的方法来做到这一点,因为消息采用字符串而不是HTML(正如您上面指出的)。您可以在组件创建后直接编辑DOM,但这会很混乱。也许可以让Ionic知道这个功能会很有用。 - Pat Murray
谢谢Pat,这正是我担心的事情。 - Bill Noble

1

更改烤面包背景颜色和不透明度:

let toast = this.toastCtrl.create({
      message: msg,
      duration: 3000,
      position: 'bottom',
      cssClass: 'changeToast'
    });

并添加app.scss:
.changeToast{.toast-wrapper {opacity: 0.6; border-radius: 5px !important; text-align: center; background: color($colors, primary);}};

它与.toast-message一起使用。

1
我尝试了上述所有方法,仍然无法解决问题,因此我找到了一个新的解决方案,您需要在页面CSS声明之外使用cssClass:
let toast = this.toastCtrl.create({
          message: msg,
          duration: 3000,
          position: 'bottom',
          cssClass: 'toastcolor'
        });

post-list.scss就像这样

page-post-list {

}
.toastcolor .toast-message {
    background-color:skyblue;
}      

0

不确定旧版Ionic,但在Ionic 5中,您无法直接更改内部CSS,因为它被封装在阴影中。

<ion-select>
  #shadow-root
    <div class="toast-container" part="container">
       ...
    </div>
</ion-select>

所以,如果要更改 .toast-container(例如)中的 cssClass,您应该使用:

.my-custom-class::part(container) {
    flex-direction: column;
}

.my-custom-class {
    .toast-container {
        flex-direction: column; // will not work
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接