所以你想用jQuery而不是使用现有的插件来构建你自己的模态框?...好吧,让我们玩吧(正如已经指出的那样,使用弹出窗口不是用户友好的解决方案):
你的清单:
- the trigger
- the shadow layer
- the modal box size and position
- add content to modal and display it along the shadow
1)触发器是一个简单的html链接,用于打开modal里面的内容
<a href="http://jsfiddle.net" class="myModal" data-width="400" data-height="300">open url</a>
...我们将通过data-width
和data-height
(HTML5) 属性传递模态框的大小。
2)shadow
图层是我们将在触发后附加到正文的html结构。我们可以在 js 变量中设置结构
var shadow = "<div class='shadow'></div>";
3)正如我们提到的,模态框的大小是通过data-*
链接中的一些属性来设置的。我们需要做一些数学运算
var modalWidth = $(this).data("width");
var modalHeight = $(this).data("height");
var modalX = (($(window).innerWidth()) - modalWidth) / 2; // left position
var modalY = (($(window).innerHeight()) - modalHeight) / 2; // top position
注意:是我们稍后将进入方法$(this)
的触发器选择器。BTW,该方法需要jQuery v1.7+.myModal
.on("click")
.on()
4) 现在我们需要创建 modal 的 html 结构并传递内容href
。我们将创建一个函数
function modal(url) {
return '<div id="modal"><a id="closeModal" title="close" href="javascript:;"><img src="http://findicons.com/files/icons/2212/carpelinx/64/fileclose.png" alt="close" /></a><iframe src="' + url + '"></iframe></div>';
}
...如您所见,我们的结构包含一个关闭按钮,用于移除模态层和阴影层。该函数在被调用时还获取一个参数 ( url
),该参数允许设置标签的src
属性。iframe
注意:我们必须使用iframe
标签来打开外部 url,但是在使用 iframe 时我们应该始终考虑相同的来源策略和其他安全限制。
所以现在,我们需要在单击.myModal
触发器后将所有事件放在一起,它们将阴影和模态框都附加到正文中,并在单击关闭按钮时将其删除,因此
$(".myModal").on("click", function(e) {
e.preventDefault();
// get size and position
modalWidth = $(this).data("width");
modalHeight = $(this).data("height");
modalX = (($(window).innerWidth()) - modalWidth) / 2;
modalY = (($(window).innerHeight()) - modalHeight) / 2;
// append shadow layer
$(shadow).prependTo("body").css({
"opacity": 0.7
});
// append modal (call modal() and pass url)
$(modal(this.href)).appendTo("body").css({
"top": modalY,
"left": modalX,
"width": modalWidth,
"height": modalHeight
});
// close and remove
$("#closeModal").on("click", function() {
$("#modal, .shadow").remove();
});
}); // on
样式:当然我们需要一些基本的 CSS 样式来使我们的模态元素正常工作:
.shadow {width: 100%; height: 100%; position: fixed; background-color: #444; top: 0; left:0; z-index: 400}
#modal {z-index: 500; position: absolute; background: #fff; top: 50px;}
#modal iframe {width: 100%; height: 100%}
#closeModal {position: absolute; top: -15px; right: -15px; font-size: 0.8em; }
#closeModal img {width: 30px; height: 30px;}
*观看演示
奖励:您还可以绑定事件以使用键keyup
关闭模式escape
$(document).keyup(function(event) {
if (event.keyCode === 27) {
$("#modal, .shadow").remove();
}
}); //keyup
最后注意:代码经过许多改进和优化,但它是许多灯箱所做的基本布局。我的最后一个建议:使用fancybox获得更高级的功能……有时不值得重新发明轮子;)