ionic2及ionic3没有了popup及 其templateUrl属性 那我们如何对弹窗里加入自定义元素 从而达到自定义弹窗样式

那么就可以通过写h5页面来实现 自定义弹窗效果;

写个H5的弹窗及控制其显示、隐藏,再加上animation就完美应用了;

!!!!

但有个新的问题,从底部弹出的窗口h5元素无论怎么设置z-index始终无法盖住tabs栏;

如下解决:

1.如果只是子页面有自定义弹窗

所有子页面隐藏tabs就可以解决;

可以通过在app.module.ts 写入如下:

import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { HttpModule } from '@angular/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MyApp } from './app.component'; @NgModule({
declarations: [
MyApp
],
imports: [
BrowserModule,
BrowserAnimationsModule, //..引入animation动画模块
HttpModule,
IonicModule.forRoot(MyApp,{
tabsHideOnSubPages:'true' //,,所有子页面tabs隐藏(一般app都做了)
})
],
bootstrap: [IonicApp],
entryComponents: [
MyApp
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler,useClass: IonicErrorHandler},HttpServer
]
})
export class AppModule {}

2.如果几个tabsRoot页面同样有自定义的H5弹窗:

那么就只有手动隐藏、显示(毕竟弹窗关闭后tabs需要显示)tabs :

i、自定义tabs显示、隐藏的服务

  项目根目录下 新建自定义服务文件夹providers并

  provides文件夹下新建tabs-servers.ts:

  内容如下:

  

import {Injectable} from '@angular/core';  

// Declare TabsService as a provider in app.module.ts
// Inject TabsService in your class: constructor(public tabs: TabsService){}
// Use the this.tabs.hide() or this.tabs.show() methods wherever you want
@Injectable()
export class TabsServer { //该服务类名TabsServer
constructor() {}
public hide() { //隐藏tabs的方法(函数)
let tabs = document.querySelectorAll('.tabbar'); //选择所有的.tabbar并赋给tabs
let footer = document.querySelectorAll('.footer');
let scrollContent = document.querySelectorAll('.scroll-content');
if (tabs !== null) { //当tabs存在时,如隐藏了tabs就===null
Object.keys(tabs).map((key) => {
tabs[key].style.display = 'none'; //隐藏tabs 这时就是null~~~
}); // fix for removing the margin if you got scorllable content
setTimeout(() =>{
Object.keys(scrollContent).map((key) => {
scrollContent[key].style.marginBottom = '0'; //使content默认marginBoottom清零
});
Object.keys(footer).map((key) => {
footer[key].style.bottom = '0px'; //使footer默认bootom清零
});
},10) //10毫秒后运行
}
}
public show() {
let tabs = document.querySelectorAll('.tabbar');
let footer = document.querySelectorAll('.footer');
let scrollContent = document.querySelectorAll('.scroll-content');
if (tabs !== null) {
Object.keys(tabs).map((key) => {
tabs[key].style.display = 'flex'; //显示tabs
});
}
// fix for removing the margin if you got scorllable content
setTimeout(() =>{
Object.keys(scrollContent).map((key) => {
scrollContent[key].style.marginBottom = '43px';//根据定义的tabs高度来定 (我有在app.scss自定义tabs的高度)
});
Object.keys(footer).map((key) => {
footer[key].style.bottom = '43px';//根据定义的tabs高度来定 (我有在app.scss自定义tabs的高度,未定义的可以浏览器查看)
});
},10) }
}

  

ii、将TabsServer载入到app.module.ts

import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { HttpModule } from '@angular/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { MyApp } from './app.component'; import {TabsServer} from '../providers/tabs-server'; //导入TabsServer @NgModule({
declarations: [
MyApp
],
imports: [
BrowserModule,
BrowserAnimationsModule, //..引入animation动画模块
HttpModule,
IonicModule.forRoot(MyApp,{
tabsHideOnSubPages:'true' //,,所有子页面tabs隐藏(一般app都做了)
})
],
bootstrap: [IonicApp],
entryComponents: [
MyApp
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler,useClass: IonicErrorHandler},HttpServer,TabsServer //写到这儿
]
})
export class AppModule {}

  

iii、在Home页面实现自定义弹窗

import { Component} from '@angular/core';
import {TabsServer} from '../../providers/tabs-server'; @Component({
selector: 'page-home',
template: `
<ion-header>
<ion-navbar>
<ion-title>Home</ion-title>
</ion-navbar>
</ion-header>
<ion-content >
我是content,我要显示这个自定义的弹窗
<button ion-button full (click)="showMypopup('1')">显示自定义弹窗<button>
</ion-content> <!--myPopup1-->
<!--我的遮罩层1-->
<span *ngIf="showBackdrop1" class="backdropBar">
<ion-backdrop disable-activated role="presentation" (click)="backdrop('1')" ></ion-backdrop>
<div class="MyPopup">
<!--弹窗内容-->
<!--close 关闭弹出层 关闭按钮自定义-->
<div class="CloseBox">
<ul class="relate">
<li class="garden">
<span class="close" (click)="closeTap('1')"></span>
</li>
</ul>
</div>
<ion-scroll scrollY="true" class="popContent">
<!--content--说明:用scrol 可以向里面添加无限内容-->
<div >只想在弹窗窗口添加列表信息!</div>
<div >只想在弹窗窗口添加列表信息!</div>
<div >只想在弹窗窗口添加列表信息!</div>
<div >只想在弹窗窗口添加列表信息!</div>
 <!--content===end-->
</ion-scroll>
</div>
</span>
<!--myPopup1======end-->
`
})
export class HomePage {
private showBackdrop1:boolean=false;//声明显、隐弹窗判断,初始隐藏弹窗
private showBackdrop2:boolean=false;//声明显、隐弹窗判断,初始隐藏弹窗
constructor(public:tabsserver:TabsServe){} //注入依赖TabsServer //显示蒙版===打开弹窗==
showMypopup(L){
this.tabsserver.hide(); //隐藏tabs
switch(L){
case '1':{
this.showBackdrop1=true; //显示蒙版1
break;
}
case '2':{
this.showBackdrop2=true; //显示蒙版2
break;
}
//....扩展多个自定义弹窗
} //显示蒙版===end== //关闭蒙版--关闭弹窗
backdrop(n){
this.tabsserver.show(); //显示tabs
switch(n){
case '1':{
this.showBackdrop1=false; //隐藏蒙版1
break;
}
case '2':{
this.showBackdrop2=false; //隐藏蒙版2
break;
}
//....扩展多个自定义弹窗
}
} closeTap(m){
this.backdrop(m);
if(m=="1"){
//..更多的判断
console.log('弹窗1关闭了');
}
}
//关闭蒙版====end===== }

vi:在home.scss写自定义弹窗样式

page-home{
ion-content{
//蒙版
.backdropBar{
position:fixed;
width:100%;
height:100%;
z-index:8000;
ion-backdrop{
opacity:1.0;
background-color:rgba(0,0,0,0.56);
z-index: 8001;
}
//Mypopup
.MyPopup{
position: absolute;
color: $clr666;
bottom: 0;
left: 0;
width:100%;
height:84%;
background-color:$clrPopBC;
z-index: 8002;
//弹窗内容
//scrooll-content
.popContent{
width:100%;
min-height:100%;
}
//close
.CloseBox{
position:relative;
width:100%;
height:25px;
top:0;
left:0;
z-index: 8003;
.relate{
position:absolute;
width:50px;
height:50px;
left:50%;
top:0;
margin-top:-25px;
margin-left:-25px;
z-index: 8003;
background-color:$clrPopBC;
border-radius: 50%;
padding:8px;
.garden{
float: left;
position:relative;
top:0;
left:0;
width:34px;
height:34px;
border-radius: 50%;
background-color:$clrf00;
line-height: 34px;
overflow: hidden;
.close{
display: block;
position:absolute;
left:0;
top:0;
width:34px;
height:34px;
padding:10%;
&::before{
content:"";
position:absolute;
top:50%;
left:15%;
width:70%;
height:0px;
margin:auto;
border-bottom: 2px solid $clrfff;
transform: rotate(45deg);
}
&::after{
content:"";
position:absolute;
top:50%;
left:15%;
width:70%;
height:0px;
margin:auto;
border-bottom: 2px solid $clrfff;
transform: rotate(-45deg);
}
}
//close==end=
}
//garden==end=
}
//relate==emd=
}
//CloseBox===end===
}
}

}
}

  这样就ok了!

总结:

虽然我写的是弹窗,其实是自定义的页面内的底部弹出层\页面+蒙版(没加动画),不过可以看出其实ionic2\ionic3在写法上是相当的便利;通过以上方法可实现意想不到地页面组合效果。

ionic2\ionic3 自定义弹窗的更多相关文章

  1. ExtJs基础知识总结:自定义弹窗和ComboBox自动联想加载(四)

    概述 Extjs弹窗可以分为消息弹窗.对话框,这些弹窗的方式ExtJs自带的Ext.Msg.alert就已经可以满足简单消息提示,但是相对复杂的提示,比如如何将Ext.grid.Panel的控件显示嵌 ...

  2. xamarin UWP平台下 HUD 自定义弹窗

    在我的上一篇博客中我写了一个在xamarin的UWP平台下的自定义弹窗控件.在上篇文章中介绍了一种弹窗的写法,但在实际应用中发现了该方法的不足: 1.当弹窗出现后,我们拖动整个窗口大小的时候,弹窗的窗 ...

  3. ionic3自定义android原生插件

    一.创建一个android项目,编写插件功能,并测试ok,这里以一个简单的调用原生Toast.makeText为例. 1.新建android项目 2.编写插件类 package com.plugin. ...

  4. 支付宝小程序自定义弹窗插件|支付宝dialog插件|model插件

    支付宝小程序自定义弹窗组件wcPop|小程序自定义对话框|actionSheet弹窗模板 支付宝小程序官方提供的alert提示框.dialog对话框.model弹窗功能比较有限,有些都不能随意自定义修 ...

  5. 微信小程序自定义弹窗wcPop插件|仿微信弹窗样式

    微信小程序自定义组件弹窗wcPop|小程序消息提示框|toast自定义模板弹窗 平时在开发小程序的时候,弹窗应用场景还是蛮广泛的,但是微信官方提供的弹窗比较有局限性,不能自定义修改.这个时候首先想到的 ...

  6. 基于JQ的自定义弹窗组件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. ionic2 tabs 自定义图标

    ionic2 tabs 自定义图标 一.准备资源 tabs icon 的svg格式的矢量图片 二.生成字体样式文件 打开icoMoon网站去制作字体文件. 三.使用字体文件 解压下载的文件,将其中的f ...

  8. 获取浏览器弹窗alert、自定义弹窗以及其操作

    web自动化测试第10步:获取浏览器弹窗alert.自定义弹窗以及其操作 - CSDN博客 http://blog.csdn.net/ccggaag/article/details/76573857 ...

  9. 解决ionic2/ionic3轮播图切换页面或者点击过后不自动轮图

    我们在ionic2/ionic3开发的过程中会出现切换页面或者滑动切换轮播图出现轮播图不再轮播的情况,这其实需要一些配置. 首先在运用到轮播图的component中引入 import {ViewChi ...

随机推荐

  1. java数组知识总结(一)//按类

    在线api  目录: 零/数组(基本元素) 1.  声明一个数组 2.  创建一个数组 3.  数组名.length 4.  数组的引用 一/java.lang.reflect.Array     / ...

  2. P3383 【模板】线性筛素数 洛谷

    https://www.luogu.org/problem/show?pid=3383#sub 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输 ...

  3. codevs—— 1077 多源最短路

    1077 多源最短路  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知n个点(n<=100),给你 ...

  4. 奇妙的滚动css+html

    <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title> ...

  5. 【CV论文阅读】Two stream convolutional Networks for action recognition in Vedios

    论文的三个贡献 (1)提出了two-stream结构的CNN,由空间和时间两个维度的网络组成. (2)使用多帧的密集光流场作为训练输入,可以提取动作的信息. (3)利用了多任务训练的方法把两个数据集联 ...

  6. 如何使用IVT BlueSoleil 如何在电脑上使用蓝牙耳机

    1 确保电脑上有蓝牙适配器 (现在很多电脑是不配蓝牙的),如果没有,网上买个蓝牙适配去,十几块钱很便宜.好了之后装一个下面这个软件,然后搜索蓝牙耳机,下面的状态栏就是"搜索设备" ...

  7. hdu 5950 Recursive sequence

    题意:告诉你数列的递推公式为f(n+1)=f(n)+2*f(n-1)+(n+1)^4 以及前两项a,b:问第n项为多少,结果对2147493647取模. 题解:有递推公式,马上应该就能想到矩阵快速幂: ...

  8. 22、Cocos2dx 3.0游戏开发找小三之音乐与音效:假如世界上没有了音乐,你的耳朵会孤单吗?

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30485103 假如世界上没有了音乐,在森林里.我们听 ...

  9. Arduino程序-光敏电阻

    尽管造书去做的.但还是有莫名的成就感 从串口显示出,电压变化, void setup() {   // put your setup code here, to run once:   Serial. ...

  10. 在GNU Linux中怎样得到一个进程当前的流量

    /*********************************************************************  * Author  : Samson  * Date   ...