js-特效部分学习-offsetParent、scrollHeight 、动画函数的封装

1.

offsetParent  获取的最近的定位的父元素
  offsetLeft/offsetTop  是相对于offsetParent的距离

offsetHeight/offsetWidth 获取盒子的大小   border + height + padding

<style>
        #box {
            width: 200px;
            height: 200px;
            background-color: #ff0000;

        }
        #child {
            width: 100px;
            height: 100px;
            margin-left: 10px;
            background-color: #00ff00;
        }
    </style>
</head>
<body>
    <!--offsetParent-->

    <div id="box">

        <div id="child">

        </div>

    </div>

    <script>
        var child = document.getElementById("child");
        //border + padding + width
        //offsetLeft获取的是相对于offsetParent的距离
        console.log(child.offsetLeft);
        //如果设置的子盒子有定位的父元素,offsetParent就是定位的父元素
        //此处子盒子的父元素没有定位,offsetParent就是body
        console.log(child.offsetParent);
        //父节点--box
        console.log(child.parentNode);
    </script>

2  scrollHeight  滚动内容的高度(height + padding  不包括边框)

 <style>
        #box{
            width: 100px;
            height: 100px;
            background-color: #0000ff;
        }
    </style>
</head>
<body>
<div id="box">
    哈哈哈哈哈哈哈哈哈哈
    哈哈哈哈哈哈哈哈哈哈
    哈哈哈哈哈哈哈哈哈哈
    哈哈哈哈哈哈哈哈哈哈
    哈哈哈哈哈哈哈哈哈哈
</div>
<script>
    function $$(id){
        return document.getElementById(id);
    }
</script>
<script>
    var box=$$("box");
    console.log(box.scrollHeight);
    //获取撑开的大小
    console.log(box.offsetHeight);
    //获取盒子的大小
</script>

注册 onscroll  滚动事件

<script>
//    var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;
//滚动条事件
     window.onscroll=function(){
       console.log(scroll().scrollTop);
     }

</script>

//4 获取页面滚动出去的距离
    //document.body.scrollLeft ||
document.documentElement.scrollLeft
    //document.body.scrollTop ||
document.documentElement.scrollTop
这里会产生浏览器的兼容问题,ie8记一下版本不支持document.body.scrollLeft,只支持document.documentElement.scrollLeft因此我们需要封装这个函数

/**scrollTop与scrollLeft兼容性封装
 *
 * @returns {{scrollTop: number, scrollLeft: number}}
 */
function scroll(){
    return{
        scrollTop:document.body.scrollTop||document.documentElement.scrollTop,
        scrollLeft:document.body.scrollLeft||document.documentElement.scrollLeft
    };
}

动画函数的封装

//获取任意样式
function getStyle(element, attr) {
    if(window.getComputedStyle) {
        return window.getComputedStyle(element,null)[attr];
    }else{
        return element.currentStyle[attr];
    }
}
//在修改单个属性的基础上修改
//1 修改参数,传入对象
//2 遍历对象,获取到所有的属性
//3 把target修改 成 attrs[attr]

function animate(element, attrs, fn) {
    //清除定时器
    if(element.timerId) {
        clearInterval(element.timerId);
    }

    element.timerId = setInterval(function () {
        //问题:当多个属性的最小值到达之后,动画就会停止
        //解决:当所有属性都到达目标值,动画停止

        //假设所有的属性都到达目标值,停止定时器
        var isStop = true;
        //遍历多个属性
        for(var attr in attrs) {

            if(attr === "zIndex") {
                element.style[attr] = attrs[attr];
            }else if(attr === "opacity") {
                //获取当前元素样式属性的值
                var current = parseFloat(getStyle(element, attr)) || 0;
                current *= 100;
                //每一次step的值会越来越小
                var step = (attrs[attr]*100 - current)/8;

                //三目运算符判断步长为正数向上取整 如果为负数向下取整
                step = step > 0 ?  Math.ceil(step):                            Math.floor(step);

                current += step;

                element.style[attr] = current/100;

                //更改ie下的透明度(透明度的兼容问题)
                element.style.filter = "alpha(opacity="+ current +")";

                //如果有一个属性没有到达目标值,不能停止动画
                if(step != 0) {
                    isStop = false;
                }
            }else{
                //获取当前元素样式属性的值
                var current = parseInt(getStyle(element, attr)) || 0;
                //每一次step的值会越来越小
                var step = (attrs[attr] - current)/8;

                //正数  向上取整   负数 向下取整
                step = step > 0 ?  Math.ceil(step): Math.floor(step);

                current += step;

                element.style[attr] = current + "px";

                //如果有一个属性没有到达目标值,不能停止动画
                if(step != 0) {
                    isStop = false;
                }
            }

        }

        //停止定时器
时间: 2025-01-15 22:24:14

js-特效部分学习-offsetParent、scrollHeight 、动画函数的封装的相关文章

JavaScript——WEBAPIS_深入动画函数的封装,常见网页特效

深入动画函数的封装 1.动画函数的封装 1.1 缓动效果的实现 这里有一些核心的算法,(目标值 - 现在的位置) ??/??10 = 每一次移动的步长 拿一个具体的效果举例子,比如让一个元素慢下来, 实现想法:让元素的移动距离变下,每一次的步长都变小,核心的算法:** (目标值 - 现在的位置) ??/??10??? 做为每次移动的距离步长**,其停止的条件就是当盒子到达目标位置就停止定时器 实现的代码: <body> <button>点击之后老李才飞!</button>

原生JS实现动画函数的封装

封装了一个JS方法,支持元素的基本动画:宽.高.透明度...等,也支持链式动画和同时运动. 获取元素的属性的函数并进行了兼容性处理: 1 function getStyle(obj, attr) { 2 if(obj.currentStyle){ //IE浏览器 3 return obj.currentStyle[attr]; 4 }else{ //chrome.firefox等浏览器 5 return getComputedStyle(obj,null)[attr]; 6 } 7 } 动画函数

《JS权威指南学习总结--8.7 函数属性、方法和构造函数》

内容要点:   在JS程序中,函数是值.对函数执行typeof运算会返回字符串 "function",但是函数是JS中特殊的对象.因为函数也是对象,它们也可以拥有属性和方法,就像普通的对象可以拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象. 一.length属性     在函数体内,arguments.length表示传入函数的实参的个数.    而函数本身的length属性则有着不同含义.函数length属性是只读属性,它代表函数实参的数量,这里的参数指

移动端 动画函数 的 封装

移动端 单页有时候 制作只用到简单的css3动画即可,我们简单封装一下,没必要引入zepto框架. 上面图片对应的 js var leftsbox=document.getElementById("leftsbox"); var boxdiv=leftsbox.getElementsByTagName("div"); leftsbox.onclick=function(){ for(var i=0;i<boxdiv.length;i++){ var that=

《JS权威指南学习总结--8.3 函数的实参和形参》

内容要点: 一.可选形参      当调用函数的时候传入的实参比函数声明时指定的形参个数要少,剩下的形参都将设置为undefined值.     例如:       //将对象o中可枚举的属性名追加至数组       //如果省略a,则创建一个新数组并返回这个新数组.        function getPropertyNames(o,/*optional*/a){           if(a === undefined) a= [];           for(var property

《JS权威指南学习总结--8.6 函数闭包》

内容要点:   和其他大多数现代编程一样,JS也采用词法作用域,也就是说,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的.   为了实现这种词法作用域,JS函数对象的内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链.   闭包概念:函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为"闭包".   从技术的角度讲,所有的JS函数都是闭包:它们都是对象,它们都关联到作用域链.定义大多数函

移动端滑屏全应用【四】移动端动画贞动画函数mTween封装

首先此函数是基于大家都知道的Tween动画算法的,在此基础上使用了三中讲到的兼容版动画贞,可以使动画变得更流畅. 1. 首先要记得引入Tween.js 2. 引入mTween.js 3. 调用 * mTwee.js文件如下: (这里的m意为mobile) (function(){ window.requestAnimationFrame = window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRe

Node.js用ES6原生Promise对异步函数进行封装

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.转载请注明来源http://blog.csdn.net/azureternite 目录(?)[+] Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初始状态,即等待操作的执行 fulfilled:成功的操作 rejected:失败的操作 pending的状态

基础 - 动画函数的封装

小数的取整 WHY? JS对于小数的处理能力有限 Math.round() 四舍五入取整 Math.ceil() 向上取整 Math.floor() 向下取整 属性的访问 点语法 [""]法 得到内嵌和外链的CSS 兼容写法