前端基本功--网页特效3 11.17

一、client家族

  1. client 可视区域
    offsetWidth: width + padding + border (披着羊皮的狼)
    clientWidth: width + padding 不包含border
    scrollWidth: 大小是内容的大小
    图片1.png

二、检测屏幕宽度(可视区域)

  1. ie9及其以上的版本 window.innerWidth
    标准模式 document.documentElement.clientWidth
    怪异模式 document.body.clientWidth
  • 封装函数
 function client() {
        if(window.innerWidth != null)  // ie9 + 最新浏览器
        {
            return {
                width: window.innerWidth,
                height: window.innerHeight
            }
        }
        else if(document.compatMode === "CSS1Compat")  // 标准浏览器
        {
            return {
                width: document.documentElement.clientWidth,
                height: document.documentElement.clientHeight
            }
        }
        return {   // 怪异浏览器
            width: document.body.clientWidth,
            height: document.body.clientHeight

        }
    }
  1. 检测屏幕分辨率
    clientWidth 返回的是 可视区大小 浏览器内部的大小、
    window.screen.width 返回的是我们电脑的 分辨率 跟浏览器没有关。

三、 window.onresize 事件(改变窗口大小)

onresize 事件会在窗口或框架被调整大小时发生,响应式常用。
function fun() { 语句 }
fun 是函数体的意思
fun() 调用函数 的意思

  • 改变窗口大小时改变背景颜色:
    reSize();//先执行一遍,使窗口不改变时有初始效果
    window.onresize = reSize;//不能加括号,加括号相当于直接出执行结果
    function reSize(){
        var clientW = client().width;
1. 
        if(clientW > 960){
            document.body.style.backgroundColor = "pink";
        }
        else if(clientW > 640){
            document.body.style.backgroundColor = "red";
        }
        else {
            document.body.style.backgroundColor = "yellow";
        }
    }

四、冒泡机制

  1. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。
  2. 从里层到外层
    IE 6.0:
    div -> body -> html -> document
    其他浏览器:
    div -> body -> html -> document -> window
  3. 以下事件不冒泡:blur、focus、load、unload
  4. 阻止冒泡
1  if(event && event.stopPropagation)
2          {
3              event.stopPropagation();  //  w3c 标准
4          }
5          else
6          {
7              event.cancelBubble = true;  // ie 678  ie浏览器
8   }

5.判断当前对象
var targetId = event.target ? event.target.id : event.srcElement.id;

  • 点击隐藏
        function $(id) {
            return document.getElementById(id);
        }
        $("login").onclick = function(event){
            $("mask").style.display = "block";
            $("show").style.display = "block";
            // 隐藏滚动条
            document.body.style.overflow = "hidden";
            var event = event || window.event ;
            // 取消冒泡
            if(event && event.stopPropagation){
                event.stopPropagation();
            }
            else {
                event.cancelBubble = true ;
            }
        }
        document.onclick = function(event){
            var event = event || window.event ;
          //判断是不是当前的id
            var targetId = event.target ? event.target.id : event.srcElement.id;
            if(targetId!="show"){
            $("mask").style.display = "none";
            $("show").style.display = "none";  
            document.body.style.overflow = "visible";
            }
        }
  • 获取选中文字 弹出框

思路:onmosueup事件,鼠标弹起,弹出框,框的位置是clientX和clientY。

获取用户选中内容兼容性的写法:
if(window.getSelection)
{
    txt = window.getSelection().toString();   // 转换为字符串
}
else
{
    txt = document.selection.createRange().text;   // ie 的写法
}

综合代码:

        $("text").onmouseup = function(event){
            var event = event || window.event ;
            var x = event.clientX;
            var y = event.clientY;
            var txt ;
            //获取选中文字
            if(window.getSelection){
                txt = window.getSelection().toString();
            }
            else {
                txt = document.selectin.createRange().text;//ie 
            }
            //判断文字是否为空
            if(txt){
                 show(x,y,txt);
            }

        }
        //     document.onclick = function(event){ //用onclick包括弹起和按下,防止冒泡
        //     var event = event || window.event ;
        //     var targetId = event.target ? event.target.id : event.srcElement.id;
        //      if(targetId!="demo"){
        //     $("demo").style.display = "none";
        //     }
        // }
            document.oncmousedown = function(event){ //      用onclick包括弹起和按下,防止冒泡
            var event = event || window.event ;
            var targetId = event.target ? event.target.id : event.srcElement.id;
             if(targetId!="demo"){
            $("demo").style.display = "none";
            }
        }
        function show(xx,yy,txttxt){
            setTimeout(function(){ //加定时器防止选择很多 有bug
            $("demo").style.display = "block";
            $("demo").style.left = xx +"px";
            $("demo").style.top = yy +"px";
            $("demo").innerHTML = txttxt;
            },400)
        }
  • 动画原理
  1. 让盒子的offsetLeft 每次都加上自己定义的步长!
    10+10 = 20 + 10
  2. Math.abs(-5) 取绝对值函数
       function $(id) {
            return document.getElementById(id);
        }
        $("btn200").onclick = function(){
            animate($("box"),200);
             animate($("box1"),400);
        }
        $("btn400").onclick = function(){  //error
            animate($("box"),400);
             animate($("box1"),800);
        }
        var timer = null;
        var index = 20;
        var arr = [];//error
        arr.index = 10;
        function animate(obj,target){
            var speed = target > obj.offsetLeft ? 5 : -5 ;//判断盒子左移还是右移
            obj.timer = setInterval(function(){
                var result = target - obj.offsetLeft;// 要定义在定时器里,每次的值不一样
                if (Math.abs(result) <= 5) {
                    clearInterval(obj.timer);
                    obj.style.left = target +"px";//result的值有5px的误差,使盒子移到该到的位置。
                }
                obj.style.left = obj.offsetLeft + speed + "px";
            },30)
        }
  • 轮播图
<script type="text/javascript">
    function animate(obj,target){
            clearInterval(obj.timer);
            var speed =  obj.offsetLeft<target ? 20 : -20 ;//判断盒子左移还是右移
            obj.timer = setInterval(function(){
                var result = target - obj.offsetLeft;// 要定义在定时器里,每次的值不一样
                obj.style.left = obj.offsetLeft + speed + "px"; //不能放在最后,要在最后矫正误差
                if (Math.abs(result) <= 20) 
                 {
                    clearInterval(obj.timer);
                    obj.style.left = target +"px";//result的值有5px的误差,使盒子移到该到的位置。
                }
                
            },20)
        }
 window.onload = function () {
     var all = document.getElementById("all");
     var screen = document.getElementById("screen");
     var ul = document.getElementById("ul");
     var ullis = ul.children;
     var www = ul.children[0];
     //先克隆
     ul.appendChild(ul.children[0].cloneNode(true));//克隆第一张图片放在最后面
     //创建小li
     var ol = document.createElement("ol");
     all.appendChild(ol);
     for(var i = 0 ;i < ullis.length-1; i++){
        var li = document.createElement("li");
        li.innerHTML = i+1;
        ol.appendChild(li);
     }
     ol.children[0].className = "current";
     //开始动
     var ollis = ol.children ;
     for(i = 0 ; i < ollis.length ; i ++) {
        ollis[i].index = i; //获取索引值
        ollis[i].onmouseover  = function(){
            for(var j = 0;j < ollis.length;j++){
                ollis[j].className = ""; //清空所有类名
            }
            this.className = "current";
            animate(ul,-this.index*500);
            key = square = this.index;
        }
     }
     //添加定时器
     var timer = null; //不会冲突,这是轮播图定时器
     var key = 0;//存图片的张数
     var square = 0; //方块
     timer = setInterval(auto,1000);//开启
     function auto(){
        key++;
        if(key>ullis.length-1){
            ul.style.left = 0;//出错
            key = 1;//第六张就是第一张,第六张之后就是第二张
        }
        animate(ul,-key*500);
        // 方块
        square++;
        if(square>ollis.length-1){
            square = 0;
        }
        for (i = 0;i<ollis.length;i++){
            ollis[i].className = "";
        }
        ollis[square].className = "current"; 

     }
     all.onmouseover = function(){
        clearInterval(timer);
     }
     all.onmouseout = function(){
         timer = setInterval(auto,1000); 
     }
 }
</script>

总结:轮播图写了三遍弄清了整体思路。
第一步:获取元素。
第二步:设置鼠标滑过的效果。
第三步:设置整体定时器。
第四部:解决两个定时器的矛盾问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 1、client 家族 client 可视区域 offsetWidth: width + padding...
    越IT阅读 917评论 2 1
  • offset家族三大家族和一个事件对象三大家族(offset/scroll/client)事件对象/event ...
    Yuann阅读 946评论 0 5
  • js特效 - Day3 一、client家族 1.1 clientWidth和clientHeight 网页可见区...
    Jackson_yee_阅读 403评论 0 1
  • 一、三大系列:offset家族、scroll家族、client 1、offset 1.1.简介 offset家族就...
    magic_pill阅读 846评论 0 4
  • 东见黄牛流水前, 西下浮云望桥山。 空等白首三秋冷, 回马又见两少年。
    程石阅读 277评论 0 9