1. 程式人生 > 其它 >2021.8.11今日小結

2021.8.11今日小結

今天使用JavaScript做了輪播圖,二級選單,定時器圖片切換動畫。

今天也算是把幾個基本的效果瞭解了,JavaScript的基本的語法,函式,物件也有了一定的瞭解了。後續還需要去練習來加深印象。

下面是輪播圖的java程式碼,其中引入了自定義的函式。

<script type="text/javascript">
    window.onload = function(){
        
        let imgList = document.getElementById("imgList");
        let imgArr = document.getElementsByTagName(
"img"); // 設定ul的整體寬度 imgList.style.width = 820*imgArr.length+"px"; // 設定導航按鈕居中 let navDiv = document.getElementById("navDiv"); let outer = document.getElementById("outer"); navDiv.style.left = (outer.offsetWidth - navDiv.offsetWidth)/2 + "px"; // 預設顯示圖片的索引
let index =0; // 獲取所有a let allA = document.getElementsByTagName("a"); // 設定預設選中效果 allA[index].style.backgroundColor = "black"; // 點選超連結切換圖片 for(let i=0;i<allA.length;i++){ // 為每個超連結都新增一個num屬性 allA[i].num = i; allA[i].onclick
= function(){ //關閉自動切換的定時器 clearInterval(timer); // 獲取點選超連結的索引,並設定為index index = this.num; // 切換圖片 //imgList.style.left = -820*index+"px"; setA(); // 呼叫自定義的函式切換動畫 move(imgList, "left" , -820*index , 20 , function(){ // 重新開啟自動切換圖片 autoChange(); }); }; } // 自動切換圖片 autoChange(); // 建立一個方法來設定選中的a function setA(){ // 判定當前索引是否是最後一張圖片 if(index >= imgArr.length -1){ index =0; // 通過css將最後一張圖片換成第一張 imgList.style.left = 0; } for(let i=0;i<allA.length;i++){ allA[i].style.backgroundColor = ""; } allA[index].style.backgroundColor = "black"; }; // 定義一個自動切換的標識 var timer; // 建立一個函式來開啟自動切換圖片 function autoChange(){ // 開啟一個定時器 timer = setInterval(function(){ // 索引自增 index++; // 判定index的值 index %= imgArr.length; move(imgList, "left" , -820*index , 20 , function(){ setA(); }); },3000); }; }; </script>

下面是自定義的函式

/*
 * 可以用來獲取任意的樣式
 */
function getStyle(obj, name) {

    return window.getComputedStyle && getComputedStyle(obj, null)[name] || obj.currentStyle[name];
}

/*
 * 提取出一個函式,可以處理一些簡單的動畫效果
 * 引數:
 *         obj: 要執行動畫的元素
 *         attr: 執行動畫是要修改的屬性
 *         target: 執行動畫的目標位置
 *         speed: 執行動畫的速度
 *         callback: 回撥函式,這個函式將會在動畫執行完畢之後被呼叫
 */
function move(obj, attr, target, speed, callback) {
    //開啟定時器前,關閉上一個
    /*
     * 這裡我們的timer是一個全域性變數,所有的動畫執行時,都會共享同一個timer
     *     這樣將會導致我們執行box2的動畫時,會使box1的動畫也立即終止
     *     所以我們定時器的標識不能作為全域性變數儲存,而應該儲存到要執行動畫的物件上
     */
    clearInterval(obj.timer);

    //獲取當前值,動畫執行的起始位置
    var current = parseInt(getStyle(obj, attr));
    //起始位置   大於  目標位置 speed為負
    //起始位置  小於 目標位置 speed為正
    if(current > target) {
        //此時speed應該是負數
        speed = -speed;
    }

    //開啟一個定時器,用來移動box1
    obj.timer = setInterval(function() {
        //獲取box1的left屬性值
        var oldValue = parseInt(getStyle(obj, attr));
        //修改值
        var newValue = oldValue + speed;
        //如果newValue大於800
        //如果向右移動,則newValue > target  speed為正
        //如果向左移動,則newValue < target  speed為負
        if(speed > 0 && newValue > target || speed < 0 && newValue < target) {
            newValue = target
        }
        //將其賦值給box1
        obj.style[attr] = newValue + "px";
        //當執行800px時,停止執行動畫
        if(newValue == target) {
            clearInterval(obj.timer);
            //動畫執行完畢,呼叫回撥函式
            callback && callback();

        }

    }, 10);
}

二級選單是利用類的操作來執行的

下面是自定義的函式

/*
 * 定義一個函式,專門用來為一個元素新增class屬性值
 * 引數
 *     obj 要新增class屬性的元素
 *     cn 要新增的class的值
 *     
 */
function addClass(obj, cn) {

    //判斷obj中是否含有cn這個class
    if(!hasClass(obj, cn)) {
        obj.className += " " + cn;
    }

}

/*
 * 判斷一個物件中是否含有指定的class屬性
 *     引數:
 *         obj:要檢查的物件
 *         cn:要檢查class值
 * 如果物件中具有該class則返回true,否則返回false
 */
function hasClass(obj, cn) {

    //檢查obj中是否與b2這個class
    //var reg = /\bb2\b/;
    var reg = new RegExp("\\b" + cn + "\\b");

    return reg.test(obj.className);

}

/*
 * 刪除一個元素中的class
 */
function removeClass(obj, cn) {

    //建立一個正則表示式
    var reg = new RegExp("\\b" + cn + "\\b");

    //將class屬性中符合正則表示式的內容,替換為空串
    obj.className = obj.className.replace(reg, "");

}

/*
 * 切換一個元素的class屬性值
 *     如果有,則刪除
 *     如果沒有,則新增
 */
function toggleClass(obj, cn) {
    //判斷obj中是否有cn
    if(hasClass(obj, cn)) {
        //如果有,則刪除
        removeClass(obj, cn);
    } else {
        //如果沒有,則新增
        addClass(obj, cn);
    }
}

下面是二級選單的javascript程式碼

<script type="text/javascript">
            window.onload = function(){
                //獲取所有的class為menuSpan的元素
                var menuSpan = document.querySelectorAll(".menuSpan");
                
                //定義一個變數,來儲存當前開啟的選單
                var openDiv = menuSpan[0].parentNode;
                
                //為span繫結單擊響應函式
                for(var i=0 ; i<menuSpan.length ; i++){
                    menuSpan[i].onclick = function(){
                        
                        //this代表我當前點選的span
                        //獲取當前span的父元素
                        var parentDiv = this.parentNode;
                        
                        //切換選單的顯示狀態
                        toggleMenu(parentDiv);
                        
                        
                        //判斷openDiv和parentDiv是否相同
                        if(openDiv != parentDiv  && !hasClass(openDiv , "collapsed")){
                            //切換選單的顯示狀態
                            toggleMenu(openDiv);
                        }
                        
                        //修改openDiv為當前開啟的選單
                        openDiv = parentDiv;
                        
                    };
                }
                
                /*
                 * 用來切換選單摺疊和顯示狀態
                 */
                function toggleMenu(obj){
                    //在切換類之前,獲取元素的高度
                    var begin = obj.offsetHeight;
                    
                    //切換parentDiv的顯示
                    toggleClass(obj , "collapsed");
                    
                    //在切換類之後獲取一個高度
                    var end = obj.offsetHeight;
                    
                    //動畫效果就是將高度從begin向end過渡
                    //將元素的高度重置為begin
                    obj.style.height = begin + "px";
                    
                    //執行動畫,從bengin向end過渡
                    move(obj,"height",end,10,function(){
                        //動畫執行完畢,內聯樣式已經沒有存在的意義了,刪除之
                        obj.style.height = "";
                    });
                        
                }
                
                
            };
        </script>