jQuery: come posso creare un semplice overlay?


95

Come posso creare un overlay di base in jQuery senza interfaccia utente?

Cos'è un plugin leggero?

Risposte:


202

Una sovrapposizione è, in poche parole, una divche rimane fissa sullo schermo (non importa se si scorre) e ha una sorta di opacità.

Questo sarà il tuo CSS per l'opacità cross browser di 0,5:

#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;
}

Questo sarà il tuo codice jQuery (non è necessaria alcuna interfaccia utente). Creerai solo un nuovo elemento con l'ID #overlay. Creare e distruggere il DIV dovrebbe essere tutto ciò di cui hai bisogno.

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

Per motivi di prestazioni potresti voler nascondere il DIV e impostare il display su bloccarlo e nessuno come ne hai bisogno o meno.

Spero che sia d'aiuto!

Modifica: come ha detto così bene @Vitaly, assicurati di controllare il tuo DocType. Leggi di più sui commenti sulle sue scoperte ..


Questo non funziona in IE8. La "sovrapposizione" è mostrata sotto il contenuto. Qualche idea su come risolvere questo problema?
Vitaly

9
Fatto. Ho dovuto cambiare doctype da <! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.1 Transitional // EN"> a <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN"> per rendere IE capisce "posizione: fissa".
Vitaly

3
Bello! Grazie! Condividerò la tua scoperta sulla domanda per rendere più facile il passaggio di Googler! ;)
Frankie

6
Se vuoi aggiungere contenuto a quella sovrapposizione ma non vuoi che sia semi opaco, usa background: # 000000; background-color: rgba (0,0,0, .5) invece delle voci di opacità. Lo sfondo: # 000000 prima che rgba supporti i browser meno recenti.
Shanimal

3
SUGGERIMENTO: per il supporto cross-browser usa un'immagine semitrasparente 1x1px (gif o png) ... quindi puoi facilmente impostarla comebackground-image: url('semi-transparent-pixel.png');
jave.web

16

Ecco una semplice soluzione solo 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();
}

Demo:

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

Sintesi:

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


4
A <table>? Sono gli anni '90?
MECU

3

Ecco una versione completamente incapsulata che aggiunge una sovrapposizione (incluso un pulsante di condivisione) a qualsiasi elemento IMG in cui data-photo-overlay = 'true.

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

Se stai già utilizzando jquery, non vedo perché non potresti utilizzare anche un plugin di sovrapposizione leggero. Altre persone ne hanno già scritte di belle in jquery, quindi perché reinventare la ruota?


1
quale plug-in di overlay leggero è disponibile?
aoghq

15
Perché prendere in prestito una ruota con campanelli e fischietti quando puoi creare una ruota perfettamente accettabile in 3 righe di codice? I plugin non sono sempre la soluzione migliore.
Joel

5
3 righe di codice che potrebbero funzionare bene in FF, ma potrebbero esserci stranezze in alcune versioni di IE. Almeno con uno strumento noto, la maggior parte dei nodi sono già stati risolti.
Dan Breen,

6
Se suggerisci di utilizzare un plugin dovresti suggerirne uno o più che ritieni adatti. Altrimenti la risposta non è molto utile ...
Hinek

@ Hinek - ha riformulato la domanda dopo che ho risposto. Inizialmente aveva chiesto un overlay senza utilizzare una libreria e io stavo suggerendo che non fosse molto più sovraccarico usarne uno piuttosto che essere frustrato implementarne uno da zero.
Dan Breen

1

Si prega di controllare questo plugin jQuery,

blockUI

con questo puoi sovrapporre tutta la pagina o gli elementi, funziona alla grande per me,

Esempi: blocco di un div: $('div.test').block({ message: null });

Blocca la pagina: $.blockUI({ message: '<h1><img src="busy.gif" /> Just a moment...</h1>' }); spero che aiuti qualcuno

Saluti


0

Per overlay intendi il contenuto che si sovrappone / copre il resto della pagina? In HTML, puoi farlo utilizzando un div che utilizza il posizionamento assoluto o fisso. Se doveva essere generato dinamicamente, jQuery potrebbe semplicemente generare un div con lo stile di posizione impostato in modo appropriato.


0

Cosa intendi fare con l'overlay? Se è statico, ad esempio, un semplice riquadro che si sovrappone a un contenuto, usa semplicemente il posizionamento assoluto con CSS. Se è dinamico (credo che questo sia chiamato lightbox), puoi scrivere del codice jQuery di modifica CSS per mostrare / nascondere l'overlay su richiesta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.