CSSのホバー効果をJSで実現、モバイル端末にも対応

こんにちは、シェンディです


CSSのホバー効果をJSで実現、モバイル端末にも対応


機能概要

タッチすると CSS のホバーがトリガーされ、コンピューター側ではマウスがタッチされ、モバイル側では指がタッチされます。


ホバーをトリガーする要素やアニメーション効果をトリガーする他の要素など、CSS だけでは一部の効果を実現できない場合があるため、JS を使用する必要があります。



実装

JS は CSS のホバー効果をシミュレートしたいので、マウスの開始イベントと終了イベントを使用できます。

このようなイベントには 2 つのタイプがあり、1 つは現在の要素に対してのみ有効で、もう 1 つは現在の要素と現在の要素のサブ要素にも有効です。


var div = document.getELementById("div");
// enter是进入触发,leave移出触发,对子元素不生效,模拟hover使用这种
div.onmouseenter = function () {
    
    };
div.onmouseleave = function () {
    
    };

// over是进入触发,out是移出触发,对子元素也生效
div.onmouseover = function () {
    
    };
div.onmouseout = function () {
    
    };


上記の方法では、jsを使用してコンピュータ側でCSSのホバー効果をシミュレートできますが、モバイル側ではまだ少し問題があります

モバイル端末上の CSS ホバー効果は、指で短くタッチするだけでトリガーできます。トリガーするには、上記の方法を長押しする必要があります。

タッチ機能が使えるようになります(モバイル側のみ)

var div = document.getELementById("div");
// start按下触发,end抬起触发
div.ontouchstart = function () {
    
    };
div.ontouchend = function () {
    
    };


上記の 2 つの方法では、モバイル端末上でのホバーと同じ効果はまだ得られません。ホバーはモバイル端末上で押された後にトリガーされ、その後持ち上げてもホバーはキャンセルされません。他の要素をクリックするだけで現在のホバーがキャンセルされます


したがって、任意の要素が押された後にリリースするには、タッチスタートのみを使用できます

現在の要素のイベントが最初に実行され、その後他のイベントが実行されるため、優先順位を考慮する必要があります

コードは以下のように表示されます

var div = document.getELementById("div");
// 当前触发的元素,用于解决先后执行的问题
var curEle;
div.ontouchstart = function() {
    
    
    curEle = this;
};
// 任意元素按下解除hover
document.ontouchstart = function () {
    
    
    // 这里是解除hover部分
    // ...
    
    if (curEle) {
    
    
        // 这里是显示触摸的hover部分
        // ...
        
        // 最后将这一次触摸的元素置空,避免元素无法解除hover
        curEle = null;
    }
};

最後に、コードの 2 つの部分を統合すると、js を使用して、コンピューター側とモバイル側で CSS のホバー効果を実現できます。

まだ小さな問題があります.たとえば、モバイル端末上でホバーをトリガーするのに約 1 秒かかります. 上記の方法は直接トリガーする方法ですが、要件がある場合はそれを参照して自分で処理することができます。


最後に、達成した効果をハングします。ホバーすると要素が非表示になり、別の要素が表示されます。またその逆も同様です。

ここに画像の説明を挿入ここに画像の説明を挿入

sdpro.トップ


要素の選択を容易にするために JQ を使用したサンプル パーツの完全なコード

html

<div class="menu">
    <a>
        <div>
            <span>菜单1</span>
        </div>
        <p>内容1</p>
    </a>
    <a>
        <div>
            <span>菜单2</span>
        </div>
        <p>内容2</p>
    </a>
</div>

js

$(".menu > a").mouseenter(function () {
    
    
    $($(this).children("div")).slideUp();
    $($(this).children("p")).slideDown();
});
$(".menu > a").mouseleave(function () {
    
    
    $($(this).children("div")).slideDown();
    $($(this).children("p")).slideUp();
});

var curEle;
document.ontouchstart = function () {
    
    
    $(".menu > a > div").slideDown();
    $(".menu > a > p").slideUp();

    if (curEle) {
    
    
        $($(curEle).children("div")).slideUp();
        $($(curEle).children("p")).slideDown();
        curEle = null;
    }
};
$(".menu > a").each(function () {
    
    
    this.ontouchstart = function() {
    
    
        curEle = this;
    };
});



終わり

おすすめ

転載: blog.csdn.net/qq_41806966/article/details/129381976