jQuery: Как создать простой оверлей?

95

Как я могу создать действительно простой оверлей в jQuery без пользовательского интерфейса?

Что такое легкий плагин?

Aoghq
источник

Ответы:

202

Проще говоря, оверлей divостается фиксированным на экране (независимо от того, прокручиваете ли вы его) и имеет своего рода непрозрачность.

Это будет ваш CSS для кроссбраузерной непрозрачности 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;
}

Это будет ваш код jQuery (пользовательский интерфейс не требуется). Вы просто собираетесь создать новый элемент с идентификатором #overlay. Создание и уничтожение DIV должно быть всем, что вам нужно.

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

По соображениям производительности вы можете захотеть скрыть DIV и настроить отображение на блокировку, а не на отсутствие, как вам это нужно или нет.

Надеюсь, это поможет!

Изменить: как хорошо сказал @Vitaly, обязательно проверьте свой DocType. Подробнее читайте в комментариях к его выводам ..

Фрэнки
источник
Это не работает в IE8. «Наложение» показано ниже содержания. Любые идеи, как это исправить?
Виталий
9
Понял. Чтобы сделать IE понимает «позиция: фиксированная».
Виталий
3
Ницца! Благодарность! Я поделюсь вашим открытием по этому вопросу, чтобы упростить поиску Google! ;)
Фрэнки
6
Если вы хотите добавить контент в этот оверлей, но не хотите, чтобы он был полупрозрачным, используйте background: # 000000; background-color: rgba (0,0,0, .5) вместо записей непрозрачности. Фон: # 000000 до того, как rgba поддерживает старые браузеры.
Shanimal
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>? Это 90-е?
MECU
3

Вот полностью инкапсулированная версия, которая добавляет оверлей (включая кнопку общего доступа) к любому элементу IMG, где 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
источник
1

Если вы уже используете jquery, я не понимаю, почему вы также не сможете использовать облегченный плагин наложения. Другие люди уже написали несколько хороших примеров на jquery, так зачем заново изобретать колесо?

Дэн Брин
источник
1
какой есть плагин для облегченного оверлея?
aoghq
15
Зачем одалживать колесо с прибамбасами, если можно создать вполне приемлемое колесо в 3 строчки кода? Плагины не всегда лучшее решение.
Joel
5
3 строки кода, которые могут хорошо работать в FF, но в некоторых версиях IE могут быть странности. По крайней мере, с помощью известного инструмента большинство изломов уже устранено.
Дэн Брин
6
Если вы предлагаете использовать плагин, вы должны предложить один или несколько, которые вы сочтете подходящими. В противном случае ответ будет бесполезен ...
Hinek
@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. Если он динамический (я считаю, что это называется лайтбокс), вы можете написать код jQuery, изменяющий CSS, для отображения / скрытия наложения по запросу.

Illianthe
источник