不少站长和做网页的朋友都遇到过这样的问题:想在页面上加个悬浮按钮菜单,方便用户随时点客服、返回顶部或者打开购物车,结果按钮要么跟着页面跑,要么直接压在正文上,看着特别别扭。其实想把悬浮按钮菜单固定在底部右侧,同时做到不遮挡内容,真没那么复杂,核心就是 fixed 定位加上合理的边距计算。我自己前前后后调过好几个项目,踩过的坑也不少,下面把最实用的写法一次说清楚。

fixed 定位是第一步,也是最关键的一步
先说原理。悬浮按钮菜单想固定在屏幕的某个位置不随滚动动,必须用到 position: fixed。这个属性是相对于浏览器视口定位的,页面怎么滚它都不动,这就是悬浮的根基。写法很简单:
.float-menu { position: fixed; right: 20px; bottom: 20px; z-index: 999; }
right 和 bottom 控制它距离右边缘和下边缘的距离,z-index 保证按钮压在内容上面不会被盖住。很多人写出来按钮跟着页面跑,十有八九就是 position 写成了 absolute,absolute 是相对父元素或者页面定位的,一滚动就跑偏,这个坑我第一次做的时候也掉进去过。
还有个细节要注意,如果你的按钮用了 transform 相关的动画,比如鼠标移上去有个缩放效果,fixed 在部分安卓浏览器上会出现抖动或者定位失效的情况。解决办法是给外层容器定位,动画加在内层元素上,两层分开,问题就基本没有了。
怎么做到不遮挡内容,边距有讲究
固定住了只是成功一半,不遮挡内容才是用户关心的。悬浮按钮菜单固定底部右侧最常见的遮挡,就是按钮压在正文文字上,尤其是手机端屏幕窄,一个按钮能挡住三四行字,阅读体验很差。
我的习惯是:正文区域留出右侧或者底部的呼吸空间。如果页面主体是居中的内容区,悬浮按钮放右下角一般影响不大,因为那里本来就是空白。但如果你的正文是满屏铺开的,那就得给正文容器加上 padding-bottom,给底部留出一块区域专门让给悬浮按钮菜单。比如:
.container { padding-bottom: 80px; }
为什么是 80px?按钮本身高度 50px,再加 30px 的留白,视觉上不拥挤,用户滑到底也不会觉得压着东西。这个数值不用死记,看你按钮的实际高度再加个 30 左右就行。
另外一个小技巧:给悬浮按钮加个半透明和圆角阴影,就算它偶尔和内容有轻微重叠,看起来也不生硬。试过纯实色的方块直接杵在那儿,真的很突兀,改成圆角加阴影之后顺眼多了。

手机端一定要适配安全区
如果你是做移动端页面,这一步千万别省。现在大部分手机都是全面屏,底部有手势条,iPhone 底下还有 home 指示条。你写了 bottom: 20px,按钮实际显示的位置可能紧贴着手机底部的横条,既难看又容易被误触。
解决办法是加上 env() 函数,这个是专门处理安全区的:
.float-menu { position: fixed; right: 16px; bottom: calc(20px + env(safe-area-inset-bottom)); }
加了这段,按钮会自动在 iPhone 上抬高一段距离,避开 home 横条,普通安卓机不受影响。我第一次给客户做的时候没加这个,对方用苹果手机一打开就反馈按钮被横条挡住了,后来补上才解决,所以这段代码建议大家直接当成固定写法背下来。
还有 viewport 声明里要加上 viewport-fit=cover,不然 env() 不生效:
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
菜单展开收起的小细节
悬浮按钮菜单一般都带展开收起功能,点一下主按钮,旁边弹出一排小图标。这里建议用 click 控制显隐,别用 hover,手机端没有鼠标悬停这回事,hover 触发在触屏上体验很差。
展开的方向也有讲究,按钮在右下角,菜单就应该往左上方向弹,别往下弹,往下直接弹到屏幕外了。还有弹出的菜单记得加上阴影和背景,不然压在正文上会看不清内容,视觉层级很乱。
最后总结一句,悬浮按钮菜单固定在底部右侧不遮挡内容,记住三个要点:fixed 定位别写错、正文留出底部间距、移动端适配安全区。把这三步做到位,出来的效果基本不会翻车,剩下的就是按自己页面的风格调颜色和大小了。




下载 
下载
下载
下载 
下载
下载
喜欢
顶
难过
囧
围观
无聊



