繁体   English   中英

如何通过将鼠标悬停在另一个元素上来更改div的类

[英]How to change class of a div by hovering on another element

我想要实现的基本上是具有导航元素,例如

链接1链接2链接3

在他们下面有一张图片

[x] <-defaultImage

现在我想要的是,当我将鼠标悬停在link1上时,图像更改为image1,当我将鼠标悬停在link2上时,图像更改为image2,...,以及当我onMouseOut时-图像返回到defaultImage

我有这个工作

function mouseOverImage(elm) {
var id = document.getElementById("catPic");
img.style.width = elm.getAttribute('data-cat-width');
img.style.height = elm.getAttribute('data-cat-height');
}
function mouseOutImage() {
var id = document.getElementById("catPic");
img.style.width = img.getAttribute('data-default-width');
img.style.height = img.getAttribute('data-default-height');
}

+

<ul>
<li>
<a href="link.htm" data-cat-image="images/img11.jpg"
data-cat-width="280px"
data-cat-height="336px" onmouseover="mouseOverImage(this)"
onmouseout="mouseOutImage()">link1</a>
</li>

<li><a href="link2.htm" data-cat-image="images/img22.jpg"
data-cat-width="280px"
data-cat-height="436px" onmouseover="mouseOverImage(this)"
onmouseout="mouseOutImage()">link2</a></li>

+

<div class="floatimg">
<img src="" width="0" height="0" alt="" id="catPic"
data-default-image="images/default.jpg"
data-default-width="0px" data-default-height="40px">
</div>

而且效果很好

现在,我想更改方法,而不是每次通过onMouseOver进行更改时都使用不同的图像,我想使用Sprites

我真的很挣扎,我应该如何处理呢?

我从几个图像中生成了一个图像精灵,并且我有一个类似

.sprite-1, .sprite-2, .sprite-3, .sprite-4,
{ display: block; background: url('tmp.png') no-repeat; }
.sprite-3 { background-position: -0px -0px; width: 280px; height: 441px; }
.sprite-4 { background-position: -288px -0px; width: 280px; height: 420px; }
.sprite-5 { background-position: -576px -0px; width: 280px; height: 420px; }

我对脚本一无所知,因此请将其视为一个新问题,如果您有疑问并回答,请告诉我将代码放在何处

非常感谢您的帮助!

首先,执行一些函数来添加和删除HTMLElement中的 ,您将对此的Element.className属性感兴趣。

function hasClass(e, c) {
    return (' ' + e.className + ' ').indexOf(' ' + c + ' ') !== -1; // in list
}

function addClass(e, c) {
    if (!hasClass(e, c)) e.className += ' ' + c; // add if not in list
    return e;
}

function removeClass(e, c) {
    var i, s = ' ' + e.className + ' ';
    c = ' ' + c + ' ';
    while (-1 !== (i = s.indexOf(c))) { // while class in list
        s = s.slice(0, i) + ' ' + s.slice(i + c.length); // replace with space
    }
    e.className = s.slice(1, -1); // set
    return e;
}

然后附上听众自己喜欢的方式,例如,如果你写的鼠标悬停功能,你可以使用一个类似的模式,以现有的方式及移出时 ,如..

function chooseImage(x) {
    addClass(
        document.getElementById("catPic"),
        'sprite-'+x
    );
    // unchooseImage('default here');
}
function unchooseImage(x) {
    // chooseImage('default here');
    removeClass(
        document.getElementById("catPic"),
        'sprite-'+x
    );
}

您还可以使用另一个属性element.classList ,但这尚未被所有浏览器完全支持(仅IE 10中的基本支持)。


以下内容适用于.sprite-1.sprite-2

<a href="example.htm"
   onmouseover="chooseImage(1)"
   onmouseout="unchooseImage(1)">link1</a>
<a href="example.htm"
   onmouseover="chooseImage(2)"
   onmouseout="unchooseImage(2)">link2</a>

万一有人需要它,如果元素具有相同的父元素,则可以通过纯CSS实现。 ~或同位选择器。 关于它如何工作的进一步解释可以在这里找到。

通用的同级组合器选择器与我们刚刚看过的相邻同级组合器选择器非常相似。 不同之处在于,被选择的元素不需要立即在第一个元素之后,而是可以出现在其后的任何位置。

我做了一个jsfiddle来启发这个技巧。 https://jsfiddle.net/cwh7dww1/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM