स्थिति: फिक्स्ड iPad और iPhone पर काम नहीं करता है


132

मैं कुछ समय से iPad में निश्चित स्थिति से जूझ रहा था। मैं iScroll को जानता हूं और यह हमेशा काम नहीं करता है (यहां तक ​​कि उनके डेमो में भी)। मुझे यह भी पता है कि Sencha के लिए एक ठीक है, लेकिन मैं नहीं कर सकता Ctrl+ Fकि सुधार के लिए स्रोत कोड।

मैं उम्मीद कर रहा हूं कि किसी के पास समाधान हो सकता है। समस्या यह है कि निश्चित पोस्ट किए गए तत्व अपडेट नहीं होते हैं जब उपयोगकर्ता iOS संचालित मोबाइल सफारी पर पैन अप / अप करता है।


2
ऐसा लगता है कि jQuery के मोबाइल 1.1 ने इस समस्या को हल किया: jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0
टॉवर


कई एसओ प्रश्नों की संभावित डुप्लिकेट। देखें gist.github.com/avesus/... जानकारी के लिए।
ब्रायन हाक

जवाबों:


66

बहुत सारे मोबाइल ब्राउज़र जानबूझकर position:fixed;उन आधारों का समर्थन नहीं करते हैं जो तय तत्व छोटे पर्दे पर रास्ते में मिल सकते हैं।

Quirksmode.org साइट में एक बहुत अच्छा ब्लॉग पोस्ट है जो समस्या की व्याख्या करता है: http://www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html

यह पेज अनुकूलता चार्ट के लिए भी देखें कि कौन सा मोबाइल ब्राउज़र समर्थन करता है position:fixed;: http://www.quirksmode.org/m/css.html

(लेकिन ध्यान दें कि मोबाइल ब्राउज़र की दुनिया बहुत तेज़ी से आगे बढ़ रही है, इसलिए इस तरह की टेबल लंबे समय तक अद्यतित नहीं रह सकती हैं!)

अपडेट: आईओएस 5 और एंड्रॉइड 4 दोनों की स्थिति के बारे में बताया गया है: अब निश्चित समर्थन।

मैंने आज Apple स्टोर में iOS 5 का परीक्षण किया और पुष्टि कर सकता हूं कि यह निश्चित स्थिति के साथ काम करता है। हालांकि एक निश्चित तत्व के आसपास ज़ूम इन और पैनिंग के मुद्दे हैं।

मुझे यह अनुकूलता तालिका आज तक अधिक उपयोगी लगी और एक से अधिक उपयोगी थी: http://caniuse.com/#search=.net

यह Android, ओपेरा (मिनी और मोबाइल) और iOS पर जानकारी की तारीख तक है।


position:device-fixedबेमानी होगी। position:fixedबस W3C विनिर्देशों के लिए काम करना चाहिए।
तलवी वटिया

@ तालवीवाटिया - device-fixedसमाधान मेरे उत्तर का हिस्सा नहीं था। यह एक सुझाव के रूप में योग्यता हो सकता है या नहीं हो सकता है, लेकिन लिंक का कारण उनके सुझाए गए समाधान के बजाय समस्या का स्पष्टीकरण था। किसी भी मामले में, यह जवाब पोस्ट किए जाने के बाद से चीजें बहुत आगे बढ़ गई हैं (जैसा कि मैंने कहा कि यह होगा), और बहुत सारे नए डिवाइस समर्थन करते हैं fixed। आपको अभी भी पुराने उपकरणों से निपटने की आवश्यकता है जो हालांकि नहीं हैं।
स्पडली

54
इसलिए मैं उत्सुक हूं, कि वास्तव में समस्या का हल आपके हाथ में क्या है? संभवतः उपयोगी होते हुए आपके द्वारा लिंक किए गए लिंक समस्या को हल नहीं करते हैं। घबराने की बात नहीं है, लेकिन लोग उन उत्तरों को उखाड़ फेंकते हैं जो वास्तव में एसओ पर यहां जवाब नहीं हैं।
तलवी वटिया

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

वास्तव में स्थिति: पैमाने 1 के लिए निश्चित काम करता है, लेकिन जब उपयोगकर्ता ipad zooms करता है तो यह ठीक काम नहीं करेगा। स्थिति: डिवाइस-फिक्स्ड मौजूद हैं ?? सफारी आईओएस के लिए वैध सीएसएस विशेषता है?
ccsakuweb

37

फिक्स्ड पोजीशन iOS पर काम नहीं करती है जैसे कि यह कंप्यूटर पर करता है।

कल्पना कीजिए कि आपके पास आवर्धक कांच (व्यूपोर्ट) के नीचे एक कागज (वेबपेज) की एक शीट है, यदि आप आवर्धक कांच और अपनी आंख को स्थानांतरित करते हैं, तो आप पृष्ठ का एक अलग हिस्सा देखते हैं। इस तरह से iOS काम करता है

अब उस पर एक शब्द के साथ स्पष्ट प्लास्टिक की एक शीट है, प्लास्टिक की यह शीट स्थिर रहती है चाहे कोई भी स्थिति हो (स्थिति: निश्चित तत्व)। इसलिए जब आप आवर्धक ग्लास को स्थानांतरित करते हैं तो निश्चित तत्व स्थानांतरित होता है।

वैकल्पिक रूप से, आवर्धक ग्लास को स्थानांतरित करने के बजाय, आप प्लास्टिक (शीट) और प्लास्टिक को बढ़ाते हुए कागज (वेबपेज) को स्थानांतरित करते हैं। इस स्थिति में प्लास्टिक की शीट पर शब्द स्थिर रहने के लिए दिखाई देगा, और बाकी सामग्री चलती दिखाई देगी (क्योंकि यह वास्तव में है) यह एक पारंपरिक डेस्कटॉप ब्राउज़र है।

तो iOS में व्यूपोर्ट चलता है, पारंपरिक ब्राउज़र में वेबपेज चलता है। दोनों ही मामलों में निश्चित तत्व वास्तविकता में बने रहते हैं; हालांकि iOS पर निश्चित तत्व चलते दिखाई देते हैं।


इसके आसपास जाने का तरीका, इस लेख में अंतिम कुछ पैराग्राफ का पालन करना है

(मूल रूप से स्क्रॉलिंग को पूरी तरह से अक्षम करें, एक अलग स्क्रॉलिंग डिव में सामग्री है (लिंक किए गए लेख के शीर्ष पर नीला बॉक्स देखें), और निश्चित तत्व बिल्कुल तैनात हैं)


"स्थिति: निश्चित" अब iOS5 में आपकी अपेक्षा के अनुसार काम करता है।


कुछ अजीब चीजें होती हैं जो स्थिति के साथ होती हैं: फिक्स्ड जब आप आईओएस पर ज़ूम करते हैं। देखें stackoverflow.com/questions/52085998/…
पीटर हॉलिंगवर्थ

23

स्थिति: ऊर्ध्वाधर स्क्रॉलिंग के लिए तय एंड्रॉइड / आईफोन पर काम करता है। लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आपके मेटा टैग पूरी तरह से सेट हैं। जैसे

<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">

यदि आप एंड्रॉइड प्री 4.0 पर एक ही पृष्ठ का काम करने की योजना बना रहे हैं, तो आपको शीर्ष स्थान भी सेट करने की आवश्यकता है, या किसी कारण से एक छोटा मार्जिन जोड़ा जाएगा।


यह वास्तव में मेरे लिए काम किया। इससे पहले, स्थिति: एक छिपे हुए इनपुट तत्व (शुद्ध सीएसएस ऑफ स्क्रीन नेविगेशन देखें) पर नियत किया गया था, जिसके कारण ब्राउज़र को iphone ios 8.3 पर क्रैश हो गया, लेकिन टैबलेट में नहीं। इसके बाद यह ठीक काम करता है।
स्टीफन स्मिथ

आईपैड आईओएस 10.3 पर काम नहीं किया, स्क्वायर स्टैंड में क्षैतिज। अनुदानित लेखक का कहना है कि यह दृष्टिकोण "फोन" के लिए है।
सुशीग्य

2
उपयोगकर्ता को ज़ूम करने के लिए अक्षम करने user-scalable=0, minimum-scale=1.0, maximum-scale=1.0से पृष्ठ कई उपयोगकर्ताओं के लिए कम सुलभ हो सकता है। आपके उत्तर में इसके बारे में चेतावनी जोड़ना उपयोगी होगा
निया

22

अब सेब का समर्थन है कि

overflow:hidden;
-webkit-overflow-scrolling:touch;

यह वही है जो मैं अपने हल करने के लिए background-size: coverऔर fixediPad पर जारी करने के लिए था
andbb

यह आईओएस 7 में मोबाइल सफारी पर काम करता है। नोट: यह उन उपयोगकर्ताओं के लिए काम नहीं करेगा जिन्होंने अभी तक इस संस्करण में अपग्रेड नहीं किया है।
नील मुनरो

फिर काम पर कुछ अन्य चर भी होने चाहिए। मैंने आईओएस 6 पर परीक्षण किया है और यह काम नहीं कर रहा था, फिर आईओएस 7 पर और यह था।
नील मुनरो

@NeilMonroe हम्म शायद। मुझे यकीन है कि मैंने इसे बिना संभव के iOS 6 पर किया है, लेकिन शायद मैंने एक अन्य चर का उपयोग किया है। याद नहीं है
Uğur pzpınar

यह वास्तव में उपयोगी था, लेकिन ऐसा लगता है, overflowके लिए सेट किया गया हैscroll

19

मुझे सफारी (iOS 10.3.3) पर यह समस्या थी - जब तक कि टचेंड इवेंट को निकाल नहीं दिया गया था, ब्राउज़र फिर से नहीं चल रहा था। निश्चित तत्व दिखाई नहीं दिए या कट नहीं गए।

मेरे लिए चाल परिवर्तन जोड़ रही थी: Transl3d (0,0,0); मेरी निश्चित स्थिति तत्व के लिए।

.fixed-position-on-mobile {
  position: fixed;
  transform: translate3d(0,0,0);
}

EDIT - मुझे अब पता है कि ट्रांसफ़ॉर्म समस्या को ठीक क्यों करता है: हार्डवेयर-त्वरण। 3D ट्रांस्फ़ॉर्मेशन को जोड़ना एक चिकनी संक्रमण के लिए GPU त्वरण को ट्रिगर करता है। हार्डवेयर-त्वरण पर अधिक जानकारी के लिए इस लेख को देखें: http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css


यह वास्तव में मेरे स्क्रॉलिंग मुद्दे को तय करता है, यह उपयोग करते समय आईओएस उपकरणों पर उछल रहा था, और इसे fixedजोड़ा transformगया था।
vonUbisch

17

फिक्स्ड फुटर (यहां jQuery के साथ):

if (navigator.platform == 'iPad' || navigator.platform == 'iPhone' || navigator.platform == 'iPod' || navigator.platform == 'Linux armv6l') 
{
    window.ontouchstart = function () 
    {
        $("#fixedDiv").css("display", "none");
    }

    window.onscroll = function() 
    { 
        var iPadPosition = window.innerHeight + window.pageYOffset-45; // 45 is the height of the Footer
         $("#fixedDiv").css("position", "absolute");
         $("#fixedDiv").css("top", iPadPosition);
         $("#fixedDiv").css("display", "block");
    }
}

// in the CSS file should stand:
#fixedDiv {position: fixed; bottom: 0; height: 45px;  whatever else}

आशा करता हूँ की ये काम करेगा।


7

ट्रांसफ़ॉर्मेशन का उपयोग करके एक ही बॉक्स पर बचें: --- और स्थिति: फिक्स्ड। तत्व स्थिति में रहेगा: यदि कोई परिवर्तन है तो स्थैतिक।


6

मैंने नया jQuery मोबाइल v1.1: http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/ का उपयोग करके समाप्त किया

अब हमारे पास एक ठोस फिर से लिखना है जो बहुत सारे लोकप्रिय प्लेटफार्मों पर सही निश्चित टूलबार प्रदान करता है और अन्य ब्राउज़रों में स्थिर टूलबार स्थिति में सुरक्षित रूप से वापस आ जाता है।

इस दृष्टिकोण के बारे में सबसे अच्छा हिस्सा यह है कि जेएस-आधारित समाधानों के विपरीत, जो सभी प्लेटफार्मों पर अप्राकृतिक स्क्रॉलिंग भौतिकी को लागू करते हैं, हमारी स्क्रॉलिंग 100% देशी लगती है क्योंकि यह है । इसका मतलब है कि स्क्रॉलिंग हर जगह सही लगता है और टच, मूसवेल और कीबोर्ड यूजर इनपुट के साथ काम करता है। एक बोनस के रूप में, हमारा CSS- आधारित समाधान सुपर लाइटवेट है और यह संगतता या पहुंच को प्रभावित नहीं करता है।


इसके अलावा सुंदर सुरुचिपूर्ण (लेकिन निश्चित रूप से वर्कअराउंड) यह तरीका jQuery या जावास्क्रिप्ट (केवल CSS का उपयोग करता है) का उपयोग किए बिना iOS पर निश्चित वस्तुओं की अनुमति के लिए है। यह सार्वभौमिक रूप से लागू है। यदि आप position:fixedअपने स्क्रॉलिंग पृष्ठ के सामने एक "फ़्लोटिंग" तत्व चाहते हैं, तो आपको बस इसे अधिक z-indexमूल्य देने की आवश्यकता होगी ताकि यह सामने रहे।
छिपकर जाना

यह निश्चित रूप से सवाल का जवाब नहीं देता है।
गुस्तावो सिकीरा

1

jquery का उपयोग करके मैं इसके साथ आने में सक्षम हूं। यह चिकनी स्क्रॉल नहीं करता है, लेकिन यह चाल करता है। आप नीचे स्क्रॉल कर सकते हैं, और निश्चित div शीर्ष पर पॉप हो जाता है।

सीएसएस

<style type="text/css">
    .btn_cardDetailsPg {height:5px !important;margin-top:-20px;}
    html, body {overflow-x:hidden;overflow-y:auto;}
    #lockDiv {
  background-color: #fff;
  color: #000;
  float:left;
  -moz-box-shadow: 0px 4px 2px 2px #ccc;-webkit-box-shadow: 0px 4px 2px 2px #ccc;box-shadow:0px 4px 2px 2px #ccc;
  }
#lockDiv.stick {
  position: fixed;
  top: 0;
  z-index: 10000;
  margin-left:0px;
  }
</style>

HTML

<div id="lockSticky"></div>
<div id="lockDiv">fooo</div>

दक्खिनी

<script type="text/javascript">
    function sticky_relocate() {
        var window_top = $(window).scrollTop();
        var div_top = $('#lockSticky').offset().top;
        if (window_top > div_top)
            $('#lockDiv').addClass('stick')
        else
            $('#lockDiv').removeClass('stick');
    }
    $(function() {
        $(window).scroll(sticky_relocate);
        sticky_relocate();
    });
</script>

अंत में हम यह निर्धारित करना चाहते हैं कि लैंडस्केप या पोर्ट्रेट मोड में आईपॉड टच तदनुसार प्रदर्शित होता है या नहीं

<script type="text/javascript">
    if (navigator.userAgent.match(/like Mac OS X/i)) {
        window.onscroll = function() {

        if (window.innerWidth > window.innerHeight) {
            //alert("landscape [ ]");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 268) + 'px';
        }

        if (window.innerHeight > window.innerWidth) {
            //alert("portrait ||");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 418) + 'px';
        }
        };
    }
</script>

1

भले ही सीएसएस विशेषता {position:fixed;}लगता है (ज्यादातर) नए आईओएस उपकरणों पर काम कर रहा है, डिवाइस क्विक और फॉलबैक होना संभव है{position:relative;} अवसर पर और कारण या कारण के बिना । आमतौर पर कैश को साफ करने से तब तक मदद मिलेगी, जब तक कि कुछ घटित न हो जाए और क्वर्की फिर से न हो जाए।

विशेष रूप से, Apple से ही iPad के लिए आपकी वेब सामग्री तैयार करना :

आईपैड पर सफारी और आईफोन पर सफारी में रिसाइबल विंडो नहीं हैं। IPhone और iPad पर Safari में, विंडो का आकार स्क्रीन के आकार (माइनस सफारी उपयोगकर्ता इंटरफ़ेस नियंत्रण) पर सेट है, और उपयोगकर्ता द्वारा बदला नहीं जा सकता है। किसी वेबपेज पर घूमने के लिए, उपयोगकर्ता व्यूपोर्ट के ज़ूम स्तर और स्थिति को बदल देता है क्योंकि वे पेज को पैन करने के लिए ज़ूम इन या आउट करने के लिए डबल टैप या पिंच करते हैं, या पेज को छूने और खींचने के द्वारा। जैसा कि एक उपयोगकर्ता दृश्यपोर्ट के ज़ूम स्तर और स्थिति को बदलता है, वे निश्चित आकार के एक देखने योग्य सामग्री क्षेत्र (यानी, खिड़की) के भीतर ऐसा कर रहे हैं। इसका मतलब यह है कि वेबपेज तत्व जिनकी व्यूपोर्ट के लिए "स्थिति" निर्धारित है, वे देखने योग्य सामग्री क्षेत्र, ऑफ़स्क्रीन के बाहर समाप्त हो सकते हैं।

क्या विडंबना है, एंड्रॉइड डिवाइसों में यह समस्या नहीं है। इसके अलावा इसका उपयोग करना पूरी तरह से संभव है{position:absolute;} जब शरीर के टैग के संदर्भ में और कोई समस्या न हो।

मुझे इस विचित्रता का मूल कारण मिला; यह HTML या BODY टैग के साथ संयोजन में उपयोग किए जाने पर स्क्रॉल इवेंट अच्छा नहीं है। कभी-कभी यह घटना को फायर करना पसंद नहीं करता है, या आपको तब तक इंतजार करना होगा जब तक कि घटना को प्राप्त करने के लिए स्क्रॉल स्विंग इवेंट समाप्त न हो जाए। विशेष रूप से, इस घटना के अंत में व्यूपोर्ट फिर से तैयार किया जाता है और निश्चित तत्वों को व्यूपोर्ट में कहीं और फिर से तैनात किया जा सकता है।

तो यह वही है जो मैं करता हूं: ( व्यूपोर्ट का उपयोग करने से बचें, और डोम के साथ रहें! )

<html>
  <style>
    .fixed{
      position:fixed;
      /*you can set your other static attributes here too*/
      /*like height and width, margin, etc.*/
      }
    .scrollableDiv{
      position:relative;
      overflow-y:scroll;
      /*all children will scroll within this like the body normally would.*/
      } 
    .viewportSizedBody{
      position:relative;
      overflow:hidden;
      /*this will prevent the body page itself from scrolling.*/
      } 
  </style>
  <body class="viewportSizedBody">
    <div id="myFixedContainer" class="fixed">
       This part is fixed.
    </div>
    <div id="myScrollableBody" class="scrollableDiv">
       This part is scrollable.
    </div>
  </body>
  <script type="text/javascript" src="{your path to jquery}/jquery-1.7.2.min.js"></script>
  <script>
    var theViewportHeight=$(window).height();
    $('.viewportSizedBody').css('height',theViewportHeight);
    $('#myScrollableBody').css('height',theViewportHeight);
  </script>
</html>

संक्षेप में यह बॉडी व्यूपोर्ट के आकार और गैर-स्क्रॉल करने योग्य होगा। स्क्रॉल किए गए DIV के अंदर नेस्टेड BODY होगा जैसा कि सामान्य रूप से होगा (स्विंग इफ़ेक्ट माइनस होगा, इसलिए स्क्रॉल टचडाउन पर होता है।) निश्चित DIV बिना किसी व्यवधान के स्थिर रहता है।

एक साइड नोट के रूप में, z-indexस्क्रॉल किए जाने वाले DIV को पीछे रखने के लिए निश्चित DIV पर एक उच्च मूल्य महत्वपूर्ण है। मैं सामान्य रूप से विंडो के आकार में परिवर्तन करता हूं और क्रॉस-ब्राउज़र और वैकल्पिक स्क्रीन रिज़ॉल्यूशन संगतता के लिए ईवेंट स्क्रॉल करता हूं।

यदि अन्य सभी विफल हो जाते हैं, तो उपरोक्त कोड भी निर्धारित और स्क्रॉल किए गए दोनों डीआईवाई के साथ काम करेगा {position:absolute;}


1

इस समस्या को ठीक करने का सरल तरीका आपके तत्व के लिए संपत्ति बदलना है। और यह तय हो जाएगा। हैप्पी कोडिंग :-)

.classname{
  position: fixed;
  transform: translate3d(0,0,0);
}

इसके अलावा आप उसका तरीका भी आजमा सकते हैं और यह भी ठीक है।

.classname{
      position: -webkit-sticky;
    }

0

यह सभी परिदृश्यों पर लागू नहीं हो सकता है, लेकिन मैंने पाया है कि position: sticky(समान चीज़ position: fixed) केवल पुराने iPhones पर काम करता है जब स्क्रॉल कंटेनर शरीर नहीं है, लेकिन कुछ और के अंदर।

उदाहरण छद्म html:

body                         <- scrollbar
   relative div
       sticky div

चिपचिपा div डेस्कटॉप ब्राउज़रों पर चिपचिपा होगा, लेकिन कुछ उपकरणों के साथ, क्रोमियम: देव टूल्स: डिवाइस उत्सर्जन: iPhone 6/7/8, और एंड्रॉइड 4 फ़ायरफ़ॉक्स के साथ परीक्षण किया जाएगा, यह नहीं होगा।

हालांकि, क्या काम करेगा

body
    div overflow=auto       <- scrollbar
        relative div
            sticky div

0

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

सफारी 9.1 में, एक स्थिति वाले तत्व: एक एनिमेटेड तत्व के अंदर निश्चित तत्व, स्थिति का कारण हो सकता है: निश्चित तत्व प्रकट नहीं होने के लिए।


-2

यहाँ मेरा समाधान है ...

सीएसएस

#bgimg_top {
    background: url(images/bg.jpg) no-repeat 50% 0%; 
    position: fixed; 
    top:0; 
    left: 0; 
    right:0 ; 
    bottom:0;
}

एचटीएमएल

<body>
<div id="bgimg_top"></div>
....
</body>

स्पष्टीकरण यह है कि डिव के लिए तय की गई स्थिति हर समय बैकग्राउंड पर डिव को बनाए रखेगी, फिर हम ब्राउजर के सभी कोनों पर जाने के लिए डिव को फैलाते हैं (बशर्ते बॉडी मार्जिन = 0) का उपयोग कर (बाएं, दाएं, ऊपर, नीचे) ) एक साथ।

कृपया सुनिश्चित करें कि आप चौड़ाई और ऊँचाई का उपयोग नहीं करते हैं क्योंकि यह ऊपर, बाएँ, दाएँ, नीचे के विकल्पों को ओवरराइड करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.