js进阶小知识2

获取选中内容

   // 1.1 获取选中的文字 兼容
         var selectedText;
            if(window.getSelection){ // 标准模式 获取选中的文字
                selectedText = window.getSelection().toString();
            }else{ // IE 系列
                selectedText = document.selection.createRange().text;
            }

举例:微博分享

window.onload=function () {
        var selectedText;
        $("word").onmouseup=function (event) {
            if(window.getSelection){ // 标准模式 获取选中的文字
                selectedText = window.getSelection().toString();
            }else{ // IE 系列
                selectedText = document.selection.createRange().text;
            }
            $("share_weibo").style.display="block";
            var e=event || window.event;
            $("share_weibo").style.left=e.clientX+"px";
            $("share_weibo").style.top=e.clientY+"px";

        }
        //页面点击时取消选择
        document.onmousedown=function (event) {
            var e=event || window.event;
            var targetId=e.target ? e.target.id :e.srcElement.id;
            if(targetId!="share_weibo"){
                $("share_weibo").style.display = "none";
            }else{
                //链接的路径 微博分享的API接口
                window.location.href = 'http://v.t.sina.com.cn/share/share.php?searchPic=false&title=' + selectedText;
            }
            //清除选择
         window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        }
    }
</script>

2.基本动画原理 :left=offsetLeft+speed+"px"; 定时器实现累加
封装基本动画动画

//封装基本动画
function move(obj,target,speed) {
    clearInterval( obj.timer);
    var speed=target>obj.offsetLeft ? speed : -speed;
    obj.timer=setInterval(function () {
        obj.style.left=obj.offsetLeft+speed+"px";
        //判断是否超过目标值或少于目标值 可用差值与布长判断 不管大于或小于 使她等于目标值
        if(Math.abs(target-obj.offsetLeft)<Math.abs(speed)){
            clearInterval(obj.timer);
            obj.style.left=target+"px";
        }
    },20)
}

可运用基本动画做一个案例
仿淘宝轮播 原生js

<script>
        window.onload=function () {
            var aLi=$("ul").children;
            var olIndex=0,aLiIndex=0,timer=null;
            //创建元素 初始化
            $("ul").appendChild(aLi[0].cloneNode(true));
            for(var i=0;i<aLi.length-1;i++){
                var li=document.createElement('li');
                $("ol").appendChild(li);
            }
            $("ol").children[0].className="current";

            //添加事件
            var aOl= $("ol").children;
            for(var i=0;i<aOl.length;i++){
                //运用闭包 让里边可以访问外边i
                (function (i) {
                    aOl[i].onmouseover=function () {
                        for(var j=0;j<aOl.length;j++){
                            aOl[j].className="";
                        }
                        this.className="current";
                        move($("ul"),-i*750,35);
                        olIndex=aLiIndex=i;
                    }
                })(i)
            }
            clearInterval(timer);
            timer=setInterval(lunbo,3000);
            //自动轮播的函数
            function lunbo() {
                olIndex++;
                if(olIndex>aOl.length-1){
                    olIndex=0;
                }
                for(var j=0;j<aOl.length;j++){
                    aOl[j].className="";
                }
                aOl[olIndex].className="current";

                aLiIndex++;
                //关键点 当轮播到复制的图片时 left为0 索引为1 
                if(aLiIndex>aLi.length-1){
                    $("ul").style.left=0+"px";
                    aLiIndex=1;
                }
                move($("ul"),- aLiIndex*750,25);
            }
            $("slider").onmouseover=function () {
                clearInterval(timer);
            }
            $("slider").onmouseout=function () {
                timer=setInterval(lunbo,3000);
            }
        }

3.Math常用函数
Math.random() //随机获取0~1随机数
Math.round() //四舍五入取值
Math.ceil() //向上取值
Math.floor() //向下取值
Math.abs() //取正数

4.缓动动画 例如:speed改变 left=offsetLeft+speed+"px" speed=(target-offsetLeft)*缓动系数
封装缓动函数

**
 * 缓动动画
 * @param obj
 * @param json
 * @param fuc
 */

function buffer(obj, json,fuc) {
    // 1.1 清除定时器
    clearInterval(obj.timer);
    // 1.2 设置定时器
    var begin = 0, target = 0, speed = 0;
    obj.timer = setInterval(function () {
        // 1.3.0 旗帜
        var flag = true;
        for(var k in json){
            // 1.3 获取初始值
            begin = parseInt(getStyleAttr(obj, k)) || 0;
            target = parseInt(json[k]);

            // 1.4 求出步长
            speed = (target - begin) * 0.2;

            // 1.5 判断是否向上取整
            speed = (target > begin) ? Math.ceil(speed) : Math.floor(speed);

            // 1.6 动起来
            obj.style[k] = begin + speed + "px";

            // 1.5 判断
            if(begin !== target){
                flag = false;
            }
        }
        // 1.3 清除定时器
        if(flag){
            clearInterval(obj.timer);
            // 判断有没有回调函数
            if(fuc){
                fuc();
            }
        }
    }, 20);

}

举例:缓动动画未封装时 返回顶部 原理:begin=scroll().top target=0;
scrollTo(0,begin)

window.onload=function () {

        //声明变量
        var begin=0,end=0,timer=null;
        clearInterval(timer);
        //监听窗口滚动
        window.onscroll=function () {
            begin=scroll().top;
            begin>0 ? show($("top")) : hide($("top"));
            $("top").onclick=function () {
                timer=setInterval(function () {
                    //欢动动画
                    begin+=(end-begin)*0.2;
                    scrollTo(0,begin);
                    console.log(begin,end);
                    //清除定时器
                    if(parseInt(begin)==end){
                        clearInterval(timer);
                    }
                },20)
            }

        }
    }

5.获取css值 封装函数

  function getStyleAttr(obj, attr) {
        if(obj.currentStyle){ // IE 和 opera
            return obj.currentStyle[attr];
        }else {
            return window.getComputedStyle(obj, null)[attr];
        }
    }

举例:楼层特效 原理:鼠标点击 运动相同位置 scrollTop=索引*client().height 滚动条滚动 左边划到相应楼层原理:当滚动条滚动距离>=当前划到大的内容.offsetTop 设置当前状态

 window.onload=function () {
        //1.获取元素
        var oLis=$("ol").children;
        var uLis=$("ul").children;
        //2.初始化li颜色
        var colorArr = ['red', 'green', 'blue', 'purple', 'yellow'];
        for(var i=0;i<colorArr.length;i++){
            uLis[i].style.backgroundColor=colorArr[i];

        }
        var iClick=false;
        //3.添加点击事件 动画实现
        for(var i=0;i<oLis.length;i++){
            (function (i) {
                var oI=oLis[i];
                oI.onmousedown=function () {
                    iClick=true;
                    for(var j=0;j<oLis.length;j++){
                        oLis[j].className="";
                    }
                    this.className="current";

                    //document.documentElement.scrollTop=通过索引*可视区域的高度
                    buffer(document.documentElement,{scrollTop:i*client().height});
                    iClick=false;
                }
            })(i)
        }
        //4.当滚动条滚动时 左边Li显示当前li
        document.onscroll=function () {
            if(!iClick){
                //获取滚动高度
                var roll=scroll().top;
                for(var i=0;i<uLis.length;i++){
                    if(roll>=uLis[i].offsetTop){
                        for(var j=0;j<oLis.length;j++){
                            oLis[j].className="";
                        }
                        oLis[i].className="current";
                    }
                }
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容