最近遇到一个新鲜的 bug —— iOS11 Safari 中 modal 上的 input 光标不跟随焦点,即当 input 获得焦点准备输入时,光标并不在 input 元素中。
之所以会有这个 bug 的原因是因为,当输入框获取焦点弹出输入法时,,Safari 向下移动页面,导致光标不跟随焦点。
谷歌搜索看到这篇文章(需翻墙),了解到三种解决办法。
不要讲 input 放在 modal,这种方法简单粗暴,但是可行性却很低。
将 modal 中 mask 的兄弟元素且为 input 祖先元素的元素 position 设置为 absolute。可能会导致一些意外问题,具体看 modal 的写法。 代码
将 body 高度设置为 100vh, overflow 设置为 hidden,当然这种方法在 modal 消失需要重设这两个属性为原来的值。但如果 modal 高度gaoyu 100vh时,这种方法就无效了。代码
参考链接
How to fix the iOS 11 input element in fixed modals bug
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| <!DOCTYPE html> <html> <head> <title>iOS11 cursor</title> <meta name="viewport" content="width=device-width"> </head> <style>
.ios11 .modal-ct{ position: absolute; }
body { height: 200vh; } .modal { }
.mask { background: black; opacity: 0.3; position: fixed; left: 0; top: 0; right: 0; bottom: 0; } .modal-ct { position: fixed; left: 0; top: 0; right: 0; bottom: 0; } input { font-size: 16px; } </style> <body> <div class="modal"> <div class="mask"></div> <div class="modal-ct"> <input /> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> </div> </div> <div id="other"> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Atque dolorem nam, in optio magni expedita corporis, labore veritatis delectus eaque ipsum aperiam ratione incidunt mollitia? Numquam, quos fugiat! Odit, nobis? Lorem ipsum dolor sit, amet consectetur adipisicing elit. Assumenda, vel adipisci libero quae sint iusto dignissimos quam quibusdam molestiae sunt dolore soluta nihil cumque sit? Quidem accusamus est ad iure. <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> </div>
<script> (function () { var ua = navigator.userAgent, iOS = /iPad|iPhone|iPod/.test(ua), iOS11 = /OS 11_0_1|OS 11_0_2|OS 11_0_3|OS 11_1/.test(ua); // ios 11 bug caret position if (iOS && iOS11) { document.body.setAttribute('class', 'ios11') } })() </script> </body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| <!DOCTYPE html> <html> <head> <title>iOS11 cursor</title> <meta name="viewport" content="width=device-width"> </head> <style> body { height: 200vh; }
.ios11 { height: 100%; overflow: hidden; } .modal { }
.mask { background: black; opacity: 0.3; position: fixed; left: 0; top: 0; right: 0; bottom: 0; } .modal-ct { position: fixed; left: 0; top: 0; right: 0; bottom: 0; padding-top: 100px; } input { font-size: 16px; } #other { display: none; } </style> <body>
<div class="modal"> <div class="mask"></div> <div class="modal-ct"> <input /> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> <p>lorem</p> </div> </div> <div id="other"> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Atque dolorem nam, in optio magni expedita corporis, labore veritatis delectus eaque ipsum aperiam ratione incidunt mollitia? Numquam, quos fugiat! Odit, nobis? Lorem ipsum dolor sit, amet consectetur adipisicing elit. Assumenda, vel adipisci libero quae sint iusto dignissimos quam quibusdam molestiae sunt dolore soluta nihil cumque sit? Quidem accusamus est ad iure. <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> </div>
<script> (function () { var ua = navigator.userAgent, iOS = /iPad|iPhone|iPod/.test(ua), iOS11 = /OS 11_0_1|OS 11_0_2|OS 11_0_3|OS 11_1/.test(ua); // ios 11 bug caret position if (iOS && iOS11) { document.body.setAttribute('class', 'ios11') } })() </script> </body> </html>
|