आईई 8, एफएफ, क्रोम और सफारी के साथ खेलने के बाद आज मेरे साथ अपने प्रश्न का उत्तर दिया गया।
मान लीजिए कि हम न्यूनतम संभव जावास्क्रिप्ट और कोई jQuery के साथ लंबवत रूप से एक div तत्व को फोल्ड करना और प्रकट करना चाहते हैं (इसलिए हम केवल सादगी के लिए ऊंचाई के बारे में बात करेंगे)। एक इनलाइन त्रुटि संदेश बॉक्स हो सकता है जिसे आप पृष्ठ पर अच्छी तरह से दिखाना और छिपाना चाहते हैं। संदेश बॉक्स स्वयं लोचदार है और आप इसके वास्तविक आयामों को नहीं जानते हैं। यहां हल करने के लिए दो सामान्य समस्याएं हैं:
समस्या # 1: ऑफ़सेट हाइट, क्लाइंट हाइट और स्क्रोल हाइट गुण ब्राउज़र में कुख्यात रूप से असंगत हैं। आप उन पर भरोसा नहीं कर सकते हैं, खासकर जब मार्जिन/पैडिंग/सीमा 0 के अलावा किसी अन्य चीज़ पर सेट की जाती है और जब सीएसएस ऊंचाई डिफ़ॉल्ट के अलावा कुछ और होती है (यानी जब वास्तव में तत्व को फोल्ड/प्रकट किया जाता है)। GetComputedStyle() प्राप्त है, लेकिन यह केवल सैन ब्राउज़र पर उपलब्ध है और आईई में नहीं। ओटीओएच, आईई की वर्तमान स्टाइल प्रॉपर्टी गणना मूल्यों को वापस नहीं करती है जैसा आप उम्मीद कर सकते हैं (उदाहरण के लिए आप ऊंचाई मूल्य के रूप में "ऑटो" देख सकते हैं)। यह पता चला है, कोई मार्जिन/पैडिंग/सीमा ऑफसेट के साथ हाइट विश्वसनीय और सभी आधुनिक ब्राउज़रों पर संगत है।
समस्या # 2: आपके div तत्व को एनिमेट करने का एकमात्र तरीका (जिसे मैं जानता हूं) शैली बदलना है।ऊंचाई, जो, हालांकि, पैडिंग और सीमा शामिल नहीं है, और इस प्रकार आप 0 से नीचे बॉक्स को एनिमेट नहीं कर सकते हैं या गैर-शून्य पैडिंग और सीमा वाले तत्वों के लिए 0 से अपनी एनीमेशन शुरू नहीं कर सकते हैं। (इसके शीर्ष पर, आईई 0px को शैली के रूप में स्वीकार नहीं करता है। इसलिए, न्यूनतम आकार 1px वैसे भी होगा)।
दोनों समस्याओं का समाधान डिफ़ॉल्ट बॉक्स के साथ किसी अन्य div के साथ अपने बॉक्स को लपेटना है, यानी पैडिंग/मार्जिन/सीमा सभी 0 पर सेट है, जो एक नए div के लिए डिफ़ॉल्ट शैली है। जिस बॉक्स को आप फोल्ड करना चाहते हैं और सामने आना चाहिए वह अंदर होना चाहिए और वांछित होने पर केवल मार्जिन सेटिंग, पैडिंग और सीमा नहीं होनी चाहिए। इस तरह, आप (1) ऑफसेट हाइट के माध्यम से अपने लोचदार आंतरिक बॉक्स की ऊंचाई को विश्वसनीय रूप से निर्धारित करने में सक्षम होंगे, और (2) 1 पिक्सेल से बाहरी बॉक्स की ऊंचाई को एनिमेट करें।
तो, चलो कहते हैं कि हम इस चेतन करना चाहते हैं:
<div id="errmsg" style="display:none">
<div class="errmsg">
<div class="window-close" onClick="javascript:showErrMsg('', this.parentNode.parentNode)"></div>
<div id="errmsg.text"></div>
</div>
</div>
बॉक्स शुरुआत में अदृश्य है। "विंडो-क्लोज़" क्लास दाईं ओर एक छोटा सा बॉक्स है जिसमें क्रॉस के साथ बॉक्स को छिपाने के लिए उपयोग किया जाता है। खाली स्ट्रिंग के साथ showErrMsg() को कॉल करना संदेश बॉक्स को फोल्ड करता है (नीचे देखें)। यह त्रुटि संदेश बॉक्स चेतन करने के लिए
मेरे जावा स्क्रिप्ट कोड के रूप में इस प्रकार है (मैं भी अस्पष्टता जो यहाँ सादगी के लिए छोड़ दिया जाता है एनिमेट कर रहा हूँ) है:
var ANIMATE_STEPS = 10;
var ANIMATE_DELAY = 20;
function _obj(obj, parent)
{
if (typeof obj == 'string')
obj = (parent ? parent : document).getElementById(obj);
return obj;
}
function _setStyleHeight(obj, h)
{
_obj(obj).style.height = Math.round(h) + 'px';
}
function _animateVertFold(obj, cur, by, lim)
{
obj = _obj(obj);
cur += by;
if (by < 0 && cur <= 1)
{
obj.style.display = 'none';
_setStyleHeight(obj, 1); // IE doesn't accept 0
}
else if (by > 0 && cur >= lim)
{
_setStyleHeight(obj, lim);
}
else
{
_setStyleHeight(obj, cur);
setTimeout('_animateVertFold(\'' + obj.id + '\', ' +
cur + ', ' + by + ', ' + lim + ')', ANIMATE_DELAY);
}
}
function _expandElem(obj)
{
obj = _obj(obj);
if (obj.style.display == 'none')
{
obj.style.overflow = 'hidden';
_setStyleHeight(obj, 1);
obj.style.display = 'block';
var innerDiv = obj.getElementsByTagName('div')[0]; // better way?
var h = innerDiv.offsetHeight;
if (h > 0)
_animateVertFold(obj, obj.offsetHeight, h/ANIMATE_STEPS, h);
}
}
function _shrinkElem(obj)
{
obj = _obj(obj);
if (!obj.style.display || obj.style.display != 'none')
{
obj.style.display = 'block';
obj.style.overflow = 'hidden';
var h = obj.offsetHeight;
_animateVertFold(obj, h, - h/ANIMATE_STEPS, h);
}
}
function showErrMsg(msg, id)
{
id || (id = '_errmsg');
obj = _obj(id);
if (msg != '')
{
_obj(id + '.text').innerHTML = msg;
_expandElem(obj);
}
else
_shrinkElem(obj);
}
आप showErrMsg (कॉल कर सकते हैं) और कोड ख्याल रखेंगे शेष में से। आपको विंडो-क्लोज़ क्लास को जीयूआई क्लोज-विंडो बटन की नकल करने वाली चीज़ के रूप में परिभाषित करना होगा। और निश्चित रूप से "errmsg" वर्ग को अलग-अलग पृष्ठभूमि रंग, सीमा और संभावित रूप से फ़ॉन्ट चेहरे वाले बॉक्स के रूप में भी।
कोई भी दृष्टिकोण निर्धारित करने के लिए हमेशा jQuery (या आपकी पसंद का एक अन्य टूलकिट/लाइब्रेरी) स्रोत देख सकता है, और फिर अलग-अलग वातावरण में आवश्यक विभिन्न quirks को रद्द (या नियम)। –
pst, यह हमेशा पाठ्यक्रम का विकल्प होता है, लेकिन मैंने सोचा कि किसी को केवल इन 4 ब्राउज़रों के उचित ज्ञान के साथ, या जो पहले किया गया है, वह तुरंत जवाब देगा। और jQuery को समझना आसान हो सकता है या नहीं भी हो सकता है। – mojuba
मुझे लगता है कि हाइट()/चौड़ाई() समस्या को हल करने के लिए एनीमेशन को अच्छा लगने के रूप में समय लेने वाला नहीं होगा, जो आपके लिए jquery करता है। – tster