---
title: "为元素实现智能浮动"
url: "https://yjyj.net/learn/1705.html"
author: "小 虾 (生猛大蝦编辑部)"
published_at: "2012-12-09T21:02:37+08:00"
updated_at: "2012-12-09T21:40:03+08:00"
categories: "招数学习"
tags: "CSS布局技巧, JavaScript交互, jq, 前端开发实战, 浮动"
summary: "本文聚焦长文章侧边栏“智能浮动”怎么做，整理了多种实现思路：从基于滚动事件的 jQuery 写法，到纯 JavaScript 方案，再到兼容旧浏览器的处理。适合想给页面侧栏、浮动模块加跟随效果的前端实战参考，直接看代码就能上手。"
source: "生猛大蝦 (https://yjyj.net)"
---

# 为元素实现智能浮动

> 来源：[生猛大蝦 (yjyj.net)](https://yjyj.net/learn/1705.html) · 作者：小 虾 · 发布时间：2012-12-09

## 30 秒核心看点 (TL;DR)

- 长文章侧边栏想跟随滚动，核心就是监听 scroll 并切换定位方式。
- 文中对比了 jQuery 与原生 JS 两类实现，兼顾效果、兼容性和写法复杂度。
- 实操结论：固定定位最省事，但要注意旧浏览器兼容与元素初始位置计算。

最近想要改造一下[囧客圈](http://jokeoo.com)
为长文章的侧边栏加入只能浮动的div.
在网上找到了几种解决办法:

0.显示要加载一下jq库,随便选,国外有用户就用google的,国内有用户就用百度或者新浪的.

1.
 

```

```

 



2.
 

```
$.fn.smartFloat = function() {
    var position = function(element) {
        var top = element.position().top, pos = element.css("position");
        $(window).scroll(function() {
            var scrolls = $(this).scrollTop();
            if (scrolls > top) {
                if (window.XMLHttpRequest) {
                    element.css({
                        position: "fixed",
                        top: 0
                    });
                } else {
                    element.css({
                        top: scrolls
                    });
                }
            }else {
                element.css({
                    position: "absolute",
                    top: top
                });
            }
        });
    };
    return $(this).each(function() {
        position($(this));
    });
};

    $("#float").smartFloat();
```

 


3.
js:
 

```
(function(){
    var oDiv=document.getElementById("float");
    var H=0,iE6;
    var Y=oDiv;
    while(Y){H+=Y.offsetTop;Y=Y.offsetParent};
    iE6=window.ActiveXObject&&!window.XMLHttpRequest;
    if(!iE6){
        window.onscroll=function()
        {
            var s=document.body.scrollTop||document.documentElement.scrollTop;
            if(s>H){oDiv.className="div1 div2";if(iE6){oDiv.style.top=(s-H)+"px";}}
            else{oDiv.className="div1";}    
        };
    }
})();
```

 


html:
 

```

    
        //随滚动移动的部分代码
    



```

 


css:
 

```
#box{float:left;position:relative;width:295px;}
.div1{}
.div2{position:fixed;_position:absolute;top:3px;z-index:295;}
```

## 延伸问答与排错指南 (FAQ)

### 侧边栏智能浮动最核心的实现思路是什么？
本质是监听页面滚动位置，判断元素是否越过初始阈值；超过后把元素切换为 fixed 或通过脚本调整 top/marginTop，让它看起来一直跟着页面移动。关键是先算准初始 offset，再处理回滚时的复位。

### jQuery 和原生 JavaScript 方案有什么区别？
jQuery 写法更短，适合快速改造现有页面；原生 JavaScript 依赖更少，适合想减少库依赖的场景。两者思路一致，都是监听滚动并修改样式，差别主要在代码量、兼容处理和维护成本。

### 旧浏览器下做浮动效果要注意什么？
要特别注意 fixed 定位兼容性。文章里的做法会判断浏览器能力，兼容不足时改用绝对定位并动态计算 top，避免浮动模块错位或失效。实际使用时还要确认容器布局不会被浮动打乱。

---
更多 Linux 运维、WordPress 性能优化、前端工程化、Shopify 独立站与极客折腾指南：[生猛大蝦全站文章归档 (https://yjyj.net/archive)](https://yjyj.net/archive)
