1. 程式人生 > 其它 >“滑鼠移入顯示懸浮框”特效,也可以“高大上”

“滑鼠移入顯示懸浮框”特效,也可以“高大上”

HTML5學堂(碼匠):網站中最為常見的一種特效——滑鼠移入元素,出現介紹資訊的懸浮框,要麼是淡入,要麼是單方向的滑入,總覺得太單一了有木有?其實,稍微調整一下,這個效果就可以變得“高大上”起來,雖然會涉及到一些計算,不過不難哦!快來get新技能,讓自己的網站效果變得更漂亮吧!

本文主要內容

1、案例效果與說明

2、實現原理分析

3、功能實現

1、案例效果與說明

在效果當中,當用戶將滑鼠移入一個塊時,會從滑鼠的移入方向滑入一個懸浮塊,懸浮塊會隨著滑鼠移出當前塊,且滑出方向遵循滑鼠的移出方向(錄製gif影象時不能夠錄製滑鼠,因此無法展示滑鼠位置)。看完以後,不知道大家有沒有自己的實現思路或想法。該效果的難點在於滑鼠臨界值位置的判斷。

2、實現原理分析

2.1.結構分析

由於懸浮層有可能從上下左右四個方向滑入目標塊,因此需要先針對結構進行處理。

在此,可以通過兩種方法實現“懸浮層”。

一種方法是為每個塊定位四個懸浮塊(上下左右),當滿足滑鼠移入的條件時,讓相應的懸浮塊滑入;

第二種方法是隻為每個塊定位一個懸浮框,每次滑鼠移入時,先“初始化”懸浮塊的位置,之後再控制懸浮框滑入。

在本文的案例當中,小編使用的是第二種方法(初始化懸浮塊位置)來實現滑動。

2.2.功能實現邏輯分析

首先通過JS,獲取滑鼠在塊當中的座標;

此後,根據“滑鼠所處的位置”判斷滑鼠移入方向“;

最後,再根據滑鼠移入方向來執行相應的功能。

3、功能實現

3.1.獲取滑鼠塊內座標

想要得到滑鼠在塊內位置,需要使用如下JS中獲取位置的方法:

jQuery方法中的“$(元素).offset().top”用於獲取元素距頁面頂部的距離;“$(元素).offset().left”用於獲取元素距頁面左邊的距離;

原生JS中,通過事件物件(event)的pageX可以獲取滑鼠相對於頁面的X軸位置;通過事件物件(event)的pageY可以獲取滑鼠相對於頁面的Y軸位置。

通過jQuery獲取到當前元素與頁面頂部、左側的距離,再獲取滑鼠處於頁面的座標;之後通過計算獲取到下圖中的“h”和“w”。

“h”為event.pageY-$(元素).offset().top,是滑鼠相對於塊元素內的Y軸值;“w”同理。詳細可見下圖和程式碼。

範例程式碼

  1. var x=event.pageX-$(this).offset().left,//得到滑鼠在塊中的座標
  2. y=event.pageY-$(this).offset().top,//得到滑鼠在塊中的座標

3.2.劃分方向區域

由於需要根據“滑鼠所處的位置”判斷“滑鼠移入方向”,因此為四個方向確定“臨界值”。為了便於理解,可以使用“對角線”將一個塊劃分為四個區域(如下A、B、C、D四個區域),與“滑鼠移入方向”相對應。

3.3.獲取到滑鼠的值,判斷所處的區域

如何根據滑鼠位置值,計算當前滑鼠所在位置呢?根據當前X值,求出四條對角線(即Y的臨界值),再根據該值進行判斷。

↗(左下角到右上角) Y值臨界值求法:

當前X值對應的Y值臨界值1 = 當前元素高度 / 當前元素寬度 * 當前滑鼠X值;

↘(左上角到右下角) Y值臨界值求法:

當前X值對應的Y值臨界值2 = 當前元素高度 - (當前元素高度 / 當前元素寬度* 當前滑鼠X值);

A區域條件:y值 > 臨界值1; y值 < 臨界值2(在↗對角線上方,↘的下方)

B區域條件:y值 > 臨界值1; y值 > 臨界值2(在↗對角線上方,↘的上方)

C區域條件:y值 < 臨界值1; y值 > 臨界值2(在↗對角線下方,↘的上方)

D區域條件:y值 < 臨界值1; y值 < 臨界值2(在↗對角線下方,↘的下方)

感覺很亂?別急,看圖!!!

判斷滑鼠處於B區的程式碼例項:

var x=event.pageX-$(this).offset().left,//得到滑鼠在塊中的座標
    y=event.pageY-$(this).offset().top,//得到滑鼠在塊中的座標
    h=$(this).outerHeight(),//用於獲得包括內邊界(padding)和邊框(border)的元素高度
    w=$(this).outerWidth(),//用於獲得包括內邊界(padding)和邊框(border)的元素寬度
    k=Math.floor(h/w);//正切值,為了防止不能整除
if((k * x) >= y && (h - k * x) >= y){
   //上方進入
}

3.4.根據區域,執行相應方向的功能程式碼

在判斷移入方向之後,接下來就簡單多了,為每個元素定位一個懸浮塊,根據初始位置執行相應程式碼。

//上方初始懸浮塊位置
$(this).children().css({
  "top":"-100px",
  "left": "0"
})
//設定移入動畫
$(this).children().stop(true,true).animate({
   "top":"0"
 },此處設定動畫時間,不設定為預設);
//設定移出動畫
$(this).children().stop(true,true).animate({
   "top":"-100px"
});

3.5.成品程式碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <style type="text/css">
        .move {
            width: 240px;
            height: 240px;
            margin: 100px auto;
        }
        .move li {
            position: relative;
            overflow: hidden;
            list-style: none;
            float: left;
            width: 100px;
            height: 100px;
            margin: 0 20px 20px 0;
            background: #39f;
        }
 .move li div {
            position: absolute;
            width: 100px;
            height: 100px;
            background: #000;
            opacity: 0.5;
            left: 100%;
            top: 0;
        }
    </style>
    <body>
        <ul class="move">
            <li>
                <div></div>
            </li>
            <li>
                <div></div>
            </li>
            <li>
                <div></div>
            </li>
            <li>
                <div></div>
            </li>
        </ul>
        <script src="jquery-1.7.2.js" type="text/javascript"></script>
        <script type="text/javascript">
            $('.move li').hover(function(){// 移入效果
                var x=event.pageX-$(this).offset().left,//得到滑鼠在塊中的座標
                    y=event.pageY-$(this).offset().top,//得到滑鼠在塊中的座標
                    h=$(this).outerHeight(), //用於獲得包括內邊界(padding)和邊框(border)的元素高度
                    w=$(this).outerWidth(), ///用於獲得包括內邊界(padding)和邊框(border)的元素寬度
                    k=Math.floor(h/w);//為了防止不能整除


                if((k * x) >= y && (h - k * x) >= y){//上方進入
                    //初始懸浮塊位置,下同
                    $(this).children().css({
                        "top":"-100px",
                        "left": 0
                    })
                    //設定出現動畫,下同
                    $(this).children().stop(true,true).animate({
                        "top": "0"
                    });
                }


                if((k * x) < y && (h - k * x) < y){// 從下方進入
                    $(this).children().css({
                        "top": "100px",
                        "left": "0"
                    })
                    $(this).children().stop(true,true).animate({
                        "top": "0"
                    });
                }


                if((k * x) < y && (h - k * x) > y){
                    $(this).children().css({// 從左邊進入
                        "top": "0",
                        "left": "-100px"
                    })
                    $(this).children().stop(true,true).animate({
                        "left": "0"
                    });
                }


                if((k*x)>y && (h-k*x)<y){// 從右邊進入
                    $(this).children().css({
                        "top": "0",
                        "left": "100px"
                    })
                    $(this).children().stop(true,true).animate({
                        "left": "0"
                    });
                }


            },function() { // 移出效果
                var x=event.pageX-$(this).offset().left,//得到滑鼠在塊中的座標
                    y=event.pageY-$(this).offset().top,//得到滑鼠在塊中的座標
                    h=$(this).outerHeight(),            
                    w=$(this).outerWidth(),
                    k=Math.floor(h / w);//為了防止不能整除
                if((k * x) >= y && (h - k * x) >= y){ //從上方移出
                    //移出動畫,下同
                    $(this).children().stop(true,true).animate({
                        "top": "-100px"
                    });
                }


                if((k * x) < y && (h - k * x) < y){ //從下方移出
                    $(this).children().stop(true,true).animate({
                        "top": "100px"
                    });
                }


                if((k * x ) < y && (h - k * x) > y){ //從左邊移出
                    $(this).children().stop(true,true).animate({
                        "left": "-100px"
                    });
                }
                if((k * x) > y && (h - k * x) < y){ //下右邊移出
                    $(this).children().stop(true,true).animate({
                        "left": "100px"
                    });
                }
            })
        </script>
    </body>
</html>

總結

本次文章主要介紹瞭如何獲取滑鼠在一個元素中的位置、滑鼠的移入方式,還應用到了一些數學計算,大家可以基於該效果做進一步的優化與修改,將該效果融入到其他的相關網頁製作當中。