2018年4月

描述:导航的形状为圆角矩形,用户正在浏览的栏目的名称底色与其他不同,党用户鼠标移到其他栏目的目录的时候,底色有正在浏览的栏目缓慢移动到鼠标经过的栏目上,当鼠标移开的时候,底色又会缓慢移动到当前浏览的栏目名称下面。当用户点击某一栏目的时候,底色缓慢移动到该栏目,并固定。需要的图片自己下载哦。
实现代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>导航栏</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            background: rgba(0, 0, 0, 0.8);
        }
        .box {
            width: 800px;
            height: 42px;
            background: #fff url("images/wifi.png") right center no-repeat;
            margin: 200px auto;
            border-radius: 8px;
            position: relative;
        }
        ul {
            list-style: none;
            position: relative;
        }
        li {
            float: left;
            width: 83px;
            height: 42px;
            text-align: center;
            font: 500 16px/42px "simsun";
            cursor: pointer;
        }
        span {
            position: absolute;
            left: 0;
            top: 0;
            width: 83px;
            height: 42px;
            background: url("images/cloud.gif") no-repeat;
        }
    </style>
    <script>
        /**
         * 当页面加载结束后执行
         */
        window.onload=function () {
            //获取相关元素
            var liArr = document.getElementsByTagName("li");
            var liWidth = liArr[0].offsetWidth;
            var span = document.getElementsByTagName("span")[0];
            //设置计数器
            var count = 0;
            //绑定事件
            for (var i=0;i<liArr.length;i++){
                liArr[i].index=i;//设置索引
                //鼠标经过时候的事件
                liArr[i].onmouseover = function () {
                    animate(span,this.index*liWidth);
                }
                //鼠标移开时候的事件
                liArr[i].onmouseout = function () {
                    animate(span,count*liWidth);
                }
                //鼠标点击时候的事件
                liArr[i].onclick = function () {
                    count = this.index;
                    animate(span,count*liWidth);
                }
            }
            //封装的缓慢移动函数
            function animate(ele,target) {
                clearInterval(ele.timer);
                ele.timer=setInterval(function () {
                    var step = (target-ele.offsetLeft)/10;
                    step = step>0?Math.ceil(step):Math.floor(step);
                    ele.style.left=ele.offsetLeft+step+"px";
                    if(Math.abs(target-ele.offsetLeft)<Math.abs(step)){
                        ele.style.left=target+"px";
                        clearInterval(ele.timer);
                    }
                },18);
            }
        }
    </script>
</head>
<body>
<div class="box">
    <span></span>
    <ul>
        <li>首页信息</li>
        <li>编程语言</li>
        <li>web前段</li>
        <li>thinkPHP</li>
        <li>javascript</li>
        <li>java</li>
        <li>Python</li>
        <li>留言板</li>
    </ul>
</div>
</body>
</html>

ScrollWidth和scrollHeight(不包括border)

检测盒子的宽高。(调用者:节点元素。属性。)
盒子内容的宽高。(如果有内容超出了,显示内容的高度)
IE567可以比盒子小。 IE8+火狐谷歌不能比盒子小

scrollTop和scrollLeft

网页,被浏览器遮挡的头部和左边部分。
被卷去的头部和左边部分。

兼容性问题

  • 未声明 DTD(谷歌只支持)
    document.body.scrollTop
  • 已经声明DTD(IE678只认识他)
    document.documentElement.scrollTop
  • 火狐/谷歌/ie9+以上支持的
    window.pageYOffset
    兼容写法:

    var aaa = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
    或者
    var aaa = document.documentElement.scrollTop + document.body.scrollTop;

    获取title、body、head、html标签

  • document.title 文档标题;
  • document.head 文档的头标签
  • document.body文档的body标签;
  • document.documentElement 它表示文档的html标签, 也就是说,基本结构当中的html标签并不是通过document.html 去访问的,而是document.documentElement 。

    scroll()的封装

    方式一:

          function scroll(){
    
              return {
                  "top": window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop,
                 "left":  window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft
              }
          }

    方式二

          function scroll(){
              if(window.pageYOffset !== undefined){
                  return {
                      "top": window.pageYOffset,
                      "left": window.pageXOffset
                  };
              }else if(document.compatMode === "CSS1Compat"){
                  return {
                      "top": document.documentElement.scrollTop,
                      "left": document.documentElement.scrollLeft
                  };
              }else{
                  return {
                      "top": document.body.scrollTop,
                      "left": document.body.scrollLeft
                  };
              }
    
          }

描述:轮播图会自动循环播放图片,当用户是鼠标放在图片上的时候,图片会停止循环,当用户鼠标离开的时候,会继续循环播放图片。下面的方框也会随着轮播图的播放而对应的发生改变,鼠标经过谁的时候,就会显示对应的图片。
注意:图片要换成自己的哦,注意更改图片的大小哦。
示例图:
lbt.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>带有定时器的无缝滚动</title>
    <style type="text/css">
        * {
            padding: 0;
            margin: 0;
            list-style: none;
            border: 0;
        }

        .all {
            width: 500px;
            height: 200px;
            padding: 7px;
            border: 1px solid #ccc;
            margin: 100px auto;
            position: relative;
        }

        .screen {
            width: 500px;
            height: 200px;
            overflow: hidden;
            position: relative;
        }

        .screen li {
            width: 500px;
            height: 200px;
            overflow: hidden;
            float: left;
        }

        .screen ul {
            position: absolute;
            left: 0;
            top: 0px;
            width: 3000px;
        }

        .all ol {
            position: absolute;
            right: 10px;
            bottom: 10px;
            line-height: 20px;
            text-align: center;
        }

        .all ol li {
            float: left;
            width: 20px;
            height: 20px;
            background: #fff;
            border: 1px solid #ccc;
            margin-left: 10px;
            cursor: pointer;
        }

        .all ol li.current {
            background: yellow;
        }

        /*#arr {display: none;}*/
        #arr span {
            width: 40px;
            height: 40px;
            position: absolute;
            left: 5px;
            top: 50%;
            margin-top: -20px;
            background: #000;
            cursor: pointer;
            line-height: 40px;
            text-align: center;
            font-weight: bold;
            font-family: '黑体';
            font-size: 30px;
            color: #fff;
            opacity: 0.3;
            border: 1px solid #fff;
        }

        #arr #right {
            right: 5px;
            left: auto;
        }
    </style>
</head>
<body>
<div class="all" id='all'>
    <div class="screen" id="screen">
        <ul id="ul">
            <li><img src="images/1.jpg" width="500" height="200" /></li>
            <li><img src="images/2.jpg" width="500" height="200" /></li>
            <li><img src="images/3.jpg" width="500" height="200" /></li>
            <li><img src="images/4.jpg" width="500" height="200" /></li>
            <li><img src="images/5.jpg" width="500" height="200" /></li>
        </ul>
        <ol></ol>
        <div id="arr"><span id="left"><</span><span id="right">></span></div>
    </div>
</div>
</body>
</html>
<script>

    //1.获取相关元素。
    var box = document.getElementById("all");
    var ul = box.children[0].children[0];
    var ol = box.children[0].children[1];
    var ulLiArr = ul.children;
    //2.补齐相互盒子
    //1.复制第一张图片所在的li,填入所在的ul中。
    var newLi = ulLiArr[0].cloneNode(true);
    ul.appendChild(newLi);
    //2.生成相关的ol中的li。
    for(var i=0;i<ulLiArr.length-1;i++){
        var newOlLi = document.createElement("li");
        newOlLi.innerHTML = i+1;
        ol.appendChild(newOlLi);
    }
    //3.点亮第一个ol中的li。
    var olLiArr = ol.children;
    ol.children[0].className = "current";
    //3.鼠标放到小方块儿上,轮播图片。
    for(var i=0;i<olLiArr.length;i++){
        olLiArr[i].index = i;
        olLiArr[i].onmouseover = function () {
            for(var j=0;j<olLiArr.length;j++){
                olLiArr[j].className = "";
            }
            olLiArr[this.index].className = "current";
            animate(ul,-this.index*ul.children[0].offsetWidth);
            key = square = this.index;
        }
    }
    //4.添加定时器。
    var timer = null;
    var key = 0;
    var square = 0;
    timer = setInterval(autoPlay,1000);

    function autoPlay(){
        key++;
        square++;
        if(key>olLiArr.length){
            key=1;
            ul.style.left = 0;
        }
        animate(ul,-key*ul.children[0].offsetWidth);

        square = square>olLiArr.length-1?0:square;
        for(var j=0;j<olLiArr.length;j++){
            olLiArr[j].className = "";
        }
        olLiArr[square].className = "current";
    }
    //5.鼠标移开开启定时器,鼠标放上去开启定时器。
    box.onmouseover = function () {
        clearInterval(timer);
    }
    box.onmouseout = function () {
        timer = setInterval(autoPlay,1000);
    }
    //6.左右切换的按钮。
    var btnArr = box.children[0].children[2].children;
    btnArr[0].onclick = function () {
        key--;
        square--;
        if(key<0){
            key=4;
            ul.style.left = -5*ul.children[0].offsetWidth + "px";
        }
        animate(ul,-key*ul.children[0].offsetWidth);

        square = square<0?olLiArr.length-1:square;
        for(var j=0;j<olLiArr.length;j++){
            olLiArr[j].className = "";
        }
        olLiArr[square].className = "current";
    }
    btnArr[1].onclick = function () {
        autoPlay();
    }




    //  基本封装
    function animate(obj,target) {
        clearInterval(obj.timer);
        var speed = obj.offsetLeft < target ? 15 : -15;
        obj.timer = setInterval(function() {
            var result = target - obj.offsetLeft;
            obj.style.left = obj.offsetLeft + speed  + "px";
            if(Math.abs(result) <= 15) {
                obj.style.left = target + "px";
                clearInterval(obj.timer);
            }
        },10);
    }
</script>

描述:当用户鼠标放在图片上的时候,显示左右的按钮。离开的时候,左右按钮自动隐藏。点击左右按钮,图片依次滚动播放。
注意:代码里面的图片换成自己的哦,图片的大小也记得更改哦。
效果图:
zyjdt.png

实现代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>左右焦点图</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            //list-style: none;
        }

        #box {
            width: 490px;
            height: 170px;
            padding: 5px;
            position: relative;
            border: 1px solid #ccc;
            margin: 100px auto 0;
            overflow: hidden;
        }

        .ad {
            width: 490px;
            height: 170px;
            overflow: hidden;
            position: relative;
        }

        #box img {
            width: 490px;
        }




        .ad ul li {
            float: left;
        }

        .ad ul {
            position: absolute;
            top: 0;
            width: 2940px;
        }

        .ad ul li.current {
            display: block;
        }

        #arr {
            display: none;
        }

        #arr span {
            width: 40px;
            height: 40px;
            position: absolute;
            left: 5px;
            top: 50%;
            margin-top: -20px;
            background: #000;
            cursor: pointer;
            line-height: 40px;
            text-align: center;
            font-weight: bold;
            font-family: '黑体';
            font-size: 30px;
            color: #fff;
            opacity: 0.3;
            border: 1px solid #fff;
        }

        #arr #right {
            right: 5px;
            left: auto;
        }
    </style>
</head>
<body>
    <div class="all" id="box">
        <div class="ad">
            <ul id="imgs">
                <li><img src="images/1.jpg" alt=""></li>
                <li><img src="images/2.jpg" alt=""></li>
                <li><img src="images/3.jpg" alt=""></li>
                <li><img src="images/4.jpg" alt=""></li>
                <li><img src="images/5.jpg" alt=""></li>
            </ul>
        </div>
        <div id="arr">
            <span id="left"><</span>
            <span id="right"> ></span>
        </div>
    </div>
</body>
</html>
<script>
    //获取相关元素
  var box = document.getElementById("box");
  var imgWidth = box.children[0].offsetWidth;
  var ul = box.children[0].children[0];
  var boxLeftRight = box.children[1];
  var btnArr = boxLeftRight.children;
  //控制鼠标经过时候的左右按钮的隐藏与显示
  box.onmouseover = function () {
      boxLeftRight.style.display = "block";
  }
  box.onmouseout = function () {
      boxLeftRight.style.display = "none";
  }
  //设置计数器
  var index = 0;
  //点击更换图片
  btnArr[1].onclick = function () {
      index++;
      if(index>ul.children.length-1){
              index = ul.children.length-1;
      }
      animate(ul,-index*imgWidth);
  }
  btnArr[0].onclick = function () {
      index -- ;
      if(index<0){
          index=0;
      }
      animate(ul,-index*imgWidth);
  }
  //动画函数
  function animate(ele,target) {
      clearInterval(ele.timer);
      var speed = target>ele.offsetLeft?10:-10;
      ele.timer = setInterval(function () {
          var val = target-ele.offsetLeft;
          ele.style.left = ele.offsetLeft + speed + "px";
          if(Math.abs(val)<Math.abs(speed)){
              ele.style.left = target + "px";
              clearInterval(ele.timer);
          }
      },10)
  }
</script>

描述:鼠标经过下面的数字方框标识的时候,显示对应的图片,并且是,通过动画来实现
注意:图片要换成自己的哦,注意调整自己图片的大小,或者定义自己的图片大小。
效果图:
hdjdt.png
实现代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>滑动焦点图</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .box{
            width: 490px;
            height: 170px;
            padding: 5px;
            border: 1px solid #ccc;
            margin: 100px auto;
        }
        .inner{
            width: 490px;
            height: 170px;
            position: relative;
            overflow: hidden;
        }
        ul{
            width: 500%;
            list-style: none;
            position: relative;
            left: 0;
        }
        li{
            float: left;
        }
        .square{
            position: absolute;
            bottom: 10px;
            right: 10px;
        }
        span{
            display:inline-block;
            width: 16px;
            height: 16px;
            background: #fff;
            text-align: center;
            margin: 3px;
            border: 1px solid #ccc;
            line-height: 16px;
            cursor: pointer;
        }
        .current{
            background: #ff551d;
            color: #fff;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="inner" id="inner">
            <ul>
                <li><img src="images/01.jpg" alt=""></li>
                <li><img src="images/02.jpg" alt=""></li>
                <li><img src="images/03.jpg" alt=""></li>
                <li><img src="images/04.jpg" alt=""></li>
                <li><img src="images/05.jpg" alt=""></li>
            </ul>
            <div class="square">
                <span class="current">1</span>
                <span>2</span>
                <span>3</span>
                <span>4</span>
                <span>5</span>
            </div>
        </div>
    </div>
</body>
</html>
<script>
    /**
     * 获取相关元素
     * @type {HTMLElement | null}
     */
    var inner = document.getElementById("inner");
    var imgWidth = inner.offsetWidth;
    var ul = inner.children[0];
    var spanArr = inner.children[1].children;
    /**
     * 循环为每个方框设置指定的时间等
     */
    for(var i = 0;i<spanArr.length;i++){
        //为每一个方块设置索引
        spanArr[i].index = i;
        //每一个方框设置鼠标经过事件
        spanArr[i].onmouseover = function () {
            //排他思想,为每一个方框设置鼠标经过时候的颜色
            for (var j = 0;j<spanArr.length;j++){
                spanArr[j].className = "";
            }
            this.className = "current";
            //调用动画函数
            animate(ul,-this.index*imgWidth);
        }
    }

    /**
     * 动画函数
     * @param ele 调用者
     * @param target 移动的位置
     */
    function animate (ele,target) {
        clearInterval(ele.timer);
        var speed = target>ele.offsetLeft?10:-10;
        ele.timer = setInterval(function () {
            var val = target-ele.offsetLeft;
            ele.style.left = ele.offsetLeft + speed + "px";
            if(Math.abs(val)<Math.abs(speed)){
                ele.style.left = target + "px";
                clearInterval(ele.timer);
            }
        },10)
    }
</script>

offsetWidth和offsetHight 以及offsetLeft和offsetTop以及offsetParent共同组成了offset家族。获取的值会四舍五入

offsetWidth和offsetHight

这两个属性,他们绑定在了所有的节点元素上。获取之后,只要调用这两个属性,我们就能够获取元素节点的宽和高。

offset宽/高  =  盒子自身的宽/高 + padding +border;
offsetWidth = width+padding+border;
offsetHeight = Height+padding+border;

offsetLeft和offsetTop

返回距离上级盒子(带有定位)左边s的位置
如果父级都没有定位则以body为准
offsetLeft 从父亲的padding 开始算,父亲的border 不算。
在父盒子有定位的情况下,offsetLeft == style.left(去掉px)

offsetParent

  • 返回该对象的父级 (带有定位)如果当前元素的父级元素没有进行CSS定位,offsetParent为body。
  • 如果当前元素的父级元素中有CSS定位,offsetParent取最近的那个父级元素。父系盒子中都没有定位的话,就返回body。

    offsetLeft和style.left区别

  • offsetLeft可以返回没有定位盒子的距离左侧的位置。 而 style.left不可以,Style.left只能获取行内式,如果没有返回””;
  • offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px;
  • offsetTop 只读,而 style.top 可读写。(只读是获取值,可写是赋值)

事件的绑定

方式一:直接绑定

var btn = document.getElementsByTagName("button")[0];
btn.onclick = function () {
    console.log("1");
}

注意:该方式绑定的事件,后来的会覆盖掉以前的。
方式二:addEventListener

btn.addEventListener("click",fn1);
function fn1(){
    console.log("1");
}

注意:该方式绑定的事件,后来的不会覆盖掉以前的。

添加事件的兼容性写法

EventListen = {
        addEvent: function (ele,fn,str) {
            //通过判断调用的方式兼容IE678
            //判断浏览器是否支持该方法,如果支持那么调用,如果不支持换其他方法
            if(ele.addEventListener){
                //直接调用
                ele.addEventListener(str,fn);
            }else if(ele.attachEvent){
                ele.attachEvent("on"+str,fn);
            }else{
                //在addEventListener和attachEvent都不存在的情况下,用此代码
                ele["on"+str] = fn;
            }
        }
    }

解绑事件的兼容性写法

EventListen = {
    addEvent: function (ele,fn,str) {
        //通过判断调用的方式兼容IE678
        //判断浏览器是否支持该方法,如果支持那么调用,如果不支持换其他方法
        if(ele.addEventListener){
            //直接调用
            ele.addEventListener(str,fn);
        }else if(ele.attachEvent){
            ele.attachEvent("on"+str,fn);
        }else{
            //在addEventListener和attachEvent都不存在的情况下,用此代码
            ele["on"+str] = fn;
        }
    },
    removeEvent: function (ele,fn,str) {
        if(ele.removeEventListener){
            ele.removeEventListener(str,fn);
        }else if(ele.detachEvent){
            ele.detachEvent("on"+str,fn);
        }else{
            ele["on"+str] = null;
        }
    }
}

String类型是字符串的对象包装类型,可以提供给我们很多有用的操作字符串的方法
var strObj = new String("hello world");

属性

  • length 返回当前字符串中总共多少个字符

    方法

字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串
字符方法

  • charAt() //获取指定位置处字符
  • charCodeAt() //获取指定位置处字符的ASCII码
  • str[0] //HTML5,IE8+支持 和charAt()等效
    字符串操作方法
  • concat() //拼接字符串,等效于+,+更常用
  • slice() //从start位置开始,截取到end位置,end取不到
  • substring() //从start位置开始,截取到end位置,end取不到
  • substr() //从start位置开始,截取length个字符
    位置方法
  • indexOf() //返回指定内容在元字符串中的位置
  • lastIndexOf() //从后往前找,只找第一个匹配的
    去除空白
  • trim() //只能去除字符串前后的空白
    大小写转换方法
  • to(Locale)UpperCase() //转换大写
  • to(Locale)LowerCase() //转换小写
    其他方法
  • search() 看该字符串对象与一个正则表达式是否匹配
  • replace() 替换
  • split()字符串变数组split(); 无参,是把字符串作为一个元素添加进数组中。空字符串,分隔字符串中每一个字符,分别添加进入数组中。指定字符分隔数组:特殊符号将不会出现在数组的任意一个元素中。
  • localeCompare()(操作单个字符)

    s1.localeCompare(s2)
    s1 > s2 返回正数,一般是1
    s1 == s2 返回0
    s1 < s2 返回负数,一般是-1

  • fromCharCode()
    String.fromCharCode(101,102,103); //把ASCII码转换成字符串

描述:在页面上显示距离某一时间还有几天几时几分几秒
示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>倒计时</title>
    <style>
        .time{
            width: 1200px;
            margin: 200px auto;
            color: red;
            text-align: center;
            font: 600 30px/30px "simsun";
        }
    </style>
</head>
<body>
    <div class="time"></div>
</body>
</html>
<script>
    var time = document.getElementsByClassName("time")[0];
    var timer = setInterval(fn,1);
    function  fn() {
        var nowTime = new Date();
        var future = new Date("2018/11/23 00:00:00");
        var timeSum = future.getTime() - nowTime.getTime();
        var day = parseInt(timeSum/1000/60/60/24);
        var hour = parseInt(timeSum/1000/60/60%24);
        var minu = parseInt(timeSum/1000/60%60);
        var sec = parseInt(timeSum/1000%60);
        var millsec = parseInt(timeSum%1000);
        day = day<10 ?"0"+day:day;
        hour = hour<10? "0"+hour:hour;
        minu = minu<10?"0"+minu:minu;
        sec = sec<10?"0"+sec:sec;
        if(millsec<10){
            millsec = "00"+millsec;
        }else if(millsec<100){
            millsec = "0"+millsec;
        }
        if(timeSum<0){
            time.innerHTML = "距离孙肖宁的生日还有00天00小时00分00秒000毫秒";
            clearInterval(timer);
            return;
        }else {
            time.innerHTML = "距离孙肖宁的生日还有"+day+"天"+hour+"小时"+minu+"分"+sec+"秒"+millsec+"毫秒";

        }
    }
</script>

描述:当用打开页面的时候显示当前的日期。
实例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模拟日历</title>
</head>
<style>
    .time{
        width: 1200px;
        margin: 200px auto;
        color: red;
        text-align: center;
        font: 600 30px/30px "simsun";
    }
</style>
<body>
    <div class="time"></div>
</body>
</html>
<script>
    var date = new Date();
    var year = date.getFullYear();
    var month = date.getMonth();
    var day = date.getDate();
    var week = date.getDay();
    var arr = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
    var time = document.getElementsByClassName("time")[0];
    time.innerText = "今天是"+year+"年"+(month+1)+"月"+day+"日,"+arr[week];
</script>