tl; dr: (इसे यहाँ आज़माएं )
यदि आपके पास निम्न HTML है:
<div id="menu" style="display: none;">
<!-- menu stuff in here -->
<ul><li>Menu item</li></ul>
</div>
<div class="parent">Hover over me to show the menu here</div>
तो आप निम्न जावास्क्रिप्ट कोड का उपयोग कर सकते हैं:
$(".parent").mouseover(function() {
// .position() uses position relative to the offset parent,
var pos = $(this).position();
// .outerWidth() takes into account border and padding.
var width = $(this).outerWidth();
//show the menu directly over the placeholder
$("#menu").css({
position: "absolute",
top: pos.top + "px",
left: (pos.left + width) + "px"
}).show();
});
लेकिन यह काम नहीं करता है!
यह तब तक काम करेगा जब तक मेनू और प्लेसहोल्डर में एक ही ऑफसेट अभिभावक हो। यदि वे नहीं करते हैं, और आपके पास सीएसएस नियमों का पालन नहीं होता है, तो ध्यान दें कि डोम #menuतत्व में उपयोग कहां है :
$(this).append($("#menu"));
लाइन के ठीक पहले जो स्थिति रखता है #menu तत्व को है।
लेकिन यह अभी भी काम नहीं करता है!
आपके पास कुछ अजीब लेआउट हो सकते हैं जो इस दृष्टिकोण के साथ काम नहीं करते हैं। उस स्थिति में, बस jQuery.ui की स्थिति प्लगइन का उपयोग करें (जैसा कि नीचे एक उत्तर में उल्लेख किया गया है ), जो प्रत्येक बोधगम्य घटना को संभालता है। ध्यान दें कि आपको show()कॉल करने से पहले मेनू तत्व पर जाना होगा position({...}); प्लगइन छिपे हुए तत्वों को स्थान नहीं दे सकता है।
2012 में 3 साल बाद अपडेट नोट:
(मूल समाधान यहाँ संग्रहीत है )
इसलिए, यह पता चला है कि मेरे पास यहां की मूल विधि आदर्श से बहुत दूर थी। विशेष रूप से, यह विफल होगा अगर:
- मेनू का ऑफसेट अभिभावक प्लेसहोल्डर का ऑफसेट अभिभावक नहीं है
- प्लेसहोल्डर के पास बॉर्डर / पैडिंग है
सौभाग्य से, jQuery ने 1.2.6 में तरीकों ( position()और outerWidth()) को वापस लाया, जो कि बाद के मामले में सही मूल्यों को खोजना आसान बनाते हैं। पूर्व मामले के लिए,append लिए, प्लेसहोल्डर के मेनू तत्व को आईएनजी काम करता है (लेकिन नेस्टिंग के आधार पर सीएसएस नियमों को तोड़ देगा)।