1. 表现
  2. 解决办法
  3. 示例代码

(Android Chrome兼容)修复定位元素导致的地址栏上移

移动端浏览器的地址栏是可动的,用户向上滑动页面时, 地址栏也会向上移动,直到隐藏.
如果想固定地址栏,可以使用如下样式:

1
2
3
4
5
6
7
8
9
10
html {
height: 100%;
overflow: hidden;
}

body {
height: 100%;
margin: 0;
overflow-y: scroll;
}

表现

在chrome(android 73)中,上面这个办法可能会失效.
如果某个可滚动的绝对定位元素的尺寸和浏览器窗口一样大,可能会导致导航栏上移.
该bug仅能在android中复现, ios系统的chrome无此问题.

1
2
3
4
5
<body>
<div class="fixed">
<div class="content"></div>
</div>
</body>
1
2
3
4
5
6
7
8
9
10
.fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 100%;
background: red;
overflow-y: scroll;
}

.fixed是一个可滚动的定位元素, 大小和浏览器窗口一样大.
尽管给html设置了oveflow. 但是当滚动.fixed元素时, 还是会导致导航栏上移.
ezgif-2-2175b2c74e56.gif

解决办法

1 修改绝对定位元素的大小
例如:

1
2
3
4
5
6
7
.fixed {
top: -1px
}
// or
.fixed {
left: -1px
}

2 修改绝对定位元素的位置

1
2
3
4
5
6
7
.fixed {
transform: translateX(-1px)
}
// or
.fixed {
transform: translateY(-1px)
}

3 设置opacity样式值小于1

1
2
3
4
// or
.fixed {
opacity: 0.999;
}

示例代码

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
<!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>Fixed address bar</title>
<style>
html,
body {
height: 100%;
overflow: hidden;
margin: 0;
}

.fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
/* bottom: -1px; */
/* transform: translateY(-1px); */
opacity: 0.999;
background: red;
overflow-y: scroll;
}

.content {
text-align: center;
width: 20px;
margin: auto;
background: yellow;
}
</style>
</head>

<body>
<div class="fixed">
<div class="content"></div>
</div>
<script>
const contentEl = document.querySelector('.content')
let counter = 0
while (counter < 100) {
const el = document.createElement('div')
el.innerText = counter
contentEl.appendChild(el)
counter++
}
</script>
</body>

</html>