jQuery: ฉันจะสร้างภาพซ้อนทับแบบธรรมดาได้อย่างไร?


95

ฉันจะสร้างภาพซ้อนทับพื้นฐานใน jQuery โดยไม่มี UI ได้อย่างไร

ปลั๊กอินน้ำหนักเบาคืออะไร?

คำตอบ:


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 ของคุณ (ไม่จำเป็นต้องใช้ UI) คุณกำลังจะสร้างองค์ประกอบใหม่ด้วย ID #overlay การสร้างและทำลาย DIV ควรเป็นสิ่งที่คุณต้องการ

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

สำหรับเหตุผลประสิทธิภาพคุณอาจต้องการที่จะมี DIV ที่ซ่อนอยู่และการตั้งค่าการแสดงผลเพื่อป้องกันและไม่มีใครตามที่คุณต้องการหรือไม่

หวังว่าจะช่วยได้!

แก้ไข:ในฐานะที่เป็น @Vitaly ให้ดีอย่าลืมตรวจสอบ DocType ของคุณ อ่านเพิ่มเติมเกี่ยวกับความคิดเห็นเกี่ยวกับการค้นพบของเขา ..


สิ่งนี้ใช้ไม่ได้ใน IE8 "การวางซ้อน" แสดงอยู่ด้านล่างเนื้อหา มีความคิดอย่างไรในการแก้ไขปัญหานี้
Vitaly

9
เข้าใจแล้ว ต้องเปลี่ยนหลักจาก <! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.1 Transitional // EN"> เป็น <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN"> เพื่อให้ IE เข้าใจ "ตำแหน่ง: คงที่"
Vitaly

3
ดี! ขอบคุณ! ฉันจะแบ่งปันการค้นพบของคุณเกี่ยวกับคำถามเพื่อให้ Googler เดินผ่านไปได้ง่ายขึ้น! ;)
Frankie

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

นี่เป็นวิธีแก้ปัญหาเฉพาะจาวาสคริปต์ง่ายๆ

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

นี่คือเวอร์ชันที่ห่อหุ้มอย่างสมบูรณ์ซึ่งเพิ่มการวางซ้อน (รวมถึงปุ่มแชร์) ให้กับองค์ประกอบ 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 + "]");
        }
    }
)();

1

หากคุณใช้ jquery อยู่แล้วฉันไม่เห็นว่าทำไมคุณถึงไม่สามารถใช้ปลั๊กอินโอเวอร์เลย์ที่มีน้ำหนักเบาได้ คนอื่น ๆ ก็เขียน jquery ดีๆแล้วทำไมต้องประดิษฐ์วงล้อขึ้นมาใหม่?


1
มีปลั๊กอินโอเวอร์เลย์น้ำหนักเบาตัวใด
aoghq

15
ทำไมต้องยืมวงล้อที่มีระฆังและนกหวีดในเมื่อคุณสามารถสร้างวงล้อที่ยอมรับได้อย่างสมบูรณ์ในรหัส 3 บรรทัด ปลั๊กอินไม่ใช่ทางออกที่ดีที่สุดเสมอไป
Joel

5
รหัส 3 บรรทัดที่อาจทำงานได้ดีใน FF แต่อาจมีความไม่ชอบมาพากลใน IE บางเวอร์ชัน อย่างน้อยด้วยเครื่องมือที่เป็นที่รู้จักข้อบกพร่องส่วนใหญ่ได้รับการแก้ไขแล้ว
Dan Breen

6
หากคุณแนะนำให้ใช้ปลั๊กอินคุณควรแนะนำอย่างน้อยหนึ่งรายการที่คุณคิดว่าเหมาะสม มิฉะนั้นคำตอบจะไม่เป็นประโยชน์จริงๆ ...
Hinek

@ ไฮเนค - เขาเขียนคำถามใหม่หลังจากที่ฉันตอบ เดิมทีเขาขอการวางซ้อนโดยไม่ใช้ห้องสมุดและฉันแนะนำว่ามันไม่ได้มีค่าใช้จ่ายมากไปกว่าที่จะใช้หนึ่งมากกว่าที่จะผิดหวังกับการใช้งานตั้งแต่เริ่มต้น
Dan Breen

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 เพื่อแสดง / ซ่อนโอเวอร์เลย์ตามต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.