2013-11-23 8 views
5

ठीक है मेरे पास एक लाइटबॉक्स है जो 1 समस्या को छोड़कर काफी अच्छी तरह से काम करता है। छवियों को गतिशील रूप से बनाया गया है, यह प्रत्येक छवि को एक पंक्ति पर प्रदर्शित करने के माध्यम से 10 छवियों और लूप कहने की एक सूची प्राप्त करता है। तो मैं देख सकता हूं कि क्या गलत हो रहा है। इससे कोई फर्क नहीं पड़ता कि मैं किस छवि को लाइटबॉक्स में पहली छवि दिखा रहा हूं, इसलिए मुझे इसे छवि पथ या छवि नाम के साथ एक चर को पारित करने की आवश्यकता है।गतिशील छवि नाम लोड करते समय लाइटबॉक्स समस्या

मैं वास्तव में न कि ज्यादा जावास्क्रिप्ट अनुभव लेकिन क्या im करने के लिए उम्मीद कर रहा एक चर में $popup_item->attributes()->name डाल दिया जाता है, यह onclick घटना के माध्यम से div अंदर पारित और फिर id="light" साथ $popup_item->attributes()->name गुजर के बजाय मैं चर पारित लेकिन यकीन है कि अगर ऐसा नहीं किया है कि सबसे अच्छा तरीका या यहां तक ​​कि जहां

शुरू करने के लिए है, जिसके माध्यम से इस लूप और पॉपअप कंटेनर समय की एक गुच्छा बाहर प्रिंट की तरह एक पाश है:

foreach($xml->config->popup as $popup_item){ 

} 

और html

0,123,
<div id="popup_container"> 
    <!-- We use a lightbox to show the image in full size since large popups are scaled --> 
    <a href = "javascript:void(0)" onclick = "document.getElementById('light').style.display='block';document.getElementById('fade').style.display='block'"> 
     <!-- This is the scaled image --> 
     <!--popups are stored in images/popups/images/ in the following format --> 
     <!--id_popupname.png which we build dynamically below because --> 
     <!-- the popup name will always be same name as the popupimage with the user id preceeding it --> 
     <img src="images/popups/images/<?php echo $item_id . "_" . strtolower($popup_item->attributes()->name) . ".png" ;?>" alt="Popup Image"/> 
    </a> 

    <!--This holds the un-scaled image in the popup box which is hidden initially until you click the image--> 
    <div id="light" class="white_content"> 
     <img src="images/popups/images/<?php echo $item_id . "_" . strtolower($popup_item->attributes()->name) . ".png" ;?>" alt="Popup Image"/></a> 
     <!--This allows you to close the lightbox window from within the lightbox window--> 
     <a href = "javascript:void(0)" onclick = "document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'">Close</a> 
    </div> 
    <div id="fade" class="black_overlay"></div> 
</div> <!--end of popup container--> 

और मामले में लाइटबॉक्स सीएसएस यह मदद करता है:

.black_overlay{ 
    display: none; 
    position: fixed; 
    top: 0%; 
    left: 0%; 
    width: 100%; 
    height: 100%; 
    background-color: black; 
    z-index:1001; 
    -moz-opacity: 0.8; 
    opacity:.80; 
    filter: alpha(opacity=60); 
} 

.white_content { 
    display: none; 
    position: fixed; 
    top: 25%; 
    left: 25%; 
    width: 50%; 
    height: 50%; 
    padding: 16px; 
    border: 16px solid orange; 
    background-color: white; 
    z-index:1002; 
    overflow: auto; 
} 

संपादित करें: असल में मैं 2 चर, $item_id और $popup_item->attributes()->name लेकिन अवधारणा पारित करने के लिए की आवश्यकता होगी है एक ही

+1

आपके पास दूसरे 'img' टैग के बाद एक अतिरिक्त (* खोला *)' 'है .. –

उत्तर

6

आपको हर बार एक ही छवि मिल रही है क्योंकि डोम 'प्रकाश' की आईडी के साथ पहले तत्व का चयन कर रहा है। एचटीएमएल में आईडी अद्वितीय होना चाहिए। इसके बजाय इसे आजमाएं ...

<div id="popup_container"> 
    <a href = "javascript:void(0)" onclick = "document.getElementById('light_<?php echo $item_id ?>').style.display='block';document.getElementById('fade').style.display='block'"> 
     <img src="images/popups/images/<?php echo $item_id . "_" . strtolower($popup_item->attributes()->name) . ".png" ;?>" alt="Popup Image"/> 
    </a> 

    <div id="light_<?php echo $item_id ?>" class="white_content"> 
     <img src="images/popups/images/<?php echo $item_id . "_" . strtolower($popup_item->attributes()->name) . ".png" ;?>" alt="Popup Image"/></a> 
     <a href = "javascript:void(0)" onclick = "document.getElementById('light_<?php echo $item_id ?>').style.display='none';document.getElementById('fade').style.display='none'">Close</a> 
    </div> 
</div> 

इसके अलावा, अपने लूप के बाहर फीड div को ले जाएं। आप केवल यह का एक उदाहरण है, न कि 10 ...

तो अगर आप के बजाय कच्चे PHP में इस निर्माण एक templating इंजन यह कैसा दिखेगा उपयोग कर रहे थे ...

echo '<div id="popup_container">'; 

foreach($xml->config->popup as $popup_item){ 
    echo '<a href = "javascript:void(0)" onclick = "document.getElementById(\'light_'.$popup_item->attributes()->item_id.'\').style.display=\'block\';document.getElementById(\'fade\').style.display=\'block\'"> 
      <img src="images/popups/images/'.$popup_item->attributes()->item_id."_".strtolower($popup_item->attributes()->name).'.png" alt="Popup Image"/> 
     </a> 

     <div id="light_'.$popup_item->attributes()->item_id.'" class="white_content"> 
      <img src="images/popups/images/'.$popup_item->attributes()->item_id."_".strtolower($popup_item->attributes()->name).'.png" alt="Popup Image"/></a> 
      <a href = "javascript:void(0)" onclick = "document.getElementById(\'light_'.$popup_item->attributes()->item_id.'\').style.display=\'none\';document.getElementById(\'fade\').style.display=\'none\'">Close</a> 
     </div>'; 
} 

echo '</div>'; 
echo '<div id="fade" class="black_overlay"></div>'; 

संपादित की जरूरत है: मैं करूंगा नीचे दिए गए कुछ अन्य उत्तरों को देखें। उनमें से कुछ इस प्रभाव को प्राप्त करने का एक बेहतर तरीका देते हैं, हालांकि, मेरे जवाब ने सवाल के साथ निपटाया, मूल कोड कैसे काम कर रहा है।

1

आप का कहना है कि आपका लूप पॉपअप कंटेनर को कई बार प्रिंट करता है ..

इस दृष्टिकोण के साथ एक समस्या यह है कि आप HTML तत्वों पर डुप्लिकेट id के साथ समाप्त हो जाएंगे ..

यह

आप बनाने की जरूरत है (के रूप में आपकी समस्या हो रहा है ) document.getElementById केवल पहले एक से मेल खाता है वापस जाने के लिए कारण होगा आपके id की अद्वितीय (और जावास्क्रिप्ट कि उन्हें लक्षित करता है)

1

आप सीएसएस में div की आईडी का उपयोग कर सकते हैं।

<style> 
#dark { 
    display: none; 
    position: fixed; 
    top: 0%; 
    left: 0%; 
    width: 100%; 
    height: 100%; 
    background-color: black; 
    z-index:1001; 
    -moz-opacity: 0.8; 
    opacity:.80; 
    filter: alpha(opacity=60); 
} 
#light { 
    display: none; 
    position: fixed; 
    top: 25%; 
    left: 25%; 
    width: 50%; 
    height: 50%; 
    padding: 16px; 
    border: 16px solid orange; 
    background-color: white; 
    z-index:1002; 
    overflow: auto; 
} 
</style> 

मैंने यहां एक अच्छा काम किया है जो नौकरी करेगा।

<script> 
function display_lightbox(path) { 
    var image = '<img src="' + path + '" alt="Large Image"/>'; 
    document.getElementById('lightimg').innerHTML=image; 
    document.getElementById('light').style.display='block'; 
    document.getElementById('dark').style.display='block'; 
} 
</script> 

जावास्क्रिप्ट द्वारा उत्पन्न आईएमजी टैग के लिए एक अतिरिक्त कंटेनर वाला लाइटबॉक्स कोड।

<div id="light"> 
    <div id="lightimg"></div> 
    <a href = "javascript:void(0)" onclick = "document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'">Close</a> 
</div> 
<div id="dark"></div> 

जावास्क्रिप्ट फ़ंक्शन का उपयोग करके आपका अंगूठा प्रदर्शन कोड।

<div id="popup_container"> 
    <a href="javascript:void(0)" onclick="display_lightbox('images/popups/images/<?php echo $item_id . "_" . strtolower($popup_item->attributes()->name) . ".png" ;?>');"> 
     <img src="images/popups/images/<?php echo $item_id . "_" . strtolower($popup_item->attributes()->name) . ".png" ;?>" alt="Popup Image"/> 
    </a> 
</div> 

या आप इस छोटे लाइटबॉक्स को कार्यान्वित कर सकते हैं।

http://www.laptoptips.ca/javascripts/shutter-reloaded/

+0

इस पर कोई फ़ीड-बैक? – transilvlad

1

मैं जानता हूँ कि यह एक देर से प्रस्तुत है, लेकिन मैं इसे आजमाइए करना चाहता था।

मैं इस के कई हिस्सों संशोधित तो यह आपके सीएसएस को समायोजित नहीं कर सकता है, लेकिन इसे और अधिक प्रतिबिंब में एक अभ्यास है जावास्क्रिप्ट और साफ कोड और जुदाई के महत्व

कुछ सुविधाओं

  • घटना के उपयोग पर प्रतिनिधिमंडल एक पूरे पॉपअप कंटेनर के लिए ईवेंट हैंडलर
  • व्यवहार और सामग्री
  • आसान रखरखाव की जुदाई, बहुत वर्णनात्मक कोड (ऐसा नहीं ' टी वास्तव में कोई टिप्पणी)

कुछ चेतावनियां

  • मैं html में चीजें बदल, परिवर्तन सीएसएस में आवश्यक हो जाएगा की जरूरत है
  • html में आगे के परिवर्तन होते हैं, तो जावास्क्रिप्ट होगा उन परिवर्तनों को समायोजित करने के लिए
  • यह दूसरी चर का ध्यान नहीं रखता है (मुझे समझ में नहीं आता कि यह क्या है, अगर कोई समझाने की परवाह करता है ...)
  • और मैं भूल गया ... क्षमा करें

और अब ... Ze कोड

<script> 
    (function() { 
    var 
     onDelegatedClick, 
     onLoad, 
     onUnload, 
     enlighten, 
     revert; 
    enlighten = function (node) { 
     var lightbox = document.getElementById('light'); 
     // pass the clicked image source to our lightbox 
     lightbox.querySelector('img').src = node.querySelector('img').src; 
     // make it all visible 
     lightbox.style.display = 'block'; 
     document.getElementById('fade').style.display = 'block'; 
    }; 
    revert = function() { 
     document.getElementById('light').style.display = 'none'; 
     document.getElementById('fade').style.display = 'none'; 
    }; 
    onDelegatedClick = function (event) { 
     // find out where we need behaviour 
     var targetNode = event.target; 
     if (targetNode.tagName !== 'SPAN') {return;} 
     // clicked on the close button 
     if (targetNode.id) revert(); 
     // clicked on any of the images, pass the <span> 
     else enlighten(targetNode); 
    }; 
    onLoad = function() { 
     // add the delegator 
     document.getElementById('popup_container').addEventListener('click',onDelegatedClick,false); 
    }; 
    onUnload = function() { 
     // dont forget to remove the listener 
     document.getElementById('popup_container').removeEventListener('click',onDelegatedClick,false); 
    }; 
    window.addEventListener('load',onLoad,true); 
    window.addEventListener('unload',onUnload,true); 
    }()); 
</script> 
<div id="popup_container"> 
<!-- foreach image --> 
    <!-- clicks have been delegated, no need for anchors, just delegate all clicks --> 
    <span class="lightBoxEnlightener"> 
    <img src="images/popups/images/<?php echo $item_id."_".strtolower($popup_item->attributes()->name).".png" ;?>" alt="Popup Image"/> 
    </span> 
<!-- end foreach --> 
    <!-- only one lightbox and darkbox required --> 
    <div id="light" class="white_content"> 
    <!-- img src is empty, when the enlightening happens, it'll be populated from the clicked span --> 
    <img src="" alt="Popup Image"/> 
    <!-- clicks have been delegated --> 
    <span id="reverter">Close</span> 
    </div> 
    <div id="fade" class="black_overlay"></div> 
</div> 

script टैग कहीं भी या एक अलग फाइल करने के लिए ले जाया जा सकता है, स्पैन की व्यवहार पेटेंट on document load बन जाएगा। मैंने स्पैन चुना क्योंकि वास्तविक anchor टैग से निपटने के लिए कभी-कभी बोझिल होता है।

संबंधित मुद्दे