我有一些图像用作jQuery切换开关 - 在点击事件中显示或隐藏元素。
下面的代码大多按预期工作,但我相当肯定我正在使用很多不必要的东西来实现它。有关精简的任何建议吗?
此外,关于关闭(切换隐藏)任何已经切换为可见的可见元素的建议?现在,如果用户点击第一张图像然后点击第二张图片,它会将新显示的元素叠加在一起。理想情况下,当单击第二个切换和/或关闭滚动事件上的任何打开元素时,我想关闭(隐藏)第一个切换元素。
以下代码已删节。实际上有10多个切换,如果用户打开了一堆切换,可能会有点笨拙。
编辑 - 根据以下答案,我使用了常见的类来收紧jQuery。当单击下一个切换时,解决方案还关闭(隐藏)任何其他打开(可见)元素,但仅在该切换的父级内。由于在多个父div之间有多个UL分解,单击关闭wihtin“column2”将关闭“column2”中的任何可见元素,但不会关闭另一列(即:column1中的open / visible元素)
更新后的代码:
$(".show-wine").click(function(){
// Hide all wines except for the one that was clicked
$(this).parent().siblings().find(".wine-text").hide();
// Show or hide the one that was clicked
$(".wine-text", $(this).parent()).toggle();
});
$(".hide-wine").click(function(){
$('.wine-text').hide(); // Hide all wines
});
.wine-text {
display:none;
position:fixed;
top:3em;
left:1.5em;
width:35em;
padding:1em;
height:auto;
min-height:30em;
background: rgba(0,0,0,0.95);
color:#FFF;
border-radius:4px;
line-height:1.25em;
text-align:left;
}
.wine-tiles li img:hover {
cursor:pointer;
opacity:.7;
}
.wine-tiles li img .unhide:hover .wine-text {
display:block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="column1">
<ul class="wine-tiles">
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#1</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title1</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#2</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title2</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#3</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title3</h2>
</li>
</ul>
</div>
<div id="column2">
<ul class="wine-tiles">
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#4</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title4</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#5</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title5</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#6</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title6</h2>
</li>
</ul>
</div>
原始代码:
$("#show-wine").click(function(){
$(".wine-text").toggle();
});
$("#show-wine2").click(function(){
$(".wine-text2").toggle();
});
$("#show-wine3").click(function(){
$(".wine-text3").toggle();
});
.wine-text, .wine-text2, .wine-text3, .wine-text4, .wine-text5, .wine-text6, .wine-text7, .wine-text8, .wine-text9 {
display:none;
position:fixed;
top:3em;
left:1.5em;
width:35em;
padding:1em;
height:auto;
min-height:30em;
background: rgba(0,0,0,0.95);
color:#FFF;
border-radius:4px;
line-height:1.25em;
text-align:left;
}
.wine-tiles li img:hover {
cursor:pointer;
opacity:.7;
}
.wine-tiles li img .unhide:hover .wine-text {
display:block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="column1">
<ul class="wine-tiles">
<li>
<img src="images/labels/image.jpg" id="show-wine" class="unhide bounce" alt="Img 1"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#1</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button id="hide-wine" class="button">Close</button>
</span>
<h2>Title</h2>
</li>
<li>
<img src="images/labels/image.jpg" id="show-wine2" class="unhide bounce" alt="Img 2"/>
<span class="wine-text2">
<span class="wine-text-title centered">Wine#2</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button id="hide-wine" class="button">Close</button>
</span>
<h2>Title</h2>
</li>
<li>
<img src="images/labels/image.jpg" id="show-wine3" class="unhide bounce" alt="Img 3"/>
<span class="wine-text3">
<span class="wine-text-title centered">Wine#3</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button id="hide-wine" class="button">Close</button>
</span>
<h2>Title</h2>
</li>
</ul>
</div>
<div id="column2">
<ul class="wine-tiles">
<li>
<img src="images/labels/image.jpg" id="show-wine" class="unhide bounce" alt="Img 1"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#4</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button id="hide-wine" class="button">Close</button>
</span>
<h2>Title</h2>
</li>
<li>
<img src="images/labels/image.jpg" id="show-wine2" class="unhide bounce" alt="Img 2"/>
<span class="wine-text2">
<span class="wine-text-title centered">Wine#5</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button id="hide-wine" class="button">Close</button>
</span>
<h2>Title</h2>
</li>
<li>
<img src="images/labels/image.jpg" id="show-wine3" class="unhide bounce" alt="Img 3"/>
<span class="wine-text3">
<span class="wine-text-title centered">Wine#6</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button id="hide-wine" class="button">Close</button>
</span>
<h2>Title</h2>
</li>
</ul>
</div>
答案 0 :(得分:1)
只需为触发切换的元素和切换元素上的公共类提供一个公共类。然后,对于您的具体情况,您可以使用:
$(".show-wine").click(function(){
var $target = $(this).next('.wine-text').toggle();
$('.wine-text').not($target).hide()
});
如果稍微更改DOM,那将无效。对于更一般的情况,您需要首先定位共同父母:
$(".show-wine").click(function(){
var $target = $(this).closest('li').find('.wine-text').toggle();
$('.wine-text').not($target).hide()
});
$(".show-wine").click(function(){
var $target = $(this).closest('li').find('.wine-text').toggle();
$('.wine-text').not($target).hide()
});
&#13;
.wine-text {
display:none;
position:fixed;
top:3em;
left:1.5em;
width:35em;
padding:1em;
height:auto;
min-height:30em;
background: rgba(0,0,0,0.95);
color:#FFF;
border-radius:4px;
line-height:1.25em;
text-align:left;
}
.wine-tiles li img:hover {
cursor:pointer;
opacity:.7;
}
.wine-tiles li img .unhide:hover .wine-text {
display:block;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="column1">
<ul class="wine-tiles">
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#1</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title1</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#2</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title2</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#3</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title3</h2>
</li>
</ul>
</div>
<div id="column2">
<ul class="wine-tiles">
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#4</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title4</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#5</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title5</h2>
</li>
<li>
<img src="images/labels/image.jpg" class="show-wine unhide bounce" alt="Img 3"/>
<span class="wine-text">
<span class="wine-text-title centered">Wine#6</span><br>
<span class="wine-text-winery centered">Big White House</span><br><br>
<span class="wine-text-copy">Lorem Ipsum</span>
<br/><br/>
<button class="button hide-wine">Close</button>
</span>
<h2>Title6</h2>
</li>
</ul>
</div>
&#13;
答案 1 :(得分:1)
我不确定这是否是最有效的方法(有多种方式可以做到这一点),但这将是其中之一:
http://jsfiddle.net/zah9a7xp/2/
通过按类选择图像并使用它的父级,您可以获得如下的javascript代码:
$(".show-wine").click(function(){
var $target = $(".wine-text", $(this).parent());
// Hide all wines except for the one that was clicked
$('.wine-text').not($target).hide();
// Show or hide the one that was clicked
$target.toggle();
});
$(".hide-wine").click(function(){
$('.wine-text').hide(); // Hide all wines
});