2017-03-14 9 views
2

私はdivコンテナを持ち、子は4個ありますpです。 mouseenterpの場合、親コンテナにクラスを追加します。しかし、私はmouseenterと別のpまで、クラスを親コンテナに残したいと思います。どうすれば純粋なJavascriptでこれを行うことができますか?on mouseenter、クラスを追加しますが他のクラスはすべて削除してください

私はmouseoutを使用しようとしましたが、p要素を終了するとすぐにクラスをコンテナから削除します。クラスが追加される前に私はまた以下を試しましたが、私はまだ私が探している効果を得ていません。

container.classList.remove("p" + i + "-transform");

var container = document.querySelector(".container"); 
 
var p = document.querySelectorAll("p"); 
 

 
var enterMouse = function(i) { 
 
    p[i].addEventListener("mouseenter", function() { 
 
    if (i === 0) { 
 
     container.classList.remove("p" + i + "-transform"); // doesn't work 
 
     container.classList.add("p0-transform"); 
 
    } else if (i === 1) { 
 
     container.classList.remove("p" + i + "-transform"); // doesn't work 
 
     container.classList.add("p1-transform"); 
 
    } else if (i === 2) { 
 
     container.classList.remove("p" + i + "-transform"); // doesn't work 
 
     container.classList.add("p2-transform"); 
 
    } else if (i === 3) { 
 
     container.classList.remove("p" + i + "-transform"); // doesn't work 
 
     container.classList.add("p3-transform"); 
 
    } 
 
    }); 
 
} 
 

 
for (i = 0; i < p.length; i++) { 
 
    enterMouse(i); 
 
}
.p0-transform { 
 
    background-color: red; 
 
} 
 

 
.p1-transform { 
 
    background-color: green; 
 
} 
 

 
.p2-transform { 
 
    background-color: orange; 
 
} 
 

 
.p3-transform { 
 
    background-color: blue; 
 
}
<div class="container"> 
 
    <p>1</p> 
 
    <p>2</p> 
 
    <p>3</p> 
 
    <p>4</p> 
 
</div>

答えて

4

あなたは、彼らが要素上に存在しない場合でも、classList.remove()で複数のクラスを削除し、これだけ.remove()にそれらのすべてを渡すことによって、それらをすべて削除することができます。

iは、.add()を実行しているときにクラスに連結することができるので、その冗長コードを取り除くこともできます。

var container = document.querySelector(".container"); 
 
var p = document.querySelectorAll("p"); 
 
var classes = [].map.call(p, function(_, i) { return "p" + i + "-transform" }) 
 

 
function enterMouse(i) { 
 
    p[i].addEventListener("mouseenter", function() { 
 
    container.classList.remove.apply(container.classList, classes); 
 
    container.classList.add("p" + i + "-transform"); 
 
    }); 
 
} 
 

 
for (var i = 0; i < p.length; i++) { 
 
    enterMouse(i); 
 
}
.p0-transform { 
 
    background-color: red; 
 
} 
 

 
.p1-transform { 
 
    background-color: green; 
 
} 
 

 
.p2-transform { 
 
    background-color: orange; 
 
} 
 

 
.p3-transform { 
 
    background-color: blue; 
 
}
<div class="container"> 
 
    <p>1</p> 
 
    <p>2</p> 
 
    <p>3</p> 
 
    <p>4</p> 
 
</div>

container上の任意の他のクラスがあることはありません場合は、単にcontainer.className = ""


.classNameプロパティをクリアすることができますここで私はコードを書くと思います方法です現代的な機能とわずかな微調整があります:

const container = document.querySelector(".container"); 
const classes = Array.from(document.querySelectorAll("p"), function(el, i) { 
    const cls = "p" + i + "-transform"; 

    el.addEventListener("mouseenter", function() { 
    container.classList.remove(...classes); 
    container.classList.add(cls); 
    }); 

    return cls; 
}); 
+0

の要素の数が – mhodges

+1

@mhodgesを高め、これはうまくスケールしません:。クラスは'であることを考えると私はそれに基づいている、それは小さな問題ですが、私はその可能性に対処するためにそれを更新します。 –

+1

本当にありがとうございます:) – giantqtipz

0

あなたは完全に空の文字列にそのclassNameプロパティを設定することにより、要素のCSSクラスをダンプすることができます。

var container = document.querySelector(".container"); 
 
var p = document.querySelectorAll("p"); 
 

 
var enterMouse = function(i) { 
 
    p[i].addEventListener("mouseenter", function() { 
 
    if (i === 0) { 
 
     container.className = ""; // works now 
 
     container.classList.add("p0-transform"); 
 
    } else if (i === 1) { 
 
     container.className = ""; // works now 
 
     container.classList.add("p1-transform"); 
 
    } else if (i === 2) { 
 
     container.className = ""; // works now 
 
     container.classList.add("p2-transform"); 
 
    } else if (i === 3) { 
 
     container.className = ""; // works now 
 
     container.classList.add("p3-transform"); 
 
    } 
 
    }); 
 
} 
 

 
for (i = 0; i < p.length; i++) { 
 
    enterMouse(i); 
 
}
.p0-transform { 
 
    background-color: red; 
 
} 
 

 
.p1-transform { 
 
    background-color: green; 
 
} 
 

 
.p2-transform { 
 
    background-color: orange; 
 
} 
 

 
.p3-transform { 
 
    background-color: blue; 
 
}
<div class="container"> 
 
    <p>1</p> 
 
    <p>2</p> 
 
    <p>3</p> 
 
    <p>4</p> 
 
</div>

+1

提案に感謝します。これは親コンテナのすべてのクラスを削除しますか?コンテナに既存のクラスがある場合はどうなるでしょうか?私はこの4つのクラスを削除したいだけですが、既存のクラスは削除しないでください – giantqtipz

+0

はい、 'container'の_all_クラスを削除します。 classList' 'のご使用はで私をcluedている必要がありますが、あなたのオリジナルのポストは、他のクラスを維持する必要性を言及しなかった – TheJim01

関連する問題