কীভাবে <ডিভি> তৈরি করবেন 2019 এর মতো মোবাইল সাফারি সহ ব্রাউজার উইন্ডোটি ঠিক পূরণ করুন


10

আমি একটি একক পৃষ্ঠার ওয়েব অ্যাপে কাজ করছি, এটি সাধারণত মোবাইল ডিভাইসে ব্যবহৃত হবে। এর বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল মানচিত্র মোড, যা অস্থায়ীভাবে পুরো ব্রাউজার উইন্ডোটির উপরে নিয়ে যায়; একটি দূরত্ব স্কেল এবং কিছু নিয়ন্ত্রণ মানচিত্রের চারটি কোণে সংযুক্ত রয়েছে। এখানে মানচিত্রের একটি ছোট স্ক্রিনশট যাতে আপনি বলতে পারেন যে আমি কী সম্পর্কে বলছি:

মানচিত্রের ওভারলে এর স্ক্রিনশট

মানচিত্রটি একটি হিসাবে প্রয়োগ করা <div>হয় position: fixedএবং চারটি স্থানাঙ্ক শূন্য হয়; অন্তর্নিহিত অ্যাপ্লিকেশন প্রদর্শনের উত্স থেকে সরিয়ে স্ক্রোল করার ক্ষেত্রে মানচিত্রটি দৃশ্যমান <body>হওয়ার overflow: hiddenসময় আমি অস্থায়ীভাবে এটিকে সেট করেছিলাম । আমি ডেস্কটপ ব্রাউজারগুলিতে ঠিক কীভাবে মানচিত্রটি কাজ করতে পারি তা যথেষ্ট। "width=device-width,user-scalable=no"উইন্ডোটির দৃশ্যমান ক্ষেত্রটি ভিউপোর্টের সাথে হুবহু মিলে যাওয়ার জন্য মোবাইল ব্রাউজারগুলিকেও আমি এমন একটি মেটা ভিউপোর্ট ট্যাগ দেওয়া দরকার ।

এই সমস্ত কিছু সুন্দরভাবে কাজ করেছিল যখন আমি মূলত এই অ্যাপটি লিখেছিলাম, কিন্তু আইওএস সাফারি লাইন ধরে কোথাও স্কেলিংয়ের সাথে জড়িত কোনও মেটা ভিউপোর্ট বিকল্পগুলির সম্মান দেওয়া বন্ধ করে দিয়েছে - দৃশ্যত অনেকগুলি সাইট ট্যাগটি ভুলভাবে প্রয়োগ করছে, ফলস্বরূপ অচিহ্নিত ছোট ছিল, এখনও unzoomable। বর্তমানে, আপনি যদি এই ব্রাউজারে মানচিত্রটি সক্ষম করেন, আপনি সম্ভবত কিছুটা জুম-ইন ভিউ পাবেন, যা ডান এবং নীচে এই বোতামগুলি কেটে ফেলেছে - এবং আপনি এটি সম্পর্কে কিছুই করতে পারবেন না, কারণ সমস্ত স্পর্শগুলি ব্রাউজারের স্ক্রোলিংয়ের পরিবর্তে মানচিত্রের জন্য জুম / প্যান অঙ্গভঙ্গি হিসাবে ব্যাখ্যা করা হয়। এই বোতামগুলির মাধ্যমে অ্যাক্সেস করা বৈশিষ্ট্যগুলি ছাড়াই - এবং ডানদিকের ডানদিকের বোতামটি ছাড়া মানচিত্রটি মারাত্মকভাবে কার্যকর নয় you এমনকি আপনি মানচিত্রটি বন্ধ করতে পারবেন না। বাইরে যাওয়ার একমাত্র উপায় হ'ল পৃষ্ঠাটি পুনরায় লোড করা যার ফলশ্রুতিতে সংরক্ষিত ডেটা হারাতে পারে।

আমি অবশ্যই history.pushState/ এর ব্যবহার যুক্ত করব onpopstateযাতে মানচিত্রের ওভারলেটি একটি পৃথক পৃষ্ঠার মতো আচরণ করে। আপনি ব্রাউজারের পিছনের বোতামটি ব্যবহার করে মানচিত্রের মোড থেকে বেরিয়ে আসতে সক্ষম হবেন - তবে এটি হারিয়ে যাওয়া বোতামগুলির কারণে বাকী কার্যকারিতাটি হারাতে পারে না।

আমি .requestFullscreen()মানচিত্রের ওভারলেটি বাস্তবায়নের জন্য বিবেচনা করেছি , তবে অ্যাপটি অন্যথায় ব্যবহারযোগ্য হবে এমনটি সর্বত্র সমর্থিত নয়। বিশেষত, এটি আইফোনগুলিতে দৃশ্যত কোনওভাবেই কাজ করে না, এবং আইপ্যাডগুলিতে আপনি একটি স্ট্যাটাস বার এবং আপনার সামগ্রীতে ওভারলাইং করে একটি বিশাল 'এক্স' বোতাম পাবেন - আমার দূরত্বের স্কেল সম্ভবত আর পঠনযোগ্য হবে না। আমি প্রকৃতপক্ষে যা চাই তা নির্গতভাবে নয় - আমার পুরো উইন্ডো দরকার , পূর্ণ পর্দা নয়।

আধুনিক ব্রাউজারগুলিতে আমি কীভাবে একটি পূর্ণ উইন্ডো প্রদর্শন করব? বিষয়টিতে আমি যে সমস্ত তথ্য পেতে পারি তা মেটা ভিউপোর্ট ট্যাগ ব্যবহারের বিষয়ে কথা বলে তবে আমি উল্লেখ করেছি যে আর কাজ করে না।


1
@Joehat, অ্যাপ্লিকেশন বাল্ক হয় প্রতিক্রিয়াশীল; এটাই সমস্যা নয় এটি কেবল এই মানচিত্রের ওভারলে বৈশিষ্ট্যটিতে একটি সমস্যা রয়েছে: ব্রাউজারের জুম এবং স্ক্রোলিং সামঞ্জস্য করার কোনও উপায় না রেখে মানচিত্রটি জুম / প্যান করতে স্পর্শ অঙ্গভঙ্গিগুলি ব্যবহৃত হয় (এটি একটি এসভিজি, d3.js দ্বারা উত্পাদিত)। ব্রাউজার যখন আমাকে ভিউপোর্টটি নিয়ন্ত্রণ করতে দেয় তখন এটি ঠিক কাজ করে।
jasonharper

1
কিছু প্রাথমিক প্রশ্ন: আপনি কি সিএসএস রিসেট ব্যবহার করছেন? কোনও কিছুর মধ্যে কি আজব মার্জিন বা প্যাডিংস রয়েছে? দেহটি 100vw x 100vh এ সেট করা আছে? আপনার মানচিত্র ডিভের সাথে কাজ করার জন্য কি দেহটি অবস্থান সম্পর্কিত?
সমস্তগুডি

1
আপনি কি দয়া করে এর জন্য নমুনা কোডটি ভাগ করতে পারেন .. আমি চেক করব এবং আপনাকে
জানাবো

1
আপনার কোড দেখান !!
নিখিল সুগন্ধ

1
একটি স্ক্রিনশট বা এই উইন্ডোটিতে থাকা সামগ্রীর কিছু উদাহরণ যা ঘটছে তা নির্ধারণ করতে সত্যই সহায়তা করবে।
ব্রাইস হাউইটসন

উত্তর:


1

সমাধান

window.innerHeightজাভাস্ক্রিপ্টের সাথে পূর্ণস্ক্রিন ডিভের উচ্চতা সেট করুন এবং তারপরে উইন্ডো আকারে এটি আপডেট করুন।

এখানে একই সমস্যা:

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

অধিক তথ্য:


1

আপনাকে উভয় শরীর এবং এইচটিএমএল উভয়ের উচ্চতা সেট করতে হবে

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

1

আপনি কি এই চেষ্টা করেছেন?

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

(আমি ধরে নিচ্ছি আপনি vwপ্রস্থের উপর নির্ভর করেছেন, নয় vh...) আপনি কোন উপাদানটির সাথে এটি যুক্ত করার পরামর্শ দিচ্ছেন? আমি বিভিন্ন জায়গায় (এটা চেষ্টা <html>, <body>এবং মানচিত্র <div>), কিন্তু কোন পার্থক্য দেখেছি।
jasonharper

এটি ডিভের জন্য কোনও উপাদানটিতে কোনও রূপান্তর স্কেল বা জুম সম্পত্তি প্রয়োগ করা আছে?
রাজীলেশ পানোলি 5'19

এইচটিএমএল স্তরে কোনও রূপান্তর নেই, আমার মানচিত্র জুমিং / প্যানিং এটি রচনা করে এসভিজি উপাদানগুলিতে অনুবাদ প্রয়োগ করে করা হয়।
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

এটি এমন একটি সমাধান বলে মনে করা হচ্ছে যা ন্যূনতম-ইউআইয়ের মতো is

এখানে আরও একটি প্রশ্ন যা এই উত্তরটির উল্লেখ করে: আইওএস 8 সরানো "ন্যূনতম-ইউআই" ভিউপোর্টের সম্পত্তি, অন্য "সফট ফুলস্ক্রিন" সমাধান আছে কি?

এটি যদি কিছুটা সহায়তা করে তবে আমাকে জানান।



0

যদি আপনি position: fixedকেবল স্ট্যান্ডার্ড সিএসএস পদ্ধতি ব্যবহার করেন যা বহু বছর ধরে রয়েছে।

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

এটি কেবল ভিউপোর্টের পুরো আকারের ডিভ অটো-আকারকে তৈরি করবে এবং সম্ভাব্যতা ব্যবহার করে স্থির করে এটি লক করে দেওয়া হোক না কেন তারা যত স্ক্রোল করুক না কেন, আপনার যদি প্রয়োজন হয় তবে আপনি বডি স্ক্রোলটি অক্ষম করতে পারেন with

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

সুতরাং আপনি যদি এইচটিএমএল ট্যাগে কেবলমাত্র স্ক্রোল ক্লাস যুক্ত করেন তবে এটি স্ক্রোলিং অক্ষম করবে। তারপরে আপনি যখন আবার স্ক্রোলিংকে অনুমতি দিতে চান তখন আপনি পারেন।


0

আপনি আপনার মানচিত্র নিয়ন্ত্রণ এবং আপনার মানচিত্রের স্তরের জন্য দুটি স্তর কাঠামো ব্যবহার করে এটি বাস্তবায়ন করতে পারেন। এর অর্থ javascriptহ'ল আপনি যা চান তা বাস্তবায়নের জন্য আপনার আসলে কোনও প্রয়োজন নেই (যদিও কোনও কোডিং উদাহরণই প্রশ্নটিতে দেওয়া হয়নি)। আপনার সাথে ভিউপোর্ট নিপূণভাবে পারেন CSSএবং যে প্রকৃত অর্থ vwএবং vhঅনুক্রমে আপনার মন্তব্য উত্তর দিতে কিভাবে 100vw / 100vh সাহায্যের যে অনুমিত হয়? , vভিউপোর্টের জন্য এটি যেহেতু সাহায্য করতে পারে ।

উদাহরণস্বরূপ স্নিপেট দেখুন।

প্রশ্নটিতে কিছু কোডিং উপস্থিত থাকলে একটি আরও ভাল উদাহরণ (নির্দিষ্ট পরামিতিগুলির ক্ষেত্রে আরও সঠিক হওয়া যা দেওয়া হতে পারে) সরবরাহ করা যেতে পারে।

PS: মানচিত্রের স্তরটি এমন একটি চিত্র দ্বারা সিমুলেটেড যা স্ক্রোলটিতে জুম হয়ে যায়।

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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.