二、(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,要做界面交互效果
  基礎版:只做回到頂部交互
  挑戰版:完成所有交互效果,如:輪播圖、選項卡、回到頂部等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM