我创建了一种方法,可以在鼠标悬停时在图像的一侧显示黑条。当它只有一个图像时,一切都很好,但是当应用于多个图像时,如果鼠标悬停,则两个图像上都会出现黑条。
是否可以让每个图像彼此独立地操作,以便鼠标悬停事件仅激活该特定图像的黑条?
jsFiddle - http://jsfiddle.net/7kw8z/11/
我通过$("img.edit").panzoom();
这是方法:
!function($){
$.fn.panzoom = function() {
var $this = $(this);
this.imagesLoaded(function(){
$this.wrap('<div class="img_wrapper" />');
var imgEl = $this.parent(".img_wrapper");
imgEl.width($this.width());
imgEl.height($this.height());
//imgEl.offset({top:$this.offset().top,left:$this.offset().left});
imgEl.append('<div class="img_menu" />');
menuEl = imgEl.children(".img_menu");
imgEl.hover(function() {
$(menuEl).css("visibility", "visible");
}, function() {
$(menuEl).css("visibility", "hidden");
});
});
}
}(window.jQuery);
答案 0 :(得分:5)
你可以做到
$.fn.panzoom = function() {
return this.each(function(){
var $this = $(this);
$this.imagesLoaded(function(){
$this.wrap('<div class="img_wrapper" />');
var imgEl = $this.parent(".img_wrapper");
imgEl.width($this.width());
imgEl.height($this.height());
imgEl.append('<div class="img_menu" />');
var menuEl = imgEl.children(".img_menu");
imgEl.hover(function() {
menuEl.css("visibility", "visible");
}, function() {
menuEl.css("visibility", "hidden");
});
});
});
}
答案 1 :(得分:3)
mouseenter / leave的范围是当前元素,因此您可以使用$(this)
。你可以使用find来获取你想要显示/隐藏的元素。
imgEl.hover(function() {
$(this).find(".img_menu").css("visibility", "visible");
}, function() {
$(this).find(".img_menu").css("visibility", "hidden");
});
答案 2 :(得分:1)
不确定为什么你在js中都这样做,你能用CSS吗?只需删除
imgEl.hover(function() {
$(menuEl).css("visibility", "visible");
}, function() {
$(menuEl).css("visibility", "hidden");
});
你可以添加
.img_wrapper:hover .img_menu {
visibility: visible;
}
如果你真的需要javascript,你需要意识到你的menuEl
不是一个元素,而是一组元素* s *,由imgEl.children
表示。
答案 3 :(得分:0)
人们打败了我,但是我的回答是,在这里创建一个插件是理想的方式!
$.fn.panelize = function (initState) {
// set a default show state
var show = initState || false;
var animation = {
duration: 300,
easing: 'linear',
};
return this.each(function() {
_this = $(this);
var element = {
show: $('.show', _this),
close: $('.close', _this),
content: $('.panel-content', _this),
};
var hidePanel = function () {
_this.animate({
bottom: -(element.content.height()),
},
animation.duration,
animation.easing,
function () {
element.show.show();
element.close.hide();
})
};
var showPanel = function () {
_this.animate({
bottom: 0,
},
animation.duration,
animation.easing,
function () {
element.close.show();
element.show.hide();
})
}
// search for the show button within this context
element.show.on('click', function () {
showPanel();
})
// search for the close button within this context.
element.close.on('click', function () {
hidePanel();
});
// hide panel initally, if configured
if (!show) hidePanel();
});
}
// reduced to a single class
$('.infoToggle').panelize();
Html现在看起来像这样。
<div class="infoToggle">
<div class="panel-controller">
<div class="tab-controller">
<span class="close">CLOSE</span>
<span class="show">MORE INFO</span>
</div>
</div>
<div class="panel-content">
Content goes here
</div>
</div>
<div class="infoToggle">
<div class="panel-controller">
<div class="tab-controller">
<span class="close">CLOSE</span>
<span class="show">MORE INFO</span>
</div>
</div>
<div class="panel-content">
Content goes here
</div>
</div>