二、(9)JavaScript常见交互效果

JavaScript-交互效果

返回顶部

效果:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        h1{height: 200px;}
        .btns{
            position: fixed;
            right: 100px;
            bottom: 50px;
            width: 60px;
            text-align: center;
            cursor: pointer;
            display: none;
        }
        #closebtn{
            border: #c2c2c2 solid 1px;
            margin: 0;
            font: 15px/2em "宋体",Serif;
        }
        #topbtn{
            background: #dddddd;
            height: 60px;
            font: 24px/60px Arial;
        }
    </style>
</head>
<body>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <h1>多复制几行,需要滚动条!!!</h1>
    <div class="btns">
        <p id="closebtn">X关闭</p>
        <div id="topbtn">Top</div>
    </div>
    <script>

        //点击top回到顶部
        topbtn.onclick=function () {
            //利用定时器制作动画效果
            var timer=setInterval(function () {
                var y=window.scrollY- 50;
                //当滚动到顶部就清除定时器
                if (y<=0){
                    clearInterval(timer);
                }
                window.scroll(0,y);
            },50);
        }
        //点击关闭隐藏
        closebtn.onclick=function () {
            this.parentNode.style.display="none";
        }

        //当滚动条滑动到一定程度时显示top按钮
        window.onscroll=function () {
            if (scrollY>=200){
                topbtn.parentNode.style.display="block";
            }else {
                topbtn.parentNode.style.display="none";
            }
        }
    </script>
</body>
</html>

正则表达式

概念

  正则表达式:是一种字符串中查找、替换、拆分、数据匹配的模式。

正则表达式的定义

1.字面量方式(常用):

  var reg=/正则表达式规则/修饰符;
2.实例化方式:

  var reg=new RegExp("正则表达式","修饰符");

3.修饰符:

  • 不区分大小写
  • 多行匹配,如果在一行找不到就继续找下一行直到结束
  • g  全局匹配,找到一个继续找下一个

4.正则表达式的使用

  1)正则表达式对象方法:

    正则表达式.test(字符串) //测试字符串中是否能找到正则表达式匹配结果,返回真或假

    正则表达式.exec(字符串) // 匹配出字符串和正则表达式的子字符串

  2)字符串对象方法:

    字符串.match(正则表达式) //匹配字符串

    字符串.replace(正则表达式,""**) // 替换匹配到的字符

    字符串.split(正则表达式) //将正则表达式匹配到的字符作为拆分间隔符

案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /**
     * 正则表达式:是一种字符串中查找、替换、拆分、数据匹配的模式
     *  正则表达式的定义:
     *      1.字面量方式(常用):
     *          var reg=/正则表达式规则/修饰符;
     *
     *      2.实例化方式:
     *          var reg=new RegExp("正则表达式","修饰符");
     *
     *      3.修饰符:
     *      i   不区分大小写
     *      m   多行匹配,如果在一行找不到就继续找下一行直到结束
     *      g   全局匹配,找到一个继续找下一个
     *
     *      4.正则表达式的使用:
     *       1)正则表达式对象方法:
     *              正则表达式.test(字符串) //测试字符串中是否能找到正则表达式匹配结果,返回真或假
     *              正则表达式.exec(字符串) // 匹配出字符串和正则表达式的子字符串
     *       2)字符串对象方法:
     *              字符串.match(正则表达式) //匹配字符串
     *              字符串.replace(正则表达式,""**) // 替换匹配到的字符
     *              字符串.split(正则表达式) //将正则表达式匹配到的字符作为拆分间隔符
     */

    var str="姓名:张三,年龄:90,电话:13900000000,爱好:打篮球。姓名:李四,电话:15912341234";
    //字面量方式
    var reg=/[0-9]{11}/g;
    console.log(str.match(reg));

    //实例化方式
    var reg1=new RegExp("[0-9]{11}","g");

    //对象方法
    console.log(reg.test(str));//test
    console.log(reg.exec(str));//exec

    console.log(str.match(reg1));//匹配字符串
    console.log(str.replace(reg,"***"));//字符串替换
    console.log(str.split(reg));//以XX作为间隔拆分
</script>
</body>
</html>

正则表达式的编写

正则表达式的编写:三段式:字符+数量+匹配模式

1.匹配字符

  •   [0-9] 匹配到括号中出现的所有字符(0123456789)
  •   [a-z] 小写字母
  •   [A-Z] 大写字母
  •   [A-z] 不区分大小写
  •   \d 匹配数字,相当于[0-9]
  •   \D 匹配非数字,除数字以外的所有字符
  •   \w 匹配单词字符,相当于[0-9A-z]
  •   \W 匹配非单词字符
  •   \t 匹配table键(缩进符)
  •   \r 匹配回车符
  •   \n 匹配换行符
  •   . 匹配除换行以外的所有字符
  •   ^ 字符串开始
  •   $ 字符串结束

2.数量

  •   * 前面匹配的字符出现0次或多次
  •   + 前面匹配的字符出现1次或多次
  •   {n} 字符出现n次
  •   {n,m} n<=数量<=m
  •   {n,} n次以上

3.匹配模式

  •   贪婪模式:默认
  •   饥饿模式:尽可能匹配少的

案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        正则表达式的编写:
            三段式:字符+数量+匹配模式
        1.匹配字符
            [0-9] 匹配到括号中出现的所有字符(0123456789)
            [a-z] 小写字母
            [A-Z] 大写字母
            [A-z] 不区分大小写
            \d  匹配数字,相当于[0-9]
            \D  匹配非数字,除数字以外的所有字符
            \w  匹配单词字符,相当于[0-9A-z]
            \W  匹配非单词字符

            \t  匹配table键(缩进符)
            \r  匹配回车符
            \n  匹配换行符
            .   匹配除换行以外的所有字符

            ^   字符串开始
            $   字符串结束

       2.数量
            *   前面匹配的字符出现0次或多次
            +   前面匹配的字符出现1次或多次
            {n}     字符出现n次
            {n,m}   n<=数量<=m
            {n,}    n次以上

      3.匹配模式
            贪婪模式:默认
            饥饿模式:尽可能匹配少的
     */
    var reg=/\D+/g;
    var str="张三:Hello World !!! 123";
    console.log(str.match(reg));
</script>
</body>
</html>

注册表单验证

效果:

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        span{
            font-size: 12px;
            margin-left: 10px;
        }
        .red{color: #f00;}
        .green{color: #0a0;}
    </style>
</head>
<body>
    <form action="login.php" method="post" id="myform">
        <p>账号:<input type="text" name="username" id="username" placeholder="请输入用户名" />
      <
span id="usernameinfo" ></span></p> <p>手机:<input type="number" name="phone" id="phone" placeholder="请输入手机号"/></p> <p>密码:<input type="password" name="pad" id="pad" placeholder="请输入密码"/></p> <p>验证码:<input type="text" name="captcha" id="captcha" placeholder="请输入验证码"/></p> <P><button type="submit">注册</button></P> </form> <script> /** * 失去焦点时做客户端验证,验证用户名,密码,手机号,验证码是否符合格式要求 * 用户名;2字以上,12字以下 * 手机号11位数字,1开头 * 密码:6个字以上,16个字以下,由字母数字下划线组成 * 验证码6位 */ //定义一个全局状态对象,用于保存验证状态 var checkstate={username:0,phone:0,pad:0,captcha:0}; //用户名验证 username.onblur=function () { var reg=/^\w{2,12}$/;//正则表达式 if (reg.test(this.value)){ this.style.border="2px solid #0a0"; usernameinfo.innerHTML="恭喜你,用户名可用!" usernameinfo.className="green"; checkstate.username=1;//通过用户名验证时,将状态修改为1,表示已通过 }else{ this.style.border="2px solid #f00"; usernameinfo.innerHTML="用户名不合法!" usernameinfo.className="red"; checkstate.username=0;//未通过验证,将状态修改为0 } } //手机号验证 phone.onblur=function () { var reg=/^1[356789]\d{9}$/; if (reg.test(this.value)){ this.style.border="2px solid #0a0"; checkstate.phone=1; }else{ this.style.border="2px solid #f00"; checkstate.phone=0; } } //密码验证 pad.onblur=function () { var reg=/^[A-z0-9_]{6,16}$/; if (reg.test(this.value)){ this.style.border="2px solid #0a0"; checkstate.pad=1; }else{ this.style.border="2px solid #f00"; checkstate.pad=0; } } //验证码 captcha.onblur=function () { var reg=/^\d{6}$/; if (reg.test(this.value)){ this.style.border="2px solid #0a0"; checkstate.captcha=1; }else{ this.style.border="2px solid #f00"; checkstate.captcha=0; } } //提交按钮,再次验证所有表单信息是否合法 myform.onsubmit=function () { //遍历checkstate状态信息 var flag=true; for (var i in checkstate){ if (checkstate[i]===0){ var obj = document.getElementById(i); obj.style.border="2px solid #f00"; // alert("不能提交,有输入未通过验证!"); flag=false; } } return flag; } </script> </body> </html>

Tab滑动菜单效果

效果:

 代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .btns a{
            background: #dddddd;
            padding: 4px 6px;
            border-radius: 6px;
            text-decoration: none;
            color: #333333;
        }
        .btns>a:hover,.btns a.on{
            background: red;
            color: #ffffff;
        }
        .box{padding-top: 10px}
        .box>div{
            width: 400px;
            height: 200px;
            display: none;
        }
        #box1{background: red; display: block;}
        #box2{background: #00A7EA;}
        #box3{background: #00aa00;}

    </style>
</head>
<body>
    <div class="btns">
        <a href="#" class="on">企业文化</a>
        <a href="#">团队介绍</a>
        <a href="#">大事记</a>
    </div>
    <div class="box">
        <div id="box1">content</div>
        <div id="box2">content</div>
        <div id="box3">content</div>
    </div>

    <script>
        //选项卡效果:移动到按钮上显示对应的盒子,切换按钮样式
        //1.移动到按钮上
        var btns = document.querySelectorAll(".btns a");
        var box = document.querySelectorAll(".box div");

        for (var i=0;i<btns.length;i++){
            //批量绑定事件
            btns[i].onmouseover=function () {
                //清除所有样式
                for (var j=0;j<btns.length;j++){
                    btns[j].className="";
                }
                //给自己加样式
                this.className="on";

                //隐藏所有盒子
                for (var k=0;k<box.length;k++){
                    box[k].style.display="none";
                }
                //显示当前按钮对应的盒子
                box[this.id].style.display="block";
            }
            //绑定事件后,在标签上加属性,保存下标
            btns[i].id=i;
        }

    </script>
</body>
</html>

图片轮播动画的制作BannerFocus

 效果图:

代码1(简单):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .banner{
            width: 1000px;
            height: 400px;
            margin: 0 auto;
            position: relative;
        }
        #imgs>img{
            width: 1000px;
            height:400px;
            display: none;
        }
        #imgs>img:first-child{ display: block; }
        #btns{
            position: absolute;
            top: 350px;
            width: 100%;
            text-align: center;
        }
        #btns>a{
            display: inline-block;/*行内块*/
            background: #c2c2c2;
            border-radius: 100%;
            width: 16px;
            height:16px;
            text-indent: -9999px;/*字符缩进,把文字移走隐藏*/
        }
        #btns>a.on{background: red;}
    </style>
</head>
<body>
    <div class="banner">
        <div id="imgs">
            <img src="images/01.jpg" alt="">
            <img src="images/02.jpg" alt="">
            <img src="images/03.jpg" alt="">
            <img src="images/04.jpg" alt="">
        </div>
        <div id="btns">
            <a href="#" class="on">0</a>
            <a href="#">1</a>
            <a href="#">2</a>
            <a href="#">3</a>
        </div>
    </div>

    <script>
        /*
            轮播图:
                1.移动到某个按钮时,显示对应的图
                2.让四个图3秒定时滚动
         */
        var a = btns.children;//得到所有的元素
        var img=imgs.children;//得到所有图片
        //批量绑定事件
        for (var i=0;i<a.length;i++){
            //为每一个按钮绑定事件
            a[i].onmouseover=function () {
                show(this.innerText);
            }
        }

        var i=1;//从1开始定时切换,刷新页面时就是0
        setInterval(function () {
            show(i%a.length);//通过整除取余让四个图不断切换
            i++;
        },1000);

        //函数封装
        function show(n) {
            //去除所有按钮的样式on
            for (var j=0;j<a.length;j++){
                a[j].className="";
            }
            //给当前鼠标移动到的位置添加样式on
            a[n].className="on";
            //隐藏所有图
            for (var k=0;k<img.length;k++){
                img[k].style.display="none";
            }
            //显示当前按钮对应的图
            img[n].style.display="block";
        }
    </script>
</body>
</html>

代码1(难): 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        ul {
            margin: 0;
            padding: 0;
            list-style: none;
        }

        .banner {
            width: 1000px;
            height: 400px;
            margin: 0 auto;
            overflow: hidden;
            position: relative;
        }

        #imgs > li {
            float: left;
        }

        #btns {
            position: absolute;
            top: 350px;
            width: 100%;
            text-align: center;
        }

        #btns > a {
            display: inline-block;
            background: #c2c2c2;
            width: 16px;
            height: 16px;
            border-radius: 100%;
            margin: 0 4px;
            text-indent: -9999px;
        }

        #btns > a.on {
            background: red;
        }
    </style>

</head>
<body>
<div class="banner">
    <ul id="imgs">
        <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>
    </ul>
</div>

<script>
    var img = imgs.children;
    //根据图片的数量自动生成对应的按钮
    var html = "<div id='btns'>";
    for (var i = 0; i < img.length; i++) {
        if (i == 0) {
            html += "<a href='#' class='on'>" + i + "</a>";
        } else {
            html += "<a href='#'>" + i + "</a>";
        }
    }
    html += "</div>";
    document.querySelector(".banner").innerHTML += html;
    //把第一个图片复制一份成为最后一张图
    imgs.innerHTML+=imgs.children[0].outerHTML;//把第一个图添加到最后一个位置
    imgs.style.width=imgs.children.length*1000+"px";//根据子元素的个数自动设置宽度

    //获取所有的按钮
    var btn = document.getElementById("btns").children;
    var timer1, timer2;
    //批量绑定事件
    for (var i = 0; i < btn.length; i++) {
        btn[i].onmouseover = function () {
            show(this.index);
            clearInterval(timer2);//移动到按钮上时,应该让自动播放停下来
        }
        //移开时让其继续播放
        btn[i].onmouseout = function () {
            scrollIndex = this.index + 1; //移上去时将下标改成当前按钮
            autoplay();//函数调用
        }
        btn[i].index = i;//为每一个按钮设置一个索引,通过与图片建立联系
    }

    //使用定时器实现自动播放
    var scrollIndex = 1;
    function autoplay() {
        timer2 = setInterval(function () {
            show(scrollIndex % btn.length);//利用整除取余实现轮流播放
            scrollIndex++;
        }, 2000);
    }
    autoplay();//函数调用

    //函数封装,实现滚动
    function show(n) {
        clearInterval(timer1);//
        //清除所有样式
        for (var j = 0; j < btn.length; j++) {
            btn[j].className = "";
        }
        btn[n].className = "on";//把当前的设置为on
        //根据索引计算出要向左移的像素值
        // imgs.style.marginLeft=-(this.index*1000)+"px";
        var i = 0;
        timer1 = setInterval(function () {
            if (i >= 1000) {
                clearInterval(timer1);
            }
            if (n>0){
                var start=-(btn[n].index-1);
            }else {
                var start=-(btn.index-1);
            }
            imgs.style.marginLeft = (start * 1000 - i) + "px";
            i += 50;
        }, 20);
    }
</script>
</body>
</html>

作业

1. 完成上课演示的三个交互效果

2. 制作一个二级下拉菜单(移到顶级菜单时显示子菜单)

3. 制作一个企业网站,练习HTML和CSS,要做界面交互效果
  基础版:只做回到顶部交互
  挑战版:完成所有交互效果,如:轮播图、选项卡、回到顶部等

posted @ 2021-02-19 20:05  全村的希望、  阅读(1828)  评论(0编辑  收藏  举报