আইওএস 11 সাফারি দিয়ে, ইনপুট পাঠ্য বাক্সের কার্সার ইনপুট পাঠ্যবাক্সের বাইরে। কেন এই সমস্যা হচ্ছে তা আমরা পাইনি। আপনি দেখতে পাচ্ছেন যে আমার ফোকাসযুক্ত পাঠ্য বাক্সটি ইমেল পাঠ্য ইনপুট তবে আমার কার্সারটির বাইরে। এটি কেবল আইওএস 11 সাফারি দিয়েই ঘটে
উত্তর:
position:fixed
কোনও মডেল খোলার সময় আমি শরীরে যুক্ত করে বিষয়টি ঠিক করেছি । আশা করি এটা তোমাকে সাহায্য করবে।
width:100%
দেহের প্রস্থকে ডিভাইসের প্রস্থে সীমাবদ্ধ করতে আপনাকে যুক্ত করতেও হতে পারে । কিছু ক্ষেত্রে, বিদ্যমান মার্কআপের উপর নির্ভর করে, এটি একটি সমস্যা হতে পারে। আমি @ এজেন্টলবয়ের (নীচে) সমাধানটিও পছন্দ করি যাতে সমস্যা ছাড়াই অন্যান্য ব্রাউজারগুলিকে শাস্তি না দেওয়া হয়, কারণ শরীরকে স্থির করে দেওয়ার সময় শরীরটি শীর্ষে স্ক্রোল করে দেয় যা কিছুটা বিরক্তিকর।
position:fixed
অ্যাপ্লিকেশনটির বডিতে আবেদন করেছিলাম । এর পরিবর্তে আমি এটি পরিবর্তিত position:absolute
উপর html
উপাদান এবং এটা আমার সমস্যা সমাধান করা হয়েছে। ধন্যবাদ জেন!
ব্যক্তিগতভাবে position: fixed
স্বয়ংক্রিয়ভাবে শীর্ষে স্ক্রোল করুন । বেশ বিরক্তিকর!
অন্যান্য ডিভাইস এবং সংস্করণগুলিকে শাস্তি দিতে এড়াতে আমি এই আইওএসের উপযুক্ত সংস্করণগুলিতে এই ফিক্সটি প্রয়োগ করি।
জাভাস্ক্রিপ্ট / jQuery জন্য
$(document).ready(function() {
// Detect ios 11_x_x affected
// NEED TO BE UPDATED if new versions are affected
var ua = navigator.userAgent,
iOS = /iPad|iPhone|iPod/.test(ua),
iOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
// ios 11 bug caret position
if ( iOS && iOS11 ) {
// Add CSS class to body
$("body").addClass("iosBugFixCaret");
}
});
সিএসএসের জন্য
/* Apply CSS to iOS affected versions only */
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
আমি কোনও ক্লাস সহ কেবলমাত্র নির্বাচিত মডেলের জন্য ফাংশনটি ফায়ার করার জন্য পরিবর্তন করেছি .inputModal
শীর্ষে স্ক্রোল এড়াতে কেবল ইনপুটগুলির সাথে থাকা মডেলগুলিকেই প্রভাবিত করা উচিত।
জাভাস্ক্রিপ্ট / jQuery জন্য
$(document).ready(function() {
// Detect ios 11_x_x affected
// NEED TO BE UPDATED if new versions are affected
(function iOS_CaretBug() {
var ua = navigator.userAgent,
scrollTopPosition,
iOS = /iPad|iPhone|iPod/.test(ua),
iOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
// ios 11 bug caret position
if ( iOS && iOS11 ) {
$(document.body).on('show.bs.modal', function(e) {
if ( $(e.target).hasClass('inputModal') ) {
// Get scroll position before moving top
scrollTopPosition = $(document).scrollTop();
// Add CSS to body "position: fixed"
$("body").addClass("iosBugFixCaret");
}
});
$(document.body).on('hide.bs.modal', function(e) {
if ( $(e.target).hasClass('inputModal') ) {
// Remove CSS to body "position: fixed"
$("body").removeClass("iosBugFixCaret");
//Go back to initial position in document
$(document).scrollTop(scrollTopPosition);
}
});
}
})();
});
সিএসএসের জন্য
/* Apply CSS to iOS affected versions only */
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
HTML- এর জন্য শ্রেণী যোগ inputModal মোডাল করতে
<div class="modal fade inputModal" tabindex="-1" role="dialog">
...
</div>
জাভাস্ক্রিপ্ট ফাংশন নোটার এখন স্ব-উদ্দীপনা
আইওএস 11.3 হিসাবে, বাগটি সংশোধন করা হয়েছে। OS 11_
ইন পরীক্ষা করার দরকার নেইiOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
তবে সাবধান হন আইওএস 11.2 এখনও ব্যাপকভাবে ব্যবহৃত হয় (এপ্রিল 2018 হিসাবে)। দেখা
iOS11 = /OS 11_(\d{1,2})(_{0,1})(\d{1,2})/.test(us);
ios11 = /OS 11_(\d{1,2})/.test(ua);
এই সমস্যাটি বুটস্ট্র্যাপের বাইরে এবং কেবল সাফারি ছাড়িয়ে। এটি আইওএস 11-এ একটি সম্পূর্ণ ডিসপ্লে বাগ যা সমস্ত ব্রাউজারে ঘটে। উপরের ফিক্সটি সমস্ত ক্ষেত্রে এই সমস্যাটিকে ঠিক করে না।
বাগটি এখানে বিশদ বিবরণে জানানো হয়েছে:
https://medium.com/@eirik.luka/how-to-fix-the-ios-11-input-element-in-fixed-modals-bug-aaf66c7ba3f8
সম্ভবত তারা এটি ইতিমধ্যে বাগ হিসাবে রিপোর্ট করেছেন to
হতাশ বাগ, এটি সনাক্ত করার জন্য ধন্যবাদ। অন্যথায়, আমি আমার আইফোন বা প্রাচীরের বিরুদ্ধে মাথা ঠেকিয়ে যাব।
সহজতম সমাধান (কোড পরিবর্তনের 1 লাইন):
এইচটিএমএল বা একটি বাহ্যিক সিএসএস ফাইলে কেবল নিম্নলিখিত সিএসএস যুক্ত করুন।
<style type="text/css">
.modal-open { position: fixed; }
</style>
এখানে একটি পরিপূর্ণ কাজের উদাহরণ:
.modal-open { position: fixed; }
<link href="https://getbootstrap.com/docs/3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@mdo">Open modal for @mdo</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@fat">Open modal for @fat</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@getbootstrap">Open modal for @getbootstrap</button>
...more buttons...
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="exampleModalLabel">New message</h4>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label for="recipient-name" class="control-label">Recipient:</label>
<input type="text" class="form-control" id="recipient-name">
</div>
<div class="form-group">
<label for="message-text" class="control-label">Message:</label>
<textarea class="form-control" id="message-text"></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Send message</button>
</div>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://getbootstrap.com/docs/3.3/dist/js/bootstrap.min.js"></script>
আমি এখানে একটি সমস্যা জমা দিয়েছি: https://github.com/twbs/bootstrap/issues/24059
সবচেয়ে সহজ / পরিষ্কার সমাধান:
body.modal-open { position: fixed; width: 100%; }
আইওএস 11.3 এ আপনার অ্যাপল ডিভাইসগুলি আপডেট করার পরে এই সমস্যাটি আর পুনরায় উত্পাদনযোগ্য নয়
যোগ position: fixed;
করার জন্য body
যখন মোডাল খোলা আছে।
$(document).ready(function($){
$("#myBtn").click(function(){
$("#myModal").modal("show");
});
$("#myModal").on('show.bs.modal', function () {
$('body').addClass('body-fixed');
});
$("#myModal").on('hide.bs.modal', function () {
$('body').removeClass('body-fixed');
});
});
.body-fixed {
position: fixed;
width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<button type="button" class="btn btn-info btn-lg" id="myBtn">Open Modal</button>
<!-- Modal -->
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Form</h4>
</div>
<div class="modal-body">
<div class="form-group">
<label class="control-label">Input #1</label>
<input type="text" class="form-control">
</div>
<div class="form-group">
<label class="control-label">Input #2</label>
<input type="text" class="form-control">
</div>
<div class="form-group">
<label class="control-label">Input #3</label>
<input type="text" class="form-control">
</div>
<div class="form-group">
<label class="control-label">Input #4</label>
<input type="text" class="form-control">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
কাজের position: fixed
ভিত্তিতে এই সমাধানগুলি ব্যবহার করে এবং অবস্থান সংশোধন করা scrollTop
সত্যই ভাল হয় তবে কিছু লোক (আমাকে সহ) আরও একটি সমস্যা পেয়েছিল: কীবোর্ড ক্যারেট / কার্সারটি ইনপুটগুলিতে ফোকাস করা না দেখায় showing
আমি লক্ষ্য করেছি যে ক্যারেট / কার্সার তখনই কাজ করে যখন আমরা শরীরে ব্যবহার করব নাposition: fixed
। তাই কয়েকটি জিনিস চেষ্টা করার পরে, আমি এই পদ্ধতির ব্যবহার করে ছেড়ে দিল এবং ব্যবহার করার সিদ্ধান্ত নিয়েছে position: relative
উপর body
ব্যবহার এবং scrollTop
সঠিক মোডাল শীর্ষ অবস্থানে পরিবর্তে।
নীচে কোড দেখুন:
var iosScrollPosition = 0;
function isIOS() {
// use any implementation to return true if device is iOS
}
function initModalFixIOS() {
if (isIOS()) {
// Bootstrap's fade animation does not work with this approach
// iOS users won't benefit from animation but everything else should work
jQuery('#myModal').removeClass('fade');
}
}
function onShowModalFixIOS() {
if (isIOS()) {
iosScrollPosition = jQuery(window).scrollTop();
jQuery('body').css({
'position': 'relative', // body is now relative
'top': 0
});
jQuery('#myModal').css({
'position': 'absolute', // modal is now absolute
'height': '100%',
'top': iosScrollPosition // modal position correction
});
jQuery('html, body').css('overflow', 'hidden'); // prevent page scroll
}
}
function onHideModalFixIOS() {
// Restore everything
if (isIOS()) {
jQuery('body').css({
'position': '',
'top': ''
});
jQuery('html, body').scrollTop(iosScrollPosition);
jQuery('html, body').css('overflow', '');
}
}
jQuery(document).ready(function() {
initModalFixIOS();
jQuery('#myModal')
.on('show.bs.modal', onShowModalFixIOS)
.on('hide.bs.modal', onHideModalFixIOS);
});
পূর্বে উল্লিখিত হিসাবে: সেটিং style.position
property
এর body
জন্য fixed
সমাধান iOS cursor misplacement
সমস্যা।
যাইহোক, এই লাভটি পৃষ্ঠার শীর্ষে জোর করে স্ক্রোল করা ব্যয় করে আসে।
সৌভাগ্যবসত, এই নতুন UX
সমস্যা উপজীব্য করে অনেক ওভারহেড ছাড়া অস্বীকার করা যাবে HTMLElement.style
এবং window.scrollTo()
।
মৌলিক সূচনাটি হ'ল উপাদানটির কখন scroll to top
ব্যবহার করে তা মোকাবেলা করা । এটি ভেরিয়েবল দ্বারা ক্যাপচার করা মান ব্যবহার করে করা হয় ।body
style.top
mounting
YOffset
ygap
সেখান থেকে এটি সহজেই পুনরায় সেট body's
style.top
করা 0
এবং window.scrollTo(0, ygap)
কখন ব্যবহারকারীর দৃষ্টিভঙ্গিটি পুনঃনির্মাণের বিষয় dismounting
।
ব্যবহারিক উদাহরণের জন্য নীচে দেখুন।
// Global Variables (Manage Globally In Scope).
const body = document.querySelector('body') // Body.
let ygap = 0 // Y Offset.
// On Mount (Call When Mounting).
const onModalMount = () => {
// Y Gap.
ygap = window.pageYOffset || document.documentElement.scrollTop
// Fix Body.
body.style.position = 'fixed'
// Apply Y Offset To Body Top.
body.style.top = `${-ygap}px`
}
// On Dismount (Call When Dismounting).
const onModalDismount = () => {
// Unfix Body.
body.style.position = 'relative'
// Reset Top Offset.
body.style.top = '0'
// Reset Scroll.
window.scrollTo(0, ygap)
}
functions
যখন mounting
এবং dismounting
। ধন্যবাদ
ইনসায়েস করে যে কেউ আইওএস> ১১.২ এ কাজ করে এমন ভ্যানিলা জেএসের কোনও স্থির সন্ধান করছে এবং এর জন্য কোনও অতিরিক্ত সিএসএসের প্রয়োজন নেই:
(function() {
if (!/(iPhone|iPad|iPod).*(OS 11_[0-2]_[0-5])/.test(navigator.userAgent)) return
document.addEventListener('focusin', function(e) {
if (!e.target.tagName == 'INPUT' && !e.target.tagName != 'TEXTAREA') return
var container = getFixedContainer(e.target)
if (!container) return
var org_styles = {};
['position', 'top', 'height'].forEach(function(key) {
org_styles[key] = container.style[key]
})
toAbsolute(container)
e.target.addEventListener('blur', function(v) {
restoreStyles(container, org_styles)
v.target.removeEventListener(v.type, arguments.callee)
})
})
function toAbsolute(modal) {
var rect = modal.getBoundingClientRect()
modal.style.position = 'absolute'
modal.style.top = (document.body.scrollTop + rect.y) + 'px'
modal.style.height = (rect.height) + 'px'
}
function restoreStyles(modal, styles) {
for (var key in styles) {
modal.style[key] = styles[key]
}
}
function getFixedContainer(elem) {
for (; elem && elem !== document; elem = elem.parentNode) {
if (window.getComputedStyle(elem).getPropertyValue('position') === 'fixed') return elem
}
return null
}
})()
এটি যা করে তা হ'ল:
focusin
পৃষ্ঠায় কোনও ইভেন্টের জন্য শুনুনinput
বা একটি হয় textarea
এবং fixed
অবস্থানের সাথে কোনও উপাদানগুলিতে থাকে তবে কনটেইনার অবস্থানটি absolute
সম্পর্কিত scrollTop
এবং ধারকগুলির মূল মাত্রা পরিবর্তন করুন।fixed
।এই সমাধানটি আইওএসের সমস্ত ব্রাউজার জুড়ে আমার এবং এর জন্য কাজ করে।
.safari-nav-force{
/* Allows content to fill the viewport and go beyond the bottom */
height: 100%;
overflow-y: scroll;
/* To smooth any scrolling behavior */
-webkit-overflow-scrolling: touch;
}
জাভস্ক্রিপ্ট
var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
$('.modal').on('shown.bs.modal', function () {
if (iOS && $('.modal').hasClass('in')){
$('html,body').addClass('safari-nav-force');
}
});
$('.modal').on('hidden.bs.modal', function () {
if (iOS && !$('.modal').hasClass('in')){
$('html,body').removeClass('safari-nav-force');
}
});
আপনি কি মেটা ভিউপোর্টের জন্য ভিউপোর্ট-ফিট = কভার চেষ্টা করেছেন ?
এটি দেখুন: https://ayogo.com/blog/ios11-viewport/
মোডাল CSS ওভাররাইড করতে ও তার পরিবর্তন position
থেকে fixed
থেকেabsolute
.modal {
position: absolute !important;
}