移动端重构系列11——弹窗modal

copy from http://www.w3cplus.com/mobile/mobile-terminal-refactoring-modal.html

本系列文章,如果没有特别说明,兼容安卓4.0.4+

设计结构如下:

<header class="header"></header>
<div class="wrap-page">
    <section class="page"></section>
    ...
</div>
<footer class="footer"></footer>
<div class="overlay">
    <section class="modal">
        <div class="modal-hd"></div>
        <div class="modal-bd"></div>
        <div class="modal-ft"></div>
    </section>
</div>

前面的第n篇文章提过这个overlay遮罩层的问题,现在这里说明下为什么这么设计。

一般来说看到的overlay都与modal是兄弟元素,而不是嵌套关系。本来我也是这么设计的,这就是习惯。后来由于modal居中的问题,重新审视了下这个问题:

为什么遮罩层的overlay与弹窗内容是兄弟元素?

说实话真想不出什么理由,非得搞成兄弟元素。后来突然意识到以前的遮罩层如果不采用半透明图片的话,就得使用opacity(ie6-8不支持,通过滤镜模拟),而这个属性会对整个子元素都起作用,而且还没办法通过子元素覆写这个值。这是我能想到的一条最佳理由,如果还有其他理由欢迎交流。

对于高上大的移动端来说,都是rgba时代了,所以opacity回家吃饭先。既然这个对子元素的影响已经不是问题,那么嵌套关系就可以成立,而且嵌套还有一个非常好的理由,水平垂直居中,flex小指一动即可。而兄弟元素的水平垂直居中就得设置modal的top和left的值为50%,然后再设置translate的x和y方向都-50%

所以果断抛弃兄弟元素设计换成嵌套关系。

modal测试

因为overlay采用了flex布局来控制子元素居中,所以不难呢过采用display为none/block来显示隐藏遮罩层overlay,而是通过z-index的层级来控制,而modal部分通过添加删除modal-in这个class来控制显示隐藏

scss代码如下:

.overlay{
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: -1;
    background-color: rgba(0,0,0,.8);
    @include flex-center; // flex水平垂直居中
}
.overlay.active {
  z-index: 980;
}

$modalBarHeight: 40px !default;
$modalBdPadding: 15px;

.modal{
    background-color: #fff;
    border-radius: 5px;
    margin: 0 10px;
    overflow: hidden;
    opacity: 0;
    @include transform(translate3d(0,0,0) scale(0.815));
    @extend %all-transition;
    @include transition-property(transform, opacity);

    &.modal-in{
        opacity: 1;
        @include transform(translate3d(0,0,0) scale(1));
    }

    .modal-hd{
        text-align: center;
        line-height: $modalBarHeight;
        background-color: $primary;
        color: #fff;
    }
    .modal-bd{
        padding: $modalBdPadding;
    }
    .modal-ft{
        border-top: 1px solid $gray;
        @extend %display-flex;
        .btn-modal{
            @include flex(1);
            background-color: #fefefe;
            text-align: center;
            line-height: $modalBarHeight;
            color: $primary;
            &:first-child{
                border-right: 1px solid $gray;
            }
            &:last-child{
                border-right: none;
            }
            &:hover,&:active{
                background-color: #d9d9d9;
            }
        }
    }
}
时间: 2024-07-29 06:27:17

移动端重构系列11——弹窗modal的相关文章

移动端重构系列1——新建空白页面

移动端重构系列-mobile 本系列文章,如果没有特别说明,兼容安卓4.0.4+,测试demo html5文档申明 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> </body> </html> meta标签 <meta nam

移动端重构系列6——图标

移动端重构系列-mobile 本系列文章,如果没有特别说明,兼容安卓4.0.4+ 这里我们把图标分为三种:背景图片,直接绘制,@font-face.如无特殊情况,图标的标签采用i标签 背景图片 首先我们会选择sprite形式,把所有的图标都放在一个大图中,然后考虑到retina屏,所以我们的图标应该设计为实际大小的2倍,然后设置background-size为实际大小.以下面的msg icon为例: 图中的每个icon大小为24px,实际应用时,我们是以12px来使用的: %icon-msg{

移动端重构系列3——重置样式

移动端重构系列-mobile 本系列文章,如果没有特别说明,兼容安卓4.0.4+,测试demo 基于Normalize.css,根据目前我们大家的使用习惯进行了一些清零及移动端的特点添加一些基础样式. html { font-family: "Helvetica Neue", Helvetica, STHeiTi, Arial, sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; font-si

移动端重构系列5——切入切出动画

移动端重构系列-mobile 本系列文章,如果没有特别说明,兼容安卓4.0.4+ 因为后面的几篇文章都需要用到切入切出动画什么的,所以先把这个说下.为了简单起见,我们这里只讨论translate偏移动画(translate比起绝对定位的top/left/right/bottom要高效),而如其他的旋转缩放淡入淡出什么的道理都一样. transition动画 先定义要运动的元素在视觉范围之外,以左方向进入为例,同时定义transition: .demo{ @include translate3D(

小酌重构系列[11]&mdash;&mdash;提取基类、提取子类、合并子类

概述 继承是面向对象中的一个概念,在小酌重构系列[7]--使用委派代替继承这篇文章中,我"父子关系"描述了继承,这是一种比较片面的说法.后来我又在UML类图的6大关系,描述了继承是一种"is a kind of"关系,它更偏向于概念层次,这种解释更契合继承的本质.本篇要讲的3个重构策略提取基类.提取子类.合并子类都是和继承相关的,如果大家对继承的理解已经足够深刻了,这3个策略用起来应该会得心应手. 提取基类 定义:如果有超过一个类有相似的功能,应该提取出一个基类,并

移动端重构系列-移动端html页面优化

对于访问量大的网站来说,前端的优化是必须的,即使是优化1KB的大小对其影响也很大,下面来看看来自ISUX的米随随讲讲移动手机平台的HTML5前端优化,或许对你有帮助和启发. 概述 1. PC优化手段在Mobile侧同样适用      2. 在Mobile侧我们提出三秒种渲染完成首屏指标      3. 基于第二点,首屏加载3秒完成或使用Loading      4. 基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB      5. Mobile侧因手机配置

移动端重构系列12——popup

转载自http://www.w3cplus.com/mobile/mobile-terminal-refactoring-popup.html popup分为两种:一种是内容比较多,直接以全屏显示,如图一:一种是少量内容的popup提示,如图二 先上demo: popup测试 popup page 第一种形式,设计结构如下: <header class="header"></header> <div class="wrap-page"&

【Java重构系列】重构31式之封装集合

2009年,Sean Chambers在其博客中发表了31 Days of Refactoring: Useful refactoring techniques you have to know系列文章,每天发布一篇,介绍一种重构手段,连续发文31篇,故得名“重构三十一天:你应该掌握的重构手段”.此外,Sean Chambers还将这31篇文章[即31种重构手段]整理成一本电子书, 以下是博客原文链接和电子书下载地址: 博客原文:http://lostechies.com/seanchamber

Skype For Business 2015实战系列11:创建并发布拓扑

Skype For Business 2015实战系列11:创建并发布拓扑 Skype For Business Server安装前需要先定义好拓扑,因为我们要在拓扑中的每台服务器上安装 Skype for Business Server 系统,必须首先创建和发布一个拓扑.发布拓扑时,拓扑信息会载入中央管理存储数据库.如果这是 Enterprise Edition 池,您将在初次发布新拓扑时创建中央管理存储数据库.如果是 Standard Edition,则需要运行部署向导中的"准备第一个 St