手机弹窗组件(原生js)

Demo:http://liuyanzhi08.github.io/components/modal/

Repo: https://github.com/liuyanzhi08/swipe


/***********************************************************************

  Modal component

  @author <702368372atqqcom> lyz

  @option
    - title   {String}   Modal title html
    - content {String}   Modal content html
    - close   {Function} Callback when modal is closed
    - scroll  {Boolean}  Can document scroll

  @usage
    modal({
      title: '<span>foo</span>',
      content: '<div>bar</div>',
      close: function() {
        console.log('Modal closed.');
      },
      scoll: false
    })
  
  @version 0.0.1

 ***********************************************************************/

define(function() {
  function modal(options){
    var defaults = {
      title: '提示',
      content: 'Hello sg-modal',
      close: null,
      scroll: true
    };

    // Costomer options
    options = options ? options : {};
    options.title = options.title === undefined ? defaults.title : options.title;
    options.content = options.content === undefined ? defaults.content : options.content; 
    options.close = options.close === undefined ? defaults.close : options.close;
    options.scroll = options.scroll === undefined ? defaults.scroll : options.scroll; 

    // Display modal
    var maskCreated = document.querySelector('.sg-modal-mask');
    maskCreated ? fillModal() : createModal();

    var modal = document.querySelector('.sg-modal');
    var dialog = document.querySelector('.sg-modal-dialog');
    var closeBtn = document.querySelector('.sg-modal-close');

    modal.style.display = 'block';

    // Center the dialog
    var clientHeight =  document.documentElement.clientHeight;
    var clientWidth =  document.documentElement.clientWidth;
    var dialogHeight = dialog.offsetHeight;
    var dialogWidth = dialog.offsetWidth;
    dialog.style.top = (clientHeight - dialogHeight) / 2 + 'px';
    dialog.style.left = (clientWidth - dialogWidth) / 2 + 'px';

    // Bind modal close
    closeBtn.addEventListener('click', closeHandler);

    // Prevent document scroll
    if (!options.scroll) {
      document.addEventListener('touchmove', preventDefault);
      document.addEventListener('mousewheel', preventDefault);
    }
    
    function closeHandler(){
      modal.style.display = 'none';
      closeBtn.removeEventListener('click', closeHandler);
      if (options.close) {
        options.close();
        options.close = null;
      }
      if (!options.scroll) {
        document.removeEventListener('touchmove', preventDefault);
        document.removeEventListener('mousewheel', preventDefault);
      }
    }

    function createModal() {
      var str, tmp;
      str =  '<div class="sg-modal" style="display:none;position:fixed;left:0;top:0;width:100%;height:100%;z-index:999999">';
      str += '<div class="sg-modal-mask" style="position:fixed;width:100%;height:100%;background:#000;opacity:0.3;"></div>';
      str += '<div class="sg-modal-dialog" style="position:absolute;backgound:#fff;">';
      str += '  <div class="sg-modal-close" style="display:block;position:absolute;right:0;top:0;font-size:28px;color:#999;">×</div>';
      str += '  <h1 class="sg-modal-title" style="height:40px;line-height:40px;padding-left:10px;background:#fff;min-width:50px">' + options.title + '</h1>';
      str += '  <div class="sg-modal-content" style="background:#fff;">' + options.content + '</div>';
      str += '</div>'
      str += '</div>';
      tmp = document.createElement('div');
      tmp.innerHTML = str;
      document.body.appendChild(tmp.firstElementChild);
    }

    function fillModal() {
      var title = document.querySelector('.sg-modal-title');
      var content = document.querySelector('.sg-modal-content');
      title.innerHTML = options.title;
      content.innerHTML = options.content;
    }

    function preventDefault(e) {
      e.preventDefault()
    }
  }

  modal.close = function() {
    var closeBtn = document.querySelector('.sg-modal-close');
    closeBtn && closeBtn.click();
  }

  return modal;
})
本文出自:http://blog.csdn.net/nancle/article/details/45340661

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值