कैसे करें <div> बिल्कुल ब्राउज़र विंडो भरें, जिसमें 2019 तक मोबाइल सफारी भी शामिल है


10

मैं एक एकल-पृष्ठ वेब ऐप पर काम कर रहा हूं, जिसका उपयोग आमतौर पर मोबाइल उपकरणों पर किया जाएगा। इसकी विशेषताओं में से एक एक मानचित्र मोड है, जो अस्थायी रूप से संपूर्ण ब्राउज़र विंडो पर ले जाता है; दूरी के पैमाने और कुछ नियंत्रण नक्शे के चार कोनों से जुड़े होते हैं। यहाँ मानचित्र का एक छोटा स्क्रीनशॉट है ताकि आप बता सकें कि मैं किस बारे में बात कर रहा हूँ:

मानचित्र ओवरले का स्क्रीनशॉट

मानचित्र को एक <div>साथ position: fixedऔर सभी चार समन्वय शून्य के रूप में कार्यान्वित किया जाता है; मैं भी अस्थायी रूप से सेट <body>करने के लिए overflow: hidden, जबकि नक्शा मूल से दूर स्क्रॉल किया जा रहा है अंतर्निहित एप्लिकेशन प्रदर्शन के मामले को संभालने के लिए दिख रहा है। यह मानचित्र बनाने के लिए पर्याप्त है कि मैं डेस्कटॉप ब्राउज़रों पर कैसे काम करूं। मोबाइल ब्राउज़रों को यह भी आवश्यक है कि मैं मेटा व्यूपोर्ट टैग कुछ इस तरह "width=device-width,user-scalable=no"से दूं कि खिड़की के दृश्य क्षेत्र को व्यूपोर्ट के साथ बिल्कुल अनुरूप बनाया जा सके।

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

मैं निश्चित रूप से history.pushState/ का उपयोग जोड़ने जा रहा हूं onpopstateताकि मैप ओवरले एक अलग पृष्ठ की तरह व्यवहार करे। आप ब्राउज़र के बैक बटन का उपयोग करके मैप मोड से बाहर निकलने में सक्षम होंगे - लेकिन यह लापता बटन के कारण कार्यक्षमता के बाकी नुकसान को संबोधित नहीं करता है।

मैंने .requestFullscreen()मानचित्र ओवरले को लागू करने के लिए उपयोग करने पर विचार किया है , लेकिन यह हर जगह समर्थित नहीं है कि ऐप अन्यथा उपयोगी होगा। विशेष रूप से, यह जाहिरा तौर पर iPhones पर बिल्कुल भी काम नहीं करता है, और iPads पर आपको अपनी सामग्री को ओवरलेइंग करते हुए एक स्थिति बार और एक विशाल 'X' बटन मिलता है - मेरी दूरी का स्केल संभवतः किसी भी अधिक पठनीय नहीं होगा। यह शब्दार्थ नहीं है कि मैं वास्तव में क्या चाहता हूं, वैसे भी - मुझे पूर्ण विंडो की आवश्यकता है , न कि पूर्ण स्क्रीन की।

मुझे आधुनिक ब्राउज़रों पर काम करते हुए पूर्ण-विंडो डिस्प्ले कैसे मिलेगा? मैं मेटाटपोर्ट व्यूपोर्ट टैग का उपयोग करने के बारे में विषय वार्ता पर मिल सकती है, लेकिन जैसा कि मैंने उल्लेख किया है कि अब काम नहीं करता है।


1
@ जोहाट, ऐप का थोक उत्तरदायी है; यह समस्या नहीं है। यह सिर्फ एक मैप ओवरले फीचर है जिसमें एक मुद्दा है: मैप को जूम / पैन करने के लिए टच जेस्चर का उपयोग किया जाता है (यह एक एसवीजी है, जो d3.js द्वारा निर्मित है), ब्राउज़र के ज़ूम और स्क्रॉलिंग को समायोजित करने का कोई रास्ता नहीं छोड़ता है। जब ब्राउज़र ने व्यूपोर्ट को नियंत्रित करने की अनुमति दी, तब यह ठीक ठीक काम कर रहा था।
jasonharper

1
कुछ बुनियादी प्रश्न: क्या आप सीएसएस रीसेट का उपयोग कर रहे हैं? क्या किसी भी चीज पर कोई अजीब मार्जिन या पैडिंग है? क्या शरीर 100vw x 100vh पर सेट है? क्या शरीर आपके मानचित्र div के सापेक्ष काम करने के लिए तैनात है?
इसकीallgoodie

1
क्या आप इसके लिए नमूना कोड साझा कर सकते हैं .. मैं जाँच करूँगा और आपको
बताऊँगा

1
अपना कोड दिखाओ !!
निखिल शुगंड

1
एक स्क्रीनशॉट या इस विंडो में डाली जा रही सामग्री का कुछ उदाहरण वास्तव में यह निर्धारित करने में मदद करेगा कि क्या हो रहा है।
ब्रायस होइट्सन

जवाबों:


1

समाधान

window.innerHeightजावास्क्रिप्ट के साथ फुलस्क्रीन डिव की ऊँचाई सेट करें और फिर इसे खिड़की के आकार पर अपडेट करें।

यहां भी यही समस्या:

https://stackoverflow.com/a/37113430/8662476

और जानकारी:


1

आपको शरीर और html दोनों की ऊंचाई को 100% पर सेट करना होगा

   html, body {
       width: 100%;
       height: 100%;
       margin: 0;
    }

1

क्या आपने ये आज़माया है?

width: 100vw;
height: 100vh;
margin: 0;
padding: 0;

(मुझे लगता है कि आप vwचौड़ाई पर मतलब है , नहीं vh...) आप किस तत्व का सुझाव दे रहे हैं कि मैं इसे जोड़ता हूं? मैं कई स्थानों (में इसे करने की कोशिश <html>, <body>और नक्शे <div>), लेकिन कोई मतभेद नहीं देखा।
jasonharper

यह डिव के लिए है। क्या किसी तत्व पर कोई ट्रांसफ़ॉर्म स्केल या ज़ूम प्रॉपर्टी लागू होती है।
राजेश पैनोली

एचटीएमएल स्तर पर कोई भी परिवर्तन नहीं होता है, मेरा नक्शा ज़ूमिंग / पैनिंग एसवीजी तत्वों को इसके अनुवाद के लिए अनुवाद लागू करके किया जाता है।
jasonharper

0

इसे इस्तेमाल करे:

<meta name="viewport" content="width=device-width, height=device-height , 
initial-scale=1.0,user-scalable=no, shrink-to-fit=yes" />

यह कुछ भी नहीं बदला, और मुझे इसकी उम्मीद करने का कोई कारण नहीं दिखता है: shrink-to-fit=yesडिफ़ॉल्ट है, और सफारी अब स्केलिंग विकल्पों पर कोई ध्यान नहीं देता है।
jasonharper

0

चूंकि मैं कोई टिप्पणी नहीं कर सकता, इसलिए मैं यह जोड़ना चाहूंगा कि अगर आपके शरीर का टैग ब्राउज़र की ऊंचाई है तो आपको जांच करनी चाहिए। आप यह भी जांचना चाह सकते हैं: क्रोम / सफारी फ्लेक्स पैरेंट की 100% ऊंचाई को नहीं भर रहे हैं


0

यह एक पुराना समाधान है, और एक ऐसी समस्या को संबोधित करता है जो निकटता से जुड़ा हुआ है, लेकिन बिल्कुल वैसा ही नहीं है, इसलिए मुझे यकीन नहीं है कि यह लागू होता है: https://github.com/gajus/brim

यह एक ऐसा समाधान माना जाता है जो न्यूनतम-यूआई के समान है।

यहां एक और सवाल है जो इस जवाब को संदर्भित करता है: iOS 8 ने "न्यूनतम-यूआई" व्यूपोर्ट संपत्ति को हटा दिया, क्या अन्य "सॉफ्ट फुलस्क्रीन" समाधान हैं?

मुझे पता है अगर यह बिल्कुल मदद करता है।



0

यदि आपका उपयोग position: fixedकेवल मानक सीएसएस विधि का उपयोग करता है जो कई वर्षों से आसपास है।

.divFixedClass{
    position: fixed;
    top:0;
    left:0;
    right:0;
    bottom:0;
}

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

html.noScroll, html.noScroll > body{
    overflow:none;
}

इसलिए यदि आप html टैग में सिर्फ noScroll वर्ग जोड़ते हैं तो यह स्क्रॉलिंग को अक्षम कर देगा। तब जब आप फिर से स्क्रॉल करने की अनुमति देना चाहते हैं।


0

आप अपने मानचित्र नियंत्रण और अपने मानचित्र परत के लिए दो परत संरचना का उपयोग करके इसे लागू कर सकते हैं। मतलब यह है कि आपको वास्तव में किसी भी javascriptचीज को लागू करने की आवश्यकता नहीं है जो आप चाहते हैं (हालांकि प्रश्न में कोई कोडिंग उदाहरण नहीं दिया गया था)। आप के साथ व्यूपोर्ट में हेरफेर कर सकते हैं CSSऔर आपकी टिप्पणी का उत्तर देने के लिए वास्तविक अर्थ है vwऔर 100vw / 100vh कैसे मदद करने वाला है?vh, यह vव्यूपोर्ट के लिए खड़े होने के बाद से मदद कर सकता है ।

उदाहरण के लिए स्निपेट देखें।

एक बेहतर उदाहरण (विशिष्ट मापदंडों पर अधिक सटीक होना जो छूट सकता है) प्रदान किया जा सकता है अगर कुछ कोडिंग प्रश्न में मौजूद था।

पुनश्च: मानचित्र परत एक छवि द्वारा सिम्युलेटेड है जो स्क्रॉल पर ज़ूम की जाती है।

function zoom(event) {
  event.preventDefault();

  scale += event.deltaY * -0.01;

  // Restrict scale
  scale = Math.min(Math.max(.125, scale), 4);
  if (scale < 1) {
    scale = 1;
  }
  // Apply scale transform
  el.style.transform = `scale(${scale})`;
}
let scale = 1;
const el = document.getElementById('map');
el.onwheel = zoom;
.container {
  position: absolute;
   display: flex;
  align-items: center;
  justify-content: center;
  top: 0;
  left: 0;
  overflow: hidden;
  width: 100vw;
  height: 100vh;
  background-color: transparent;
}

#map {
  width: 100vw;
  height: 100vh;
    background-repeat: no-repeat;
  background-position: center center;
  background-image: url(https://picsum.photos/800/500.webp);
  z-index: 1;
}


#main {
  display: grid;
  position: absolute;
  background-color: transparent;
  top: 0;
  left: 0;
  grid-template-columns: 6rem auto 6rem;
  grid-template-rows: 3rem auto 3rem;
  width: 0;
  height: 0;
 z-index: 2;
}

.t-l {
background: #fc0;
  position: fixed;
  z-index: 2;
  color: #000;
  top; 0;
  left: 0;
  width: 6rem;
  height: 3rem;
  display: block;
  grid-column-start: 1;
  grid-column-end: column1-end;
  grid-row-start: 1;
  grid-row-end: row1-end;
}
.t-r {
background: #0cf;
  position: fixed;
  z-index: 2;
  color: #000;
  top; 0;
  left: calc(100vw-6rem);
  right: 0;
  width: 6rem;
  height: 3rem;
  display: block;
  grid-column-start: 3;
  grid-column-end: column3-end;
  grid-row-start: 1;
  grid-row-end: row1-end;
}
.b-l {
background: #c0f;
  position: fixed;
  z-index: 2;
  color: #000;
  bottom: 0;
  top: calc(100vh-3rem);
  left: 0;
  width: 6rem;
  height: 3rem;
  display: block;
  grid-column-start: 1;
  grid-column-end: column1-end;
  grid-row-start: 3;
  grid-row-end: row3-end;
}
.b-r {
background: #cf0;
  position: fixed;
  z-index: 2;
  color: #000;
  top: calc(100vh-3rem);
  left: 100vw;
  margin-left: -6rem;
  bottom: 0;
  width: 6rem;
  height: 3rem;
  display: block;
  grid-column-start: 3;
  grid-column-end: column3-end;
  grid-row-start: 3;
  grid-row-end: row3-end;
}
<div class="container">

  <div id="main">
    <button class="t-l">top left control</button>
    <button class="t-r">top right control</button>
    <button class="b-l">bottom left control</button>
    <button class="b-r">bottom right control</button>
  </div>
<div id="map"></div>
</div>

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