2016-05-17 19 views
15

के अंदर इनपुट पर ध्यान केंद्रित करते समय अनचाहे स्क्रॉलिंग सफारी और क्रोम में परीक्षण - एक ही परिणाम, इसलिए मुझे लगता है कि यह आईओएस मुद्दा है।आईओएस सफारी/क्रोम - मोडल

यह तब होता है जब मोडल के अंदर कोई इनपुट होता है और मैं उस इनपुट को टैप करता हूं। उसी पल में इनपुट को फोकस मिला और मूल आईओएस कीबोर्ड दिखाई दे रहा है।

उसी क्षण में मोडल के नीचे पृष्ठ स्वचालित रूप से इसकी ऊंचाई के 50% तक स्क्रॉल हो जाता है। यह व्यवहार पूरी तरह से अवांछित है और मुझे इस डिफ़ॉल्ट आईओएस "फीचर" को रोकने के लिए कोई संकेत नहीं है।

डेमो:

enter image description here

+0

डोम परिवर्तनों के लॉग प्राप्त करने के लिए क्रोम के लिए DOMListener का उपयोग करें। मुझे मोडल खोलने और 1 मीडिया क्वेरी स्टाइल जोड़ने पर 59 बदलाव हुए। आकार बदलने वाले हैंडलर भी देखें। Posiiotn फिक्स्ड या ओवरफ्लो छुपा भी मुद्दा हो सकता है। – Pinal

+0

उत्तर के लिए @ पिनिन धन्यवाद! मैंने गतिशील रूप से 'ओवरफ्लो: छुपा' शरीर को जोड़ने की कोशिश की, लेकिन यह इस मामले में मदद नहीं करता है। शायद 'स्थिति: निश्चित' मुद्दा है। क्या आप कृपया कुछ और बता सकते हैं कि यह क्यों जारी किया जा सकता है और मैं इसे कैसे ठीक कर सकता हूं। –

+1

बस ध्यान दिया कि 'स्थिति: फिक्स्ड 'आईओएस कोरग्राफिक्स प्रस्तुत करने में कुछ समस्याएं हैं। आपके मामले में मैं आपको सभी 'स्थिति: फिक्स्ड' को पूर्ण करने और फिर से परीक्षण करने के लिए सिफारिश करता हूं। इसके अलावा आप github पर समाधान ढूंढ सकते हैं (उदाहरण के लिए - https://github.com/scottjehl/Device-Bugs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen++fixed++ios+) – Pinal

उत्तर

6

बस यहाँ एक जवाब को जोड़ने के लोग इस सवाल (rather than your other question, which has a great demo to illustrate this issue)

हम काम पर एक समान मुद्दे का सामना कर रहे पर आते हैं। जैसा कि आपने बताया है, ऑफसेट हमेशा पृष्ठ की ऊंचाई का ~ 50% है, जो कि आपका प्रारंभिक ऑफसेट कहां है, इस पर ध्यान दिए बिना होता है।

अतीत में, जब मैंने पहले iOS संस्करण के साथ एक समान "कूद" (हालांकि, बहुत कम नाटकीय कूद) मनाया, मैं आमतौर पर body (which allows overflow: hidden to properly work) को position: fixed (या relative) लगाने से यह चारों ओर काम किया है।

हालांकि, यदि उपयोगकर्ता स्क्रॉल हो गया है, तो उपयोगकर्ता को पृष्ठ के शीर्ष पर वापस कूदने का अप्रत्याशित परिणाम है।

इसलिए, यदि आप कुछ JavaScript के साथ इस मुद्दे को संबोधित करने के लिए खुले हैं, तो यहाँ एक फिक्स है/हैक मैं एक साथ फेंक दिया गया है:

// Tapping into swal events 
onOpen: function() { 
    var offset = document.body.scrollTop; 
    document.body.style.top = (offset * -1) + 'px'; 
    document.body.classList.add('modal--opened'); 
}, 
onClose: function() { 
    var offset = parseInt(document.body.style.top, 10); 
    document.body.classList.remove('modal--opened'); 
    document.body.scrollTop = (offset * -1); 
} 

और क्या सीएसएस की तरह दिखता है:

.modal--opened { 
    position: fixed; 
    left: 0; 
    right: 0; 
} 

यहां अपने डेमो पेज (आपके अन्य प्रश्न से) का एक कांटा है, उदाहरण के लिए: https://jpattishall.github.io/sweetalert2/ios-bug.html

और उन लोगों के लिए जो अधिक सामान्य फिक्स ढूंढ रहे हैं, आप कुछ कर सकते हैं जैसे ething/जब खोलने एक मॉडल को बंद करने के बाद:

function toggleModal() { 
    var offset; 
    if (document.body.classList.contains('modal--opened')) { 
     offset = parseInt(document.body.style.top, 10); 
     document.body.classList.remove('modal--opened'); 
     document.body.scrollTop = (offset * -1); 
    } else { 
     offset = document.body.scrollTop; 
     document.body.style.top = (offset * -1) + 'px'; 
     document.body.classList.add('modal--opened'); 
    } 
} 

संपादित करें: "स्थानांतरण/unshifting" पर डेस्कटॉप बचने के लिए, मैं सुविधा का पता लगाने/ua केवल मोबाइल सफारी को यह लागू करने के लिए सूँघने सुझाव है।

+0

आईई में बस fyi, 'document.body.scrollTop' हमेशा 0 है और यह सेटिंग स्क्रॉल नहीं करता है। इसके बजाय 'window.scroll (x, y)' का उपयोग करें और IE में 'window.pageYOffset' के माध्यम से scrollTop प्राप्त करें –

0

मैं 100% यकीन नहीं है, लेकिन मैं निम्नलिखित कल्पना कर सकता:

जब कुंजीपटल दिखाई देता है, खिड़की ऊंचाई कम हो जाती है, लेकिन scrollTop मूल्य अब भी है वही, इसलिए साइट उस मान पर कूद जाती है। मोडल खुला होने पर आप body पर overflow:hidden जोड़ सकते हैं। यह मॉडलिंग के पीछे "पीछे" स्क्रॉलिंग को अवरुद्ध करेगा और शायद आपकी समस्या का समाधान करेगा।

+0

उत्तर @Kilian के लिए धन्यवाद! दुर्भाग्यवश यह चाल मेरी समस्या को ठीक नहीं करती है। इसके अलावा, जब मैं डेस्कटॉप ब्राउज़र में 'अतिप्रवाह: छुपा' जोड़ता हूं, डेस्कटॉप ब्राउज़र में यह नकारात्मक प्रभाव https://i.imgur.com/HDOxzmm.gif दिखाई देता है (शरीर स्क्रॉलबार शो/छुपाएं पर बाएं-दाएं चला जाता है)। –

+0

हम्म, आप उस मुद्दे से बचने के लिए 'बॉडी' के बजाय 'ओवरफ्लो' को '# wrapper' में जोड़ सकते हैं। और फिर, 'निश्चित' के बजाय मोडल में 'स्थिति: पूर्ण' जोड़ें। क्या आपने पहले ही कोशिश की है? लेकिन यदि आप 'ओवरफ्लो: छुपा' के बिना 'स्थिति: पूर्ण' जोड़ते हैं तो पृष्ठ मोडल खोलने पर शीर्ष पर कूद जाएगा। –

0

मुझे इस मुद्दे का भी अनुभव हुआ है। एक संक्षिप्त स्पष्टीकरण यह है कि आईओएस सफारी किसी भी इनपुट पर ध्यान केंद्रित करने का प्रयास करेगा जो इस पर केंद्रित है और इस विशेष मामले में केंद्रित तत्व एक निश्चित स्थान के भीतर है। सफारी स्क्रीन पर तत्व को केंद्र में रखना चाहता है, इसलिए पृष्ठभूमि स्क्रॉलिंग को निश्चित स्थिति तत्व ढूंढने के साथ संघर्ष करना प्रतीत होता है।

एक संभावित फिक्स इनपुट क्षेत्र में touchstart ईवेंट श्रोता जोड़ने और ओवरले की वर्तमान स्थिति की गणना करना है, स्थिति को पूर्ण करने के लिए स्थिति को बदलें और ऊपर/बाएं स्थिति को अपडेट करें ताकि ओवरले को स्क्रीन पर रखा जा सके जब तय किया गया है, और अंत में इनपुट पर फोकस/धुंधला छोड़ते समय ओवरले को रीस्ट पोजिशनिंग पर रीसेट करने के लिए नया blur श्रोता जोड़ें। यह पृष्ठ को स्क्रॉलिंग से रोकना चाहिए। मैं touchstart का उपयोग करने का सुझाव देता हूं क्योंकि इसे focus ईवेंट से पहले ट्रिगर करना चाहिए, जिस स्थिति में पृष्ठ पहले ही स्क्रॉलिंग शुरू कर देगा। focus ईवेंट ट्रिगर होने पर सफारी पूर्ण स्थान ओवरले ढूंढने और केंद्र में सक्षम होना चाहिए।

0

इसलिए मैंने इसे हल किया है और अपने आईफोन 5 पर परीक्षण किया है, आईपैड को जांचने के लिए नहीं है। मैंने अपने समाधान में overflow:hidden अक्षम कर दिया है, आप जोड़ सकते हैं, यदि आप सभी मॉडलों के लिए सभी को स्क्रॉल अक्षम करना चाहते हैं। समाधान एचटीएमएल और बॉडी तत्व दोनों के लिए मूल रूप से ऊंचाई और स्थिति संपत्ति जोड़ने के लिए है।

html, body { 
    position:relative; 
    /*overflow:hidden;*/ 
    height: 100%; 
} 

तो, यह है कि केवल जब आप इनपुट, ऊंचाई और स्थिति पर ध्यान केंद्रित करने में परिभाषित किया जाएगा, मैं पहले से ही अपने रेपो से इस समाधान कोड किया है, मैं तुम्हें एक पुल अनुरोध भेजेगा। मैंने आपके गल्प सेटअप में ब्राउज़र सिंक भी जोड़ा है। इसलिए, अब किसी भी डिवाइस पर परीक्षण करना आसान होगा।

चीयर्स!

संपादित करें: एक और तरीका, अगर उपरोक्त समाधान किसी कारण से काम नहीं करता है। तो,

/* 
    * @summary touch handler; will remove touch ability 
    * @author yeomann 
    */ 
    function Touchyhandler(e) { 
    e.preventDefault(); 
    } 

और बाद में व्यावहारिक आईओएस 9.3 पर परीक्षण किया इस

//to add 
document.addEventListener('touchmove', Touchyhandler, false); 
//to remove 
document.removeEventListener('touchmove', Touchyhandler); 

js ऊपर समाधान की तरह जोड़ सकते हैं और स्पर्श श्रोता को हटा दें।2 मेरे लिए आकर्षण की तरह काम]

0

स्क्रॉलिंग से पृष्ठ को रोकने के लिए, दोनों एक्स, और वाई अक्ष में, हम overflow: hidden; सीएसएस में विशेषता का उपयोग करते हैं।

तो अगर हम शरीर को यह लागू होते हैं,

body { 
    overflow: hidden !important; 
} 

यह सही काम करना चाहिए?

वास्तव में, यह वास्तव में काम नहीं करता है, क्योंकि आपने पूरे पृष्ठ के लिए पूरे समय के लिए x और y स्क्रॉलिंग अक्षम कर दी है।

इसे बाईपास करने के लिए, हम मोडल सक्रिय होने पर शरीर को कक्षा जोड़ने के लिए एक जावास्क्रिप्ट का उपयोग कर सकते हैं।

सबसे पहले हमें अपने शरीर में एक आईडी जोड़नी होगी, <body id="body"> यह जावास्क्रिप्ट को शरीर को पहचानने की अनुमति देता है।

दूसरा, हमें अपने मोडल, <div id="modal"> पर एक आईडी जोड़नी होगी, जिससे जावास्क्रिप्ट को मोडल को पहचानने की इजाजत मिल जाएगी।

<script type="text/javascript"> 
    function modalActive() { 
     if (document.getElementById("modal").classList.contains("active")) { 
      document.getElementById("body").classList.add("modal-active"); 
     } else { 
      getElementById("modal").classList.remove("active")); 
      getElementById("body").classList.remove("modal-active"));   
     } 
    } 
</script> 

दोनों बटन कि शुरूआत, और क्रिया बंद कर देता है के लिए, हम एक ऑनक्लिक ईवेंट जोड़ना होगा,

<button onclick="modalActive()">Click Me!</button>

उस के शीर्ष पर हम सीएसएस फ़ाइल को यह जोड़ना होगा।

body { 
    overflow: initial !important; 
} 

body.modal-active { 
    overflow: hidden !important; 
} 

और वहां हम जाते हैं।

0

मैंने कई चीजों की कोशिश की जो HTML पृष्ठ पर बाउंसिंग मोडल इनपुट के लिए काम करते थे। मेरे लिए काम करने वाला सबसे आसान समाधान पृष्ठ पर खुला होने पर बॉडी टैग में निम्नलिखित शैलियों को जोड़ रहा था।

position: fixed; 
width: 100%; 
संबंधित मुद्दे