jQuery:如何创建简单的叠加层?


95

我如何在没有UI的情况下在jQuery中创建一个非常基本的叠加层?

什么是轻量级插件?

Answers:


202

覆盖是,简单地说,一个div是撑固定在屏幕上(不管你滚动),并具有某种不透明度。

这将是您的跨浏览器不透明度为0.5的CSS:

#overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: #000;
    filter:alpha(opacity=50);
    -moz-opacity:0.5;
    -khtml-opacity: 0.5;
    opacity: 0.5;
    z-index: 10000;
}

这将是您的jQuery代码(无需UI)。您将要创建一个ID为#overlay的新元素。创建和销毁DIV应该是您所需要的。

var overlay = jQuery('<div id="overlay"> </div>');
overlay.appendTo(document.body)

出于性能方面的考虑,您可能希望隐藏DIV并将显示设置为不显示,而无需显示

希望能帮助到你!

编辑:正如@Vitaly所说的那样,请务必检查您的DocType。阅读更多关于他的发现的评论。


这在IE8中不起作用。“覆盖”显示在内容下方。任何想法如何解决这一问题?
维塔利

9
得到它了。必须将文档类型从<!DOCTYPE html PUBLIC“-// W3C // DTD HTML 4.1 Transitional // EN”>更改为<!DOCTYPE html PUBLIC“-// W3C // DTD XHTML 1.0 Transitional // EN”> IE理解“位置:固定”。
Vitaly 2010年

3
真好!谢谢!我将分享您在问题上的发现,以助于Googler轻松过关!;)
弗兰基(Frankie

6
如果要向该叠加层添加内容但不希望它是半透明的,请使用background:#000000; background-color:rgba(0,0,0,.5)而不是不透明度条目。背景:#000000在rgba支持较旧的浏览器之前。
Shanimal 2012年

3
提示:对于跨浏览器支持,请使用1x1px半透明图像(gif或png)...然后,您可以轻松地将其设置为background-image: url('semi-transparent-pixel.png');
jave.web

16

这是一个简单的纯JavaScript解决方案

function displayOverlay(text) {
    $("<table id='overlay'><tbody><tr><td>" + text + "</td></tr></tbody></table>").css({
        "position": "fixed",
        "top": 0,
        "left": 0,
        "width": "100%",
        "height": "100%",
        "background-color": "rgba(0,0,0,.5)",
        "z-index": 10000,
        "vertical-align": "middle",
        "text-align": "center",
        "color": "#fff",
        "font-size": "30px",
        "font-weight": "bold",
        "cursor": "wait"
    }).appendTo("body");
}

function removeOverlay() {
    $("#overlay").remove();
}

演示:

http://jsfiddle.net/UziTech/9g0pko97/

要旨:

https://gist.github.com/UziTech/7edcaef02afa9734e8f2


4
一个<table>?是1990年代吗?
MECU

3

这是一个完全封装的版本,可在data-photo-overlay ='true的任何IMG元素上添加覆盖(包括共享按钮)。

JSFiddle http://jsfiddle.net/wloescher/7y6UX/19/

的HTML

<img id="my-photo-id" src="http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png" alt="Photo" data-photo-overlay="true" />

的CSS

#photoOverlay {
    background: #ccc;
    background: rgba(0, 0, 0, .5);
    display: none;
    height: 50px;
    left: 0;
    position: absolute;
    text-align: center;
    top: 0;
    width: 50px;
    z-index: 1000;
}

#photoOverlayShare {
    background: #fff;
    border: solid 3px #ccc;
    color: #ff6a00;
    cursor: pointer;
    display: inline-block;
    font-size: 14px;
    margin-left: auto;
    margin: 15px;
    padding: 5px;
    position: absolute;
    left: calc(100% - 100px);
    text-transform: uppercase;
    width: 50px;
}

的JavaScript

(function () {
    // Add photo overlay hover behavior to selected images
    $("img[data-photo-overlay='true']").mouseenter(showPhotoOverlay);

    // Create photo overlay elements
    var _isPhotoOverlayDisplayed = false;
    var _photoId;
    var _photoOverlay = $("<div id='photoOverlay'></div>");
    var _photoOverlayShareButton = $("<div id='photoOverlayShare'>Share</div>");

    // Add photo overlay events
    _photoOverlay.mouseleave(hidePhotoOverlay);
    _photoOverlayShareButton.click(sharePhoto);

    // Add photo overlay elements to document
    _photoOverlay.append(_photoOverlayShareButton);
    _photoOverlay.appendTo(document.body);

    // Show photo overlay
    function showPhotoOverlay(e) {
        // Get sender 
        var sender = $(e.target || e.srcElement);

        // Check to see if overlay is already displayed
        if (!_isPhotoOverlayDisplayed) {
            // Set overlay properties based on sender
            _photoOverlay.width(sender.width());
            _photoOverlay.height(sender.height());

            // Position overlay on top of photo
            if (sender[0].x) {
                _photoOverlay.css("left", sender[0].x + "px");
                _photoOverlay.css("top", sender[0].y) + "px";
            }
            else {
                // Handle IE incompatibility
                _photoOverlay.css("left", sender.offset().left);
                _photoOverlay.css("top", sender.offset().top);
            }

            // Get photo Id
            _photoId = sender.attr("id");

            // Show overlay
            _photoOverlay.animate({ opacity: "toggle" });
            _isPhotoOverlayDisplayed = true;
        }
    }

    // Hide photo overlay
    function hidePhotoOverlay(e) {
        if (_isPhotoOverlayDisplayed) {
            _photoOverlay.animate({ opacity: "toggle" });
            _isPhotoOverlayDisplayed = false;
        }
    }

    // Share photo
    function sharePhoto() {
        alert("TODO: Share photo. [PhotoId = " + _photoId + "]");
        }
    }
)();

1

如果您已经在使用jquery,我不明白为什么您也无法使用轻量级的overlay插件。其他人已经在jquery中写了一些不错的文章,那么为什么要重新发明轮子呢?


1
哪个轻量级覆盖插件?
aoghq,2009年

15
当您可以用3行代码创建一个完全可以接受的轮子时,为什么还要借一个带有钟声的轮子呢?插件并不总是最好的解决方案。
乔尔,

5
3行代码在FF中可能会很好地工作,但是在某些版本的IE中可能会有怪癖。至少使用已知的工具,已经解决了大多数问题。
丹·布伦

6
如果您建议使用插件,则应建议一个或多个您认为合适的插件。否则,答案并没有真正的帮助……
Hinek 2010年

@Hinek-我回答后,他改掉了这个问题。他最初是在不使用库的情况下要求覆盖的,我的建议是使用覆盖而不是从头开始实施覆盖会增加很多开销。
丹·布雷恩

1

请检查此jQuery插件,

blockUI

这样,您可以覆盖所有页面或元素,对我来说效果很好,

示例:阻止div: $('div.test').block({ message: null });

屏蔽页面: $.blockUI({ message: '<h1><img src="busy.gif" /> Just a moment...</h1>' }); 希望对某人有所帮助

问候


0

重叠是指重叠/覆盖页面其余部分的内容吗?在HTML中,您可以通过使用使用绝对或固定定位的div来实现。如果需要动态生成,jQuery可以简单地使用适当设置的位置样式生成div。


0

您打算如何处理叠加层?如果它是静态的,比如说一个简单的盒子重叠了一些内容,那么只需在CSS中使用绝对定位即可。如果它是动态的(我相信这称为灯箱),则可以编写一些CSS修改jQuery代码来按需显示/隐藏覆盖。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.