首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过悬停在另一个元素上更改div的类

如何通过悬停在另一个元素上更改div的类
EN

Stack Overflow用户
提问于 2013-07-05 19:10:39
回答 2查看 264关注 0票数 0

我想要实现的是基本的导航元素

link1 link2 link3

在他们下面有一幅图像

X <- defaultImage

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

我有过这样的工作

代码语言:javascript
复制
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');
}

+

代码语言:javascript
复制
<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>

+

代码语言:javascript
复制
<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,我的代码如下

代码语言:javascript
复制
.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; }

我不知道脚本,所以请把它当作一个全新的问题,如果你有并且回答,请告诉我把代码放在哪里

非常感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-05 19:26:05

首先,使用一些函数从https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement中添加和删除类,您将对此的https://developer.mozilla.org/en-US/docs/Web/API/Element.className属性感兴趣。

代码语言:javascript
复制
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;
}

然后以您最喜欢的方式附加侦听器,例如,如果您为mouseover和mouseout编写函数,则可以使用与现有方式类似的模式,例如。

代码语言:javascript
复制
function chooseImage(x) {
    addClass(
        document.getElementById("catPic"),
        'sprite-'+x
    );
    // unchooseImage('default here');
}
function unchooseImage(x) {
    // chooseImage('default here');
    removeClass(
        document.getElementById("catPic"),
        'sprite-'+x
    );
}

还有一个您可以使用的属性,https://developer.mozilla.org/en-US/docs/Web/API/element.classList,但还不是所有浏览器都完全支持它(只有IE10中的基本支持)。

下面是.sprite-1.sprite-2的例子。

代码语言:javascript
复制
<a href="example.htm"
   onmouseover="chooseImage(1)"
   onmouseout="unchooseImage(1)">link1</a>
<a href="example.htm"
   onmouseover="chooseImage(2)"
   onmouseout="unchooseImage(2)">link2</a>
票数 1
EN

Stack Overflow用户

发布于 2016-06-28 22:34:24

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

一般的兄弟姐妹组合子选择器与我们刚才看到的相邻的兄弟组合子选择器非常相似。不同之处在于,被选中的元素不需要立即继承第一个元素,而是可以在它之后的任何地方出现。

我做了个小提琴手来点亮这个戏法。https://jsfiddle.net/cwh7dww1/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17495463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档