jQuery: ¿Cómo puedo crear una superposición simple?

95

¿Cómo puedo crear una superposición realmente básica en jQuery sin UI?

¿Qué es un complemento ligero?

aoghq
fuente

Respuestas:

202

Una superposición es, en pocas palabras, una divque permanece fija en la pantalla (sin importar si se desplaza) y tiene algún tipo de opacidad.

Este será su CSS para una opacidad entre navegadores de 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;
}

Este será su código jQuery (no se necesita interfaz de usuario). Simplemente va a crear un nuevo elemento con el ID # overlay. Crear y destruir el DIV debería ser todo lo que necesita.

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

Por razones de rendimiento, es posible que desee tener el DIV oculto y configurar la pantalla para bloquear y ninguno, ya que lo necesite o no.

¡Espero eso ayude!

Editar: Como @Vitaly lo dijo tan bien, asegúrese de verificar su DocType. Lea más sobre los comentarios sobre sus hallazgos.

Frankie
fuente
Esto no funciona en IE8. La "superposición" se muestra debajo del contenido. Alguna idea de cómo solucionar este problema?
Vitaly
9
Entendido. Tuve que cambiar el tipo de documento de <! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.1 Transitional // EN"> a <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN"> para hacer Es decir, entender "posición: fija".
Vitaly
3
¡Agradable! ¡Gracias! ¡Voy a compartir tu descubrimiento sobre la pregunta para facilitar el paso de Googler! ;)
Frankie
6
Si desea agregar contenido a esa superposición pero no desea que sea semi opaco, use background: # 000000; background-color: rgba (0,0,0, .5) en lugar de las entradas de opacidad. El fondo: # 000000 antes de que rgba admita navegadores más antiguos.
Shanimal
3
SUGERENCIA: Para la compatibilidad con varios navegadores, use una imagen semitransparente de 1x1px (gif o png) ... luego puede configurarla fácilmente comobackground-image: url('semi-transparent-pixel.png');
jave.web
16

Aquí hay una solución simple de 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();
}

Manifestación:

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

Esencia:

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

Tony Brix
fuente
4
A <table>? ¿Es la década de 1990?
MECU
3

Aquí hay una versión completamente encapsulada que agrega una superposición (incluido un botón para compartir) a cualquier elemento IMG donde 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 + "]");
        }
    }
)();
wloescher
fuente
1

Si ya está usando jquery, no veo por qué no podría usar también un complemento de superposición ligero. Otras personas ya han escrito algunos buenos en jquery, así que ¿por qué reinventar la rueda?

Dan Breen
fuente
1
¿Qué complemento de superposición ligero hay?
aoghq
15
¿Por qué pedir prestada una rueda con campanas y silbidos cuando puedes crear una rueda perfectamente aceptable en 3 líneas de código? Los complementos no siempre son la mejor solución.
Joel
5
3 líneas de código que podrían funcionar bien en FF, pero luego podría haber peculiaridades en alguna versión de IE. Al menos con una herramienta conocida, la mayoría de los problemas ya se han resuelto.
Dan Breen
6
Si sugiere utilizar un complemento, debe sugerir uno o más que considere adecuados. De lo contrario, la respuesta no es realmente útil ...
Hinek
@Hinek - reformuló la pregunta después de que respondí. Originalmente pidió una superposición sin usar una biblioteca y yo estaba sugiriendo que no era mucho más complicado usar una en lugar de frustrarse al implementar una desde cero.
Dan Breen
1

Por favor, consulte este complemento de jQuery,

blockUI

con esto puedes superponer toda la página o elementos, funciona muy bien para mí,

Ejemplos: Bloquear un div: $('div.test').block({ message: null });

Bloquear la página: $.blockUI({ message: '<h1><img src="busy.gif" /> Just a moment...</h1>' }); espero que ayude a alguien

Saludos

Pablo Rodríguez V.
fuente
0

Por superposición, ¿te refieres a contenido que se superpone / cubre el resto de la página? En HTML, puede hacer esto usando un div que use posicionamiento absoluto o fijo. Si fuera necesario generarlo dinámicamente, jQuery podría simplemente generar un div con el estilo de posición establecido apropiadamente.

Jacob
fuente
0

¿Qué piensa hacer con la superposición? Si es estático, digamos, un cuadro simple que se superpone a algún contenido, simplemente use el posicionamiento absoluto con CSS. Si es dinámico (creo que esto se llama caja de luz), puede escribir código jQuery que modifique CSS para mostrar / ocultar la superposición a pedido.

Illianthe
fuente