iOS 11 Safari bootstrap modal text area outside of cursor

前端 未结 14 755
暖寄归人
暖寄归人 2020-11-27 11:22

With iOS 11 safari, input textbox cursor are outside of input textbox. We did not get why it is having this problem. As you can see my focused text box is email text input b

相关标签:
14条回答
  • 2020-11-27 11:35

    Easiest/cleanest solution:

    body.modal-open { position: fixed; width: 100%; }
    
    0 讨论(0)
  • 2020-11-27 11:36

    Frustrating bug, thanks for identifying it. Otherwise, I would be banging my iphone or my head against the wall.

    The simplest fix is (1 line of code change):

    Just add the following CSS to the html or to an external css file.

    <style type="text/css">
    .modal-open { position: fixed; }
    </style>
    

    Here is a full working example:

    .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">&times;</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>

    I submitted an issue here: https://github.com/twbs/bootstrap/issues/24059

    0 讨论(0)
  • 2020-11-27 11:36

    This issue is no longer reproducible after updating your apple devices to iOS 11.3

    0 讨论(0)
  • 2020-11-27 11:44

    I fixed the issue by adding position:fixed to the body when opening a modal. Hope this will help you.

    0 讨论(0)
  • 2020-11-27 11:45

    Add position: fixed; to body when modal is open.

    $(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">&times;</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>

    0 讨论(0)
  • 2020-11-27 11:45

    Those solutions using position: fixed and position correction based on scrollTop work really well, but some people (including me) got another issue: keyboard caret/cursor not showing when inputs are focused.

    I observed that caret/cursor works only when we DON'T use position: fixed on body. So after trying several things, I gave up on using this approach and decided to use position: relative on body and use scrollTop to correct modal's top position instead.

    See code below:

    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);
    });
    
    0 讨论(0)
提交回复
热议问题