之前的文章里我曾经做过一个关于滚动懒加载来实现页面优化的例子,可是当我信心满满的提交代码上去后,测试给我看了在ios环境下的状况,导航什么的照样可以正常用,但是在滚动字母条的时候背景会时不时的抽风,出现黑色的背景块,更具体来说就是滚动超过一屏幕的时候一定会出现这种情况。查证了多方资料,所谓的
-webkit-tap-highlight-color: transparent;
根本和我所描述的不是同一个问题,加上输入框引起的定位错乱问题,那几天可谓是把相关问题google了个遍,好在最后找到了一个相对比较好的方法来解决这个问题,下面就说说这里有哪些坑。
fixed元素失效
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{margin: 0;
padding: 0 ;
box-sizing: border-box;
}
ul{
list-style: none;
margin-top: 5vh;
}
ul>li{
border-bottom:1px solid #eee
}
input{
width: 100%;
height: 5vh;
position: fixed;
top: 0;
}
</style>
</head>
<body>
<main>
<input type="text">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
<li>13</li>
<li>14</li>
<li>15</li>
<li>16</li>
<li>17</li>
<li>18</li>
<li>19</li>
<li>20</li>
<li>21</li>
<li>22</li>
<li>23</li>
<li>24</li>
<li>25</li>
<li>26</li>
<li>27</li>
<li>28</li>
<li>29</li>
<li>30</li>
<li>31</li>
<li>32</li>
<li>33</li>
<li>34</li>
<li>35</li>
<li>36</li>
<li>37</li>
<li>38</li>
<li>39</li>
<li>40</li>
<li>41</li>
<li>42</li>
<li>43</li>
<li>44</li>
<li>45</li>
<li>46</li>
<li>47</li>
<li>48</li>
<li>49</li>
<li>50</li>
<li>51</li>
<li>52</li>
<li>53</li>
<li>54</li>
<li>55</li>
<li>56</li>
<li>57</li>
<li>58</li>
<li>59</li>
<li>60</li>
<li>61</li>
<li>62</li>
<li>63</li>
<li>64</li>
<li>65</li>
<li>66</li>
<li>67</li>
<li>68</li>
<li>69</li>
<li>70</li>
<li>71</li>
<li>72</li>
<li>73</li>
<li>74</li>
<li>75</li>
<li>76</li>
<li>77</li>
<li>78</li>
<li>79</li>
<li>80</li>
<li>81</li>
<li>82</li>
<li>83</li>
<li>84</li>
<li>85</li>
<li>86</li>
<li>87</li>
<li>88</li>
<li>89</li>
<li>90</li>
<li>91</li>
<li>92</li>
<li>93</li>
<li>94</li>
<li>95</li>
<li>96</li>
<li>97</li>
<li>98</li>
<li>99</li>
<li>100</li>
</ul>
</body>
</html>
这段代码可以拷贝下来,放在本地浏览器上跑跑,在模拟环境下没有半点问题。但是换真机会怎么样呢?
可以看到在正常滚动的时候基本还是正常的,但是当我们打开虚拟键盘滚动的时候会发现输入框也跟着滚没了。。。
查看文档后发现虚拟键盘呼出的时候,其他页面元素会在同一个bfc,因此,在ios上是不能这样做的,那么我们应该使用局部滚动,修改ul的样式如下
ul{
list-style: none;
margin-top: 5vh;
height: 95vh;
overflow-y: scroll
}
现在就不会跟着跑了
但是现在又有两个问题
- 滚动的很不顺畅
- 滑到底之后又跟着跑了
第一点是因为苹果对于滚动做了硬件加速,但是这个加速仅仅针对window滚动的时候是默认的,因此,我们在要滚动的元素加上
-webkit-overflow-scrolling: touch;
第二点则是因为局部滚动到底之后又开始全局滚动了,对于这点,我们需要在外面包裹一层来限制它的高度,然后禁止页面缩放。
所以有了
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
body{
height: 100%;
}
#scroll{
height: 100%;
overflow: hidden;
-webkit-overflow-scrolling: touch
}
最后对于body做滚动修正
document.body.onscroll = function(){
console.log('页面滚动了',document.body.scrollTop)
if(document.body.scrollTop!=0){
document.body.scrollTop = 0
}
}
再次测试
这次基本上就满足我们的要求了,当然平时我们滑动的时候输入框不会还在的。
于是给个监听事件
var ul = document.getElementById('ul')
ul.addEventListener('scroll',function () {
document.getElementsByTagName('input')[0].blur()
})
在定位跳转的过程中,我又发现在页面复杂同时又有动态数据的时候很容易跳过去之后,页面是空白的,用手指划一下才出来页面,经过查阅资料,这还是ios启用硬件加速的结果
所以在调用滚动方法前改为auto,滚动结束之后再改回来,如下所示
scrollDom.style.webkitOverflowScrolling='auto'
scrollTo()
scrollDom.style.webkitOverflowScrolling='touch'
至此,ios键盘和滚动的坑也就填得差不多了。