js基础day05

作者: codeTao | 来源:发表于2018-04-08 00:32 被阅读22次

js基础day05

一.简单轮播图

 <style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            width: 600px;
            height: 200px;
            border: 1px solid #000;
            margin: 100px auto;

            overflow: hidden;
        }
        #oul{
            width: 9999px;
            list-style: none;

            position: relative;
            left: 0;
        }
        #oul li{
            float: left;
        }

    </style>
<div id="box">
    <ul id="oul">
        <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/01.jpg" alt=""></li>
        <li><img src="images/02.jpg" alt=""></li>
    </ul>
</div>

<script>
    //1.获取元素
    var oul = document.getElementById('oul');

    //2.偏移量
    var offsetX = 0;

    //3.开启定时器
    var timer = setInterval(function () {
        offsetX -= 10;
        //判断4张图片是否走完
        if(offsetX <= -4 * 300){
            //重置偏移量
            offsetX = 0;
        }
        //没有走4张,继续走
        oul.style.left = offsetX + 'px';
    }, 30);

</script>

二.复杂轮播图

1.页面

<style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            width: 640px;
            height: 270px;
            border: 1px solid #000;
            margin: 100px auto;

            position: relative;
            /*overflow: hidden;*/

        }
        #box ul{
            width: 9999px;
            list-style: none;
            position: absolute;
        }
        #box ul li{
            float: left;
        }

        #box span{
            width: 40px;
            height: 40px;
            text-align: center;
            line-height: 40px;

            position: absolute;
            top: 50%;
            margin-top:-20px;

            background-color: red;
        }

        #box span:nth-of-type(1){
            left: 0;
        }
        #box span:nth-of-type(2){
            right: 0;
        }

    </style>
<body>

<div id="box">
    <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>
        <li><img src="images/01.jpg" alt=""></li>
    </ul>
    <span>&lt;</span>
    <span>&gt;</span>
</div>
</body>

2.右边

//1.获取元素
    //ul
    var oul = document.getElementById('oul');
    //span
    var spanList = document.getElementById('box').getElementsByTagName('span');

    //定时器
    var timer = 0;
    //偏移量
    var offsetX = 0;
    //图片索引
    var index = 0;

    //2.添加点击事件
    //点击左边按钮,图片往右走
    spanList[0].onclick = function () {

    }

    //点击右边按钮,图片往左走
    spanList[1].onclick = function () {
        //alert(111);
        //清空上一次定时器
        clearInterval(timer);

        //每点击一次,索引加1,并记录
        index++;
        //每次点击,判断是否走完第6张
        //第6次点击,要第一张往第二张走
        //下次点击, 图片从第6张往第2张周, index = 1;
        if(index > 5){
            //还原index
            index = 1; //第7次点击,index应该从1开始累加,往第2张走
            //偏移还原为0, 下次点击,第2张走的起始位置
            offsetX = 0;
        }

        //开启定时器,走一张图片
        timer = setInterval(function () {
            //往左走
            offsetX -= 10;
            //判断是否走了一张图片
            if (offsetX <= -640 * index){
                //重置偏移量
                offsetX = -640 *index;
                //清除定时器
                clearInterval(timer);
            }

            //移动ul
            oul.style.left = offsetX + 'px';

        }, 10);

    }

3.左边

//点击左边按钮,图片往右走
    spanList[0].onclick = function () {

        //清空上一次定时器
        clearInterval(timer);

        //每点击一次,索引减1,并记录
        index--;

        //判断是否走到第1张,如果是立刻切换为第6张 index = -1
        if(index < 0 ){ //
            //偏移还原为第6张,下次点击往第5张走,第6张起始位置
            offsetX = -640 * 5;

            //4 为第5张图片, index * -640 为第五张的终点位置
            index = 4;
        }

        //开启定时器,走一张图片
        timer = setInterval(function () {
            //往右走,累加
            offsetX += 10;
            //判断是否走了一张图片
            //
            if (offsetX >= -640 *index){ // -640 * 5 >= -640 * 4
                //重置偏移量
                offsetX = -640 * index;
                //清除定时器
                clearInterval(timer);
            }

            //移动ul
            oul.style.left = offsetX + 'px';

        }, 10);
    }

4.bug

  • bug原因: 每点击一次, index累加, 连续点击,index很快就到5了,偏移量会立刻还原
  • 解决 : 添加一个全局变量,记录动画是否正在执行,即记录开关, 开关原则 有开就有关
  • flag : false 表示动画没有执行, true 表示动画正在执行
var flag = false;

//判断动画是否正在执行
if(flag == false){
    //没有执行动画,更改动画状态,记录动画状态
    flag = true;
}else{ //正在执行动画, 不允许点击
    return
}

三.发送验证码

  • 开关属性
  • disabled 不可用属性, 为true 禁止按钮点击, false 允许按钮点击
  btn.disabled = true;
  • 注意:setInterval() 是window的方法, 是由window调用的,所以this在定时器中代指window
  • 注意:要想在定时器中拿到按钮,需在开启定时器前,备份this指针

四.动态跳转

  1. 循环定时器,显示5秒后, 动态跳转
   var timer = 0;
    var count = 5;

    //开启循环定时器
    //执行5次, 5秒结束定时
    timer = setInterval(function () {
        count--;
        //判断是否走完5秒
        if(count <= 0){
            //动态跳转
            window.location.href = 'http://www.baidu.com';

            //清空定时器
            clearInterval(timer);
        }
        //更新h2文本内容
        oh2.innerText = count + '秒后跳转';
    }, 1000);

2 .递归:自己调自己(了解)

  • 递归使用条件:递归一定要由限制条件,当达到某个条件,使用return结束函数
var a = 0;
    function test() {
        a++;
        console.log(a);

        //限制条件
        if(a > 5){
            return;
        }
        //递归调用
        test();
    }

    test();
//3.延时定时器
    var count = 5;
    var timer = 0;

    function fn() {
        count--;
        //判断count 有没有走完5秒
        if(count <= 0){
            //结束定时器
            clearTimeout(timer);

            //动态跳转
            window.location.href = 'https://www.baidu.com';
        }else{
            //递归调用
//            timer = setTimeout(fn, 1000);
//            arguments.length 获取函数实参个数
//            arguments.callee 指向当前执行的函数。
            timer = setTimeout(arguments.callee, 1000);
        }
        oh2.innerText = count + '秒后跳转';
    }

    //开启延时定时器
    timer = setTimeout(fn, 1000);

五.Dom 节点

1.Dom节点

在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML。

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

2.节点树

HTML DOM 将 HTML 文档视作树结构。这种结构被称为节点树.

通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。

5.1.gif

3.节点操作

<div id="box">
    <h2 id="oh2">我是标题</h2>
</div>

1.创建节点

  • document.createElement('div')
  • 参数:要创建标签的标签名, 字符串
  • 返回值:返回创建元素节点
var newDiv = document.createElement('div');
console.log(newDiv);

2.添加节点

  • obody.appendChild(newDiv) 向元素添加新的子节点,作为最后一个子节点。
  • 参数:newDiv,必需 ,要添加的子节点
  • 返回值:返回要添加的子节点。
  • 注意: 子节点添加到当前节点的末尾
  • 注意: 谁调用appendChild() , 子节点就添加谁的末尾
//获取body
var obody = document.getElementById('obody');
var ele = obody.appendChild(newDiv);

//设置属性
ele.style.width = '100px';
ele.style.height = '100px';
ele.style.backgroundColor = 'red';
console.log(newDiv);

3.删除节点

  • removeChild(node) 删除指定元素中的子节点
  • 参数:node 必需。要删除的子节点,如果节点不存在则返回 null
  • 返回值:被删除的子节点
//获取元素
var box = document.getElementById('box');
var oh2 = document.getElementById('oh2');

//删除h2
//var ele2 = box.removeChild(oh2);

//注意:谁调用removeChild(), 就删除谁里面的子节点
var ele2 = obody.removeChild(oh2);

//注意:只能由父元素调用removeChild(), 不能自己删自己
//var ele2 = oh2.removeChild(oh2);
console.log(ele2);

4.替换子节点

  • replaceChild(newChild, refChild);
  • 参数:newChild: 必需。替换的新节点。这个新节点可以是文档中某个已存在的节点,或者您也可创建新的节点
  • 参数:refChild: 必需。被替换的节点
  • 返回值:被替换元素
//获取box
var box = document.getElementById('box');
//获取h2
var oh2 = document.getElementById('oh2');

//创建一个p标签
var op = document.createElement('p');
op.innerText = '段落pp';

//用p 替换h2
var ele2 = box.replaceChild(op, oh2);

//注意:replaceChild() 只能由父节点调用,否则不起作用
//var ele2 = obody.replaceChild(op, oh2);
console.log(ele2);

5.insertBefore(newChild, refChild);

  • 指定的已有子节点之前插入新的子节点。
  • newChild:必需, 要插入的新节点
  • refChild:可选, 插到那个节点的前边, null
  • 注意:refChild 参数为null, 在当前节点末尾插入子节点。此时和appendChild() 方法等价
    //获取box
    var box = document.getElementById('box');
    //获取h2
    var oh2 = document.getElementById('oh2');

    //创建button
    var btn = document.createElement('button');
    btn.innerText = '按钮';

    //h2前插入button
    var ele5 = box.insertBefore(btn, oh2);

6.克隆节点,复制节点
cloneNode(deep)

  • 创建节点的拷贝,并返回该副本
  • cloneNode() 方法克隆所有属性以及它们的值。
  • deep:true 会克隆当前节点, 包括当前节点中的所有子节点都克隆
  • false 只会会克隆当前节点, 不包括当前节点中的所有子节点
  • 注意: 克隆谁, 由谁来调用方法 cloneNode(false)
//    var copyBox = box.cloneNode(true);
var copyBox = box.cloneNode(false);
console.log(copyBox);

4.获取子节点

节点树中的节点彼此拥有层级关系。

  • 父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
  • 在节点树中,顶端节点被称为根(root)
  • 每个节点都有父节点、除了根(它没有父节点)
  • 一个节点可拥有任意数量的子
  • 同胞是拥有相同父节点的节点

下面的图片展示了节点树的一部分,以及节点之间的关系:

5.4.gif
  • childNodes: 获取当前节点的所有子节点 ,包含文本节点和注释节点. 返回数组

  • 可以通过nodeType 属性判断当前节点类型

    • nodeType 1 元素节点
    • nodeType 2 属性节点
    • nodeType 3 文本节点
    • nodeType 8 注释节点
  • children : 属性获取当前节点的所有的子元素

<div id="box">
    盒子文本内容
    <p id="op">我是段落</p>
    <button id="btn">点我吧</button>
    <!--注释-->
</div>
    //1.获取父节点
    var box = document.getElementById('box');
    //2.获取子节点
    var list = box.childNodes;
    console.log(box.childNodes);

    //3.创建空数组, 保存所有元素节点
    var arr = [];
    //4.遍历数组
    for(var i = 0; i < list.length; i++ ){
        //取出每一个节点
        var ele = list[i];
        //判断每一个节点nodeType值
        if(ele.nodeType == 1){
            //当前节点是元素节点,添加到数组中
            arr.push(ele);
        }
    }
    console.log(arr);
    //--------------------------------
    // children 属性获取当前节点的所有的子元素
    console.log(box.children);

5.获取兄第节点

  • nextElementSibling 获取当前节点下一个兄弟元素节点
  • nextSibling 获取当前节点的下一个兄弟节点, 兄弟节点包括文本节点和注释节点
  • previousElementSibling 获取当前节点上一个兄弟元素节点
  • previousSibling 获取当前节点的上一个兄弟节点, 兄弟节点包括文本节点和注释节点
<div id="box">
    盒子文本
    <button id="btn1">我是按钮1</button>
    <!--注释-->
    <button >我是按钮2</button>
    <button >我是按钮3</button>
</div>
<script>
    //1.获取第一个按钮
    var btn1 = document.getElementById('btn1');

    //2.nextElementSibling 获取当前节点下一个兄弟元素节点
    /*
    var btn2 = btn1.nextElementSibling;
    console.log(btn2);

    //获取第三个按钮
    var btn3 = btn1.nextElementSibling.nextElementSibling;
    console.log(btn3);*/

    //3.nextSibling 获取当前节点的下一个兄弟节点, 兄弟节点包括文本节点和注释节点
   /* var ele2 = btn1.nextSibling;
    console.log(ele2);

    var ele3 = btn1.nextSibling.nextSibling;
    console.log(ele3);*/

    //4.previousElementSibling 获取当前节点上一个兄弟元素节点
    var btn2 = document.getElementById('btn2');
    /*
    var ele2 = btn2.previousElementSibling;
    console.log(ele2);*/

    //5.previousSibling 获取当前节点的上一个兄弟节点, 兄弟节点包括文本节点和注释节点
    var ele2 = btn2.previousSibling;
    console.log(ele2);

    var ele3 = btn2.previousSibling.previousSibling;
    console.log(ele3);
</script>

6.获取父节点

  • parentNode 获取父节点
  • firstChild 获取第一个子节点,包含文本节点和注释节点
  • firstElementChild 获取第一个子元素节点
  • lastChild 获取最后一个子节点,包含文本节点和注释节点
  • lastElementChild 获取最后一个子元素节点
<div id="father">
    <!--注释-->
    <button id="son">点我吧</button>
    <h2>我是h2</h2>
</div>
<script>
    //1.获取按钮
    var btn = document.getElementById('son');

    //2.parentNode 获取父节点
    var ele = btn.parentNode;
    //console.log(ele);

    //3.设置父节点
    ele.style.width = '200px';
    ele.style.height = '200px';
    ele.style.backgroundColor = 'blue';

    //4.firstChild 获取第一个子节点,包含文本节点和注释节点
    console.log(ele.firstChild);

    //firstElementChild 获取第一个子元素节点
    console.log(ele.firstElementChild);

    //5.lastChild 获取最后一个子节点,包含文本节点和注释节点
    console.log(ele.lastChild);

    //lastElementChild 获取最后一个子元素节点
    console.log(ele.lastElementChild);
</script>

六.类名获取元素

getElementsByClassName()

  • 参数:类名, 字符串
  • 返回值:返回包含带有指定类名的所有元素的节点列表
  • 注意:getElementsByClassName() 该方法兼容性:IE9+ 和其他浏览器都支持。在IE 5,6,7,8 中无效

获取所有子节点方法比较

  • box.getElementsByTagName('*') 使用通配符 * 获取所有的子节点,包括所有子节点的结构。即能获取儿子的儿子。
  • box.children 获取的只是当前节点的所有子节点,不包括所有子节点的结构。即只能获取儿子,获取不到孙子辈。

兼容性处理

  • box.getElementsByClassName 只要有值就为真,说明浏览器支持

  • 封装函数 getEleByClass(obj, eleclass)

  • 函数功能:根据类名获取当前元素同类名子节点

  • 参数:类名,字符串

/**
 * 获取父元素 obj中所有类名为 className的元素
 * @param obj 父元素
 * @param eleclass  类名
 * @returns 返回保存同类名的数组
 */
function getEleByClass(eleclass) {
        //保存同类名元素数组
        var arr = [];
        if(obj.getElementsByClassName){
            alert('浏览器支持此方法');
            //为真,说明浏览器是支持的
            return obj.getElementsByClassName(eleclass);
        }else{
            alert('浏览器不支持此方法, 可能为ie5,6,7,8');
            //1.获取box中所有子元素, 通配符 * 获取所有子节点,包括所有子节点的结构
            //简单说,能获取p
            var btnArr = obj.getElementsByTagName('*');

            //var btnArr = box.children; //获取的只是当前节点的所有子节点,不包括所有子节点的结构
            //简单说,不能获取p
            //2.遍历数组,取出每个子节点,判断class是不是btn
            for(var i = 0; i < btnArr.length; i++ ){
                //3.取出子节点
                var ele = btnArr[i];
                //4.判断当前子节点类名是不是btn
                if(ele.className == eleclass){
                    //5.保存子元素
                    arr.push(ele);
                }
            }
            return arr;
        }
    }

七.获取文档元素

1.document.body 获取文档中body元素

2.document.title 获取文档title元素

  • 设置title
document.title = 'sk666';

3.document.head 获取文档head元素

4.document.documentElement 获取文档中 html元素

5.document.write() 可向文档写入 HTML 表达式或 JavaScript 代码

  • 参数可以是多个时,按照顺序添加到文档中
document.write('skv587666');
document.write('<h1>sk666</h1><p>我是段落</p>')

八.九宫格算法

1.算法分析

盒子宽高 100px
盒子间距 10px
总列数 3
行号 = parseInt(i / 3)
列号 = i % 3

盒子x = 列号 * (盒子宽度 + 间距);
盒子y = 行号 * (盒子高度 + 间距);
8.png

2.实现

//1.获取按钮
    var btn1 = document.getElementById('btn1');
    var btn2 = document.getElementById('btn2');

    //2.获取box所有按钮
    var box = document.getElementById('box');
    //var btnList = box.getElementsByTagName('button');
    var btnList = box.children;
    console.log(btnList);

    //3.添加点击事件
    //每行3列
    btn1.onclick = function () {
        //总列数
        var count = 3;
        //行号
        var row = 0;
        //列号
        var col = 0;

        //九宫格排布
        for(var i = 0; i < btnList.length; i++ ){
            //1.计算行号,列号
            row = parseInt(i / count);
            col = i % count;

            //2.计算按钮x和y
            // x = 列号 * (宽度 + 间距)
            var x = col * (100 + 10);

            // y = 行号 * (高度 + 间距)
            var y = row * (100 + 10);

            //3.获取每个按钮
            var btn = btnList[i];
            //设置盒子内容
            btn.innerText = row + '行,'+ col +'列';

            //4.设置按钮x和y
            btn.style.left = x + 'px';
            btn.style.top = y + 'px';

            //5.设置按钮定位
            btn.style.position = 'absolute';
        }
    }

    //每行4列
    btn2.onclick = function () {
        //总列数
        var count = 4;
        //行号
        var row = 0;
        //列号
        var col = 0;

        //九宫格排布
        for(var i = 0; i < btnList.length; i++ ){
            //1.计算行号,列号
            row = parseInt(i / count);
            col = i % count;

            //2.计算按钮x和y
            // x = 列号 * (宽度 + 间距)
            var x = col * (100 + 10);

            // y = 行号 * (高度 + 间距)
            var y = row * (100 + 10);

            //3.获取每个按钮
            var btn = btnList[i];
            //设置盒子内容
            btn.innerText = row + '行,'+ col +'列';

            //4.设置按钮x和y
            btn.style.left = x + 'px';
            btn.style.top = y + 'px';

            //5.设置按钮定位
            btn.style.position = 'absolute';
        }
    }

相关文章

  • js基础day05

    js基础day05 一.简单轮播图 二.复杂轮播图 1.页面 2.右边 3.左边 4.bug bug原因: 每点击...

  • JS:day05

    一、Array(数组) 对象 1、创建数组的几种方法 2、合并数组(concat) 3、数组转换(join / s...

  • js day05

    A我今天学了什么 1.sort排序 2.排他思想 3.冒泡排序 4.函数

  • 2018-08-18 day05 js基础

    JS基础语法 js中的注释 2.语句 一条语句结束需要加分号(现在的js版本也可以不用写) 一行写多条语句必须使用...

  • React-Native 随笔

    学习基础: js的基础知识, rect.js基础 JSX语法基础 FlexBox布局 安装 安装node.js下载...

  • 最新web前端相关课程学习链接

    js基础篇 js进阶篇 js高级篇 vue基础篇 vue高级篇 react基础 react高级 Nodejs基础 ...

  • 2018-11-05 Day05 js基础语法

    00-什么是js 01-js基础语法 02-变量 03-js运算符 04-分支结构 05-循环结构 06-函数 0...

  • 2018-05-10

    Day05课程 一、jdk -包括了Java运行环境,Java工具和Java基础的类库 -安装 1.jdk路径选择...

  • 自律给我自由—Day005

    【叶子姑娘的自律100天挑战 Day05】 2019.01.18 Day05/100 【早起】睡得很好,准时起床运...

  • web前端 -- Day23 js高级

    js基础 JavaScript简称:JS JS分三个部分: ECMAScript标准---基础的语法 DOM D...

网友评论

    本文标题:js基础day05

    本文链接:https://www.haomeiwen.com/subject/jcguhftx.html