Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>判断元素是否在视口内</title><style>ul li{list-style: none;padding: 20px}li:nth-child(even){background: green}li:nth-child(odd){background: yellowgreen}</style></head><body><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 id="box">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><script>// 某个元素是否出现在视口内(function () {function GetRect (element) {var rect = element.getBoundingClientRect() // 距离视窗的距离var top = document.documentElement.clientTop ? document.documentElement.clientTop : 0 // html元素对象的上边框的宽度var left = document.documentElement.clientLeft ? document.documentElement.clientLeft : 0return {top: rect.top - top,bottom: rect.bottom - top,left: rect.left - left,right: rect.right - left}}var $box = document.getElementById('box')var divH = $box.offsetHeight // div高度var windowH = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight // 浏览器高度兼容写法window.onscroll = function () {var obj = GetRect($box)console.log(obj.top, windowH, obj.bottom)if (obj.top >= windowH) { // 在视口之下console.log('84在视口之下')}if (obj.top < windowH && obj.bottom >= windowH) { // 正在出现console.log('84正在出现')}if (obj.top > 0 && obj.top < windowH && obj.bottom > 0 && obj.bottom < windowH) { // 正在视口中console.log('84正在视口中')}if (obj.top <= 0 && obj.bottom <= divH && obj.bottom > 0) { // 正在离开视口console.log('84正在离开视口')}if (obj.bottom <= 0) { // 已经离开视口console.log('84在视口之上')}}})()</script></html>
