Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。
    image.png

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>判断元素是否在视口内</title>
    8. <style>
    9. ul li{list-style: none;padding: 20px}
    10. li:nth-child(even){background: green}
    11. li:nth-child(odd){background: yellowgreen}
    12. </style>
    13. </head>
    14. <body>
    15. <ul>
    16. <li>1</li>
    17. <li>2</li>
    18. <li>3</li>
    19. <li>4</li>
    20. <li>5</li>
    21. <li>6</li>
    22. <li>7</li>
    23. <li>8</li>
    24. <li>9</li>
    25. <li>10</li>
    26. <li>11</li>
    27. <li>12</li>
    28. <li>13</li>
    29. <li>14</li>
    30. <li>15</li>
    31. <li>16</li>
    32. <li>17</li>
    33. <li>18</li>
    34. <li>19</li>
    35. <li>20</li>
    36. <li>21</li>
    37. <li>22</li>
    38. <li>23</li>
    39. <li>24</li>
    40. <li>25</li>
    41. <li>26</li>
    42. <li>27</li>
    43. <li>28</li>
    44. <li>29</li>
    45. <li>30</li>
    46. <li>31</li>
    47. <li>32</li>
    48. <li>33</li>
    49. <li>34</li>
    50. <li>35</li>
    51. <li>36</li>
    52. <li>37</li>
    53. <li>38</li>
    54. <li>39</li>
    55. <li>40</li>
    56. <li>41</li>
    57. <li>42</li>
    58. <li>43</li>
    59. <li>44</li>
    60. <li>45</li>
    61. <li>46</li>
    62. <li>47</li>
    63. <li>48</li>
    64. <li>49</li>
    65. <li>50</li>
    66. <li>51</li>
    67. <li>52</li>
    68. <li>53</li>
    69. <li>54</li>
    70. <li>55</li>
    71. <li>56</li>
    72. <li>57</li>
    73. <li>58</li>
    74. <li>59</li>
    75. <li>60</li>
    76. <li>61</li>
    77. <li>62</li>
    78. <li>63</li>
    79. <li>64</li>
    80. <li>65</li>
    81. <li>66</li>
    82. <li>67</li>
    83. <li>68</li>
    84. <li>69</li>
    85. <li>70</li>
    86. <li>71</li>
    87. <li>72</li>
    88. <li>73</li>
    89. <li>74</li>
    90. <li>75</li>
    91. <li>76</li>
    92. <li>77</li>
    93. <li>78</li>
    94. <li>79</li>
    95. <li>80</li>
    96. <li>81</li>
    97. <li>82</li>
    98. <li>83</li>
    99. <li id="box">84</li>
    100. <li>85</li>
    101. <li>86</li>
    102. <li>87</li>
    103. <li>88</li>
    104. <li>89</li>
    105. <li>90</li>
    106. <li>91</li>
    107. <li>92</li>
    108. <li>93</li>
    109. <li>94</li>
    110. <li>95</li>
    111. <li>96</li>
    112. <li>97</li>
    113. <li>98</li>
    114. <li>99</li>
    115. <li>100</li>
    116. </ul>
    117. </body>
    118. <script>
    119. // 某个元素是否出现在视口内
    120. (function () {
    121. function GetRect (element) {
    122. var rect = element.getBoundingClientRect() // 距离视窗的距离
    123. var top = document.documentElement.clientTop ? document.documentElement.clientTop : 0 // html元素对象的上边框的宽度
    124. var left = document.documentElement.clientLeft ? document.documentElement.clientLeft : 0
    125. return {
    126. top: rect.top - top,
    127. bottom: rect.bottom - top,
    128. left: rect.left - left,
    129. right: rect.right - left
    130. }
    131. }
    132. var $box = document.getElementById('box')
    133. var divH = $box.offsetHeight // div高度
    134. var windowH = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight // 浏览器高度兼容写法
    135. window.onscroll = function () {
    136. var obj = GetRect($box)
    137. console.log(obj.top, windowH, obj.bottom)
    138. if (obj.top >= windowH) { // 在视口之下
    139. console.log('84在视口之下')
    140. }
    141. if (obj.top < windowH && obj.bottom >= windowH) { // 正在出现
    142. console.log('84正在出现')
    143. }
    144. if (obj.top > 0 && obj.top < windowH && obj.bottom > 0 && obj.bottom < windowH) { // 正在视口中
    145. console.log('84正在视口中')
    146. }
    147. if (obj.top <= 0 && obj.bottom <= divH && obj.bottom > 0) { // 正在离开视口
    148. console.log('84正在离开视口')
    149. }
    150. if (obj.bottom <= 0) { // 已经离开视口
    151. console.log('84在视口之上')
    152. }
    153. }
    154. })()
    155. </script>
    156. </html>