栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > Html/CSS > CSS教程

SCSS移动端页面遮罩层效果的实现及常见问题解决

CSS教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实例
可以兼容安卓4.0.4+:
201669105353262.jpg (320×436)

设计结构如下:

XML/HTML Code复制内容到剪贴板
  1.   
  2.   
  3.       
  4.     ...   
  
  •   
  •   
  •       
  •         
  •   
  •         
  •   
  •         
  •   
  •       
  •   
  • 这个overlay遮罩层的问题,现在这里说明下为什么这么设计。

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

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

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

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

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

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

    scss代码如下:

    CSS Code复制内容到剪贴板
    1. .overlay{   
    2.     position: fixed;   
    3.     top: 0;   
    4.     rightright: 0;   
    5.     bottombottom: 0;   
    6.     left: 0;   
    7.     z-index: -1;   
    8.     background-color: rgba(0,0,0,.8);   
    9.     @include flex-center; // flex水平垂直居中   
    10. }   
    11. .overlay.active {   
    12.   z-index: 980;   
    13. }   
    14.   
    15. $modalBarHeight: 40px !default;   
    16. $modalBdPadding: 15px;   
    17.   
    18. .modal{   
    19.     background-color: #fff;   
    20.     border-radius: 5px;   
    21.     margin: 0 10px;   
    22.     overflow: hidden;   
    23.     opacity: 0;   
    24.     @include transform(translate3d(0,0,0) scale(0.815));   
    25.     @extend %all-transition;   
    26.     @include transition-property(transform, opacity);   
    27.   
    28.     &.modal-in{   
    29.         opacity: 1;   
    30.         @include transform(translate3d(0,0,0) scale(1));   
    31.     }   
    32.   
    33.     .modal-hd{   
    34.         text-align: center;   
    35.         line-height: $modalBarHeight;   
    36.         background-color: $primary;   
    37.         color: #fff;   
    38.     }   
    39.     .modal-bd{   
    40.         padding: $modalBdPadding;   
    41.     }   
    42.     .modal-ft{   
    43.         border-top: 1px solid $gray;   
    44.         @extend %display-flex;   
    45.         .btn-modal{   
    46.             @include flex(1);   
    47.             background-color: #fefefe;   
    48.             text-align: center;   
    49.             line-height: $modalBarHeight;   
    50.             color: $primary;   
    51.             &:first-child{   
    52.                 border-right: 1px solid $gray;   
    53.             }   
    54.             &:last-child{   
    55.                 border-right: none;   
    56.             }   
    57.             &:hover,&:active{   
    58.                 background-color: #d9d9d9;   
    59.             }   
    60.         }   
    61.     }   
    62. }  


    常见问题解决
    移动端模拟弹窗时,遇到一些问题,现总结如下,以加深记忆。

    情况一:
    当body高度大于viewport高度时,在弹窗上滑动时,会遇到body也跟着滑动的现象。

    解决思路:
    禁止touchmove,及overflow:hidden来实现,参考下面代码:

    Javascript Code复制内容到剪贴板
    1.   
    2. var initDialog = (function() {   
    3.     var _tmpl = baidu.template('dialog-tpl', {});   
    4.   
    5.     return {   
    6.         tmpl : $(_tmpl),   
    7.   
    8.           
    9.         create: function() {   
    10.             var me = this,   
    11.                 _tmpl = me.tmpl;   
    12.   
    13.             $('body')   
    14.   
    15.             // 禁用鼠标滚轮滚动   
    16.             .css('overflow', 'hidden')   
    17.   
    18.             .append(_tmpl)   
    19.   
    20.             // 禁止touchmove,阻止body滑动   
    21.             .on('touchmove', function(e) {   
    22.                 e.preventDefault();   
    23.             })   
    24.   
    25.             // 关闭动作   
    26.             .on('tap', 'dialog-close', function() {   
    27.                 me.destroy();   
    28.             })   
    29.         },   
    30.   
    31.           
    32.         destroy: function() {   
    33.             this.tmpl.remove();   
    34.   
    35.             // 解除touchmove绑定、启用滚动   
    36.             $('body').off().css('overflow', 'auto');   
    37.         }   
    38.     }   
    39. })();  

    情况二:
    软键盘弹起时,自定弹窗不能铺满全屏

    解决思路:
    打开弹窗前,通过javascript的blur事件来收起软键盘。

    Javascript Code复制内容到剪贴板
    1. $(“:focus”).blur();  

    情况三:
    实现toast组件时,如果toast使用
    position: fixed;bottom:-3rem;即离底部比较近时,按照我们正常想法应该是键盘把页面往上推,但是在IOS及Andriod UC浏览器中会出现toast被键盘覆盖,即使我们设置z-index也无济于事,因为键盘在整个浏览器的上层。

    解决思路:
    出现toast的时候,监听所有控件的事件,当focus时,动态计算当前位置,重新计算。但是有个问题,不同机型键盘的高度不统一。M端部分参考代码:

    CSS Code复制内容到剪贴板
    1.   
    2.     body {   
    3.         text-align: center;   
    4.     }   
    5.     input[type=text] {   
    6.         width: 80%;    
    7.         height: .8rem;   
    8.         margin-top: .3rem;   
    9.     }   
    10.     .toast {   
    11.         position: fixed;    
    12.         bottombottom: .3rem;    
    13.         left: 50%;    
    14.         margin-left: -1rem;    
    15.         width: 2rem;    
    16.         height: 1rem;    
    17.         background-color: #f00;    
    18.         border-radius: 10px;   
    19.         color: #fff;   
    20.     }   
    21.   
    22.   
    23. "toast">Toast  
    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/215858.html

    CSS教程相关栏目本月热门文章

    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号