ionic2\ionic3 自定义弹窗
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 自定义弹窗的更多相关文章
- ExtJs基础知识总结:自定义弹窗和ComboBox自动联想加载(四)
概述 Extjs弹窗可以分为消息弹窗.对话框,这些弹窗的方式ExtJs自带的Ext.Msg.alert就已经可以满足简单消息提示,但是相对复杂的提示,比如如何将Ext.grid.Panel的控件显示嵌 ...
- xamarin UWP平台下 HUD 自定义弹窗
在我的上一篇博客中我写了一个在xamarin的UWP平台下的自定义弹窗控件.在上篇文章中介绍了一种弹窗的写法,但在实际应用中发现了该方法的不足: 1.当弹窗出现后,我们拖动整个窗口大小的时候,弹窗的窗 ...
- ionic3自定义android原生插件
一.创建一个android项目,编写插件功能,并测试ok,这里以一个简单的调用原生Toast.makeText为例. 1.新建android项目 2.编写插件类 package com.plugin. ...
- 支付宝小程序自定义弹窗插件|支付宝dialog插件|model插件
支付宝小程序自定义弹窗组件wcPop|小程序自定义对话框|actionSheet弹窗模板 支付宝小程序官方提供的alert提示框.dialog对话框.model弹窗功能比较有限,有些都不能随意自定义修 ...
- 微信小程序自定义弹窗wcPop插件|仿微信弹窗样式
微信小程序自定义组件弹窗wcPop|小程序消息提示框|toast自定义模板弹窗 平时在开发小程序的时候,弹窗应用场景还是蛮广泛的,但是微信官方提供的弹窗比较有局限性,不能自定义修改.这个时候首先想到的 ...
- 基于JQ的自定义弹窗组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ionic2 tabs 自定义图标
ionic2 tabs 自定义图标 一.准备资源 tabs icon 的svg格式的矢量图片 二.生成字体样式文件 打开icoMoon网站去制作字体文件. 三.使用字体文件 解压下载的文件,将其中的f ...
- 获取浏览器弹窗alert、自定义弹窗以及其操作
web自动化测试第10步:获取浏览器弹窗alert.自定义弹窗以及其操作 - CSDN博客 http://blog.csdn.net/ccggaag/article/details/76573857 ...
- 解决ionic2/ionic3轮播图切换页面或者点击过后不自动轮图
我们在ionic2/ionic3开发的过程中会出现切换页面或者滑动切换轮播图出现轮播图不再轮播的情况,这其实需要一些配置. 首先在运用到轮播图的component中引入 import {ViewChi ...
随机推荐
- [luoguP1922] 女仆咖啡厅桌游吧(奇奇怪怪的树形DP)
传送门 什么鬼的题? 代码 #include <cstdio> #include <cstring> #include <iostream> #define N 1 ...
- vue.js组件之间通讯--父组件调用子组件的一些方法,子组件暴露一些方法,让父组件调用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 【触发器】MySQL触发器使用详解
MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器在MySQL中,创建触发器语法如下: ...
- java 远程调用
1.webservice (soap+http) -aixs -axis2 -xfire—>cxf 2.webservice问题 -基于xml,xml效率,(数据传输效率,xml序列化效率) - ...
- new出来的对象无法调用@Autowired注入的Spring Bean
@Autowired注入Spring Bean,则当前类必须也是Spring Bean才能调用它,不能用new xxx()来获得对象,这种方式获得的对象无法调用@Autowired注入的Bean. 1 ...
- HDU 1241 Oil Deposits (DFS)
题目链接:Oil Deposits 解析:问有多少个"@"块.当中每一个块内的各个"@"至少通过八个方向之中的一个相邻. 直接从"@"的地方 ...
- Gradle学习之创建Task的方法
请通过下面方式下载本系列文章的Github演示样例代码: git clone https://github.com/davenkin/gradle-learning.git Gradle的Pr ...
- 不能不说的C#特性-表达式树
不能不说的C#特性-表达式树 2008-09-18 00:00 by 横刀天笑, 17112 阅读, 14 评论, 收藏, 编辑 最近发生了很多很多事情,频繁的搬家.工作上的事情也挺多的,所以博客更新 ...
- 常用样式制作思路 自定义按钮~自适应布局~常见bug seajs简记 初学者必知的HTML规范 不容忽略的——CSS规范
常用样式制作思路 学习常用样式总结参考来自这里 带点文字链接列表利用:before实现 1 <!DOCTYPE html> 2 <html lang="en" ...
- QSettings读写注冊表、配置文件
简述 普通情况下.我们在开发软件过程中,都会缓存一些信息到本地,能够使用轻量级数据库sqlite.也能够操作注冊表.读写配置文件. 关于QSettings的使用前面已经介绍过了.比較具体,见" ...