如何让nav sliders
独立工作 ?正如您所看到的,第二个nav
按钮控制了slides
中的post
,但我需要它们独立工作,而不必更改class
结构。
$(function() {
$('.post a').on('click', function(e) {
e.preventDefault()
showSlide($(this).index());
});
showSlide(0);
function showSlide(index) {
// Make the post__slide post__slide--visible
$('.post .post__slide').removeClass('post__slide--visible');
$('.post .post__slide').eq(index).addClass('post__slide--visible');
// Set the tab to post__nav--selected
$('.post a').removeClass('post__nav--selected');
$('.post a').eq(index).addClass('post__nav--selected');
}
});
.post {
position: relative;
}
.post .post__nav {
display: flex;
border: 2px solid;
flex-wrap: wrap;
align-items: stretch;
width: 100px;
}
.post .post__nav a {
padding: 20px 0px;
text-align: center;
width: 100%;
cursor: pointer;
}
.post .post__nav a:hover,
.post .post__nav a.post__nav--selected {
color: #737d8b;
font-weight: 700;
}
.post .post__slide {
position: absolute;
top: 0px;
left: 100px;
width: 0px;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
opacity: 0;
transition: opacity 0.1s linear 0s;
}
.post .post__slide.post__slide--visible {
width: calc(100% - 100px);
overflow: scroll;
opacity: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="post">
<div class="post__menu">
<nav class="post__nav">
<a>post__slide #1</a>
<a>post__slide #2</a>
<a>post__slide #3</a>
</nav>
</div>
<div class="post__slide">
<p>post__slide #1</p>
</div>
<div class="post__slide">
<p>post__slide #2</p>
</div>
<div class="post__slide">
<p>post__slide #3</p>
</div>
</div>
<div class="post">
<div class="post__menu">
<nav class="post__nav">
<a>post__slide #1</a>
<a>post__slide #2</a>
<a>post__slide #3</a>
</nav>
</div>
<div class="post__slide">
<p>post__slide #1</p>
</div>
<div class="post__slide">
<p>post__slide #2</p>
</div>
<div class="post__slide">
<p>post__slide #3</p>
</div>
</div>
答案 0 :(得分:1)
如果我理解正确,您只想在其幻灯片容器内显示一张幻灯片。
您的代码有问题:
$('.post .post__slide')
会在class = post中查找这两个div中的所有.post__slide
。您预期的结果应该只是查询用户单击的幻灯片容器中的.post__slide
。
我的想法,
使用.jQuery()的第二个参数来控制选择器上下文。
正如JQuery定义的那样:
选择器上下文
默认情况下,选择器在DOM开始时执行搜索 在文档根目录。但是,可以给出替代上下文 通过使用可选的第二个参数到$()函数进行搜索。 例如,要在事件处理程序中进行搜索,搜索可以是 限制如下:1 2 3
$(&#34; div.foo&#34;)。click(function(){$(&#34; span&#34;,this).addClass(&#34; bar&#34; ); });
当搜索范围选择器仅限于上下文时 这样,只有点击元素中的跨度才能获得额外的元素 类。
在内部,选择器上下文是使用.find()方法实现的, 所以$(&#34; span&#34;,this)相当于$(this).find(&#34; span&#34;)。
工作代码:
// first parameter: slide container
// second parameter: the index of the slide
function showSlide(slideContainer, index) {
// Make the post__slide post__slide--visible
$('.post__slide', slideContainer).removeClass('post__slide--visible');
$('.post__slide', slideContainer).eq(index).addClass('post__slide--visible');
// Set the tab to post__nav--selected
$('a', slideContainer).removeClass('post__nav--selected');
$('a', slideContainer).eq(index).addClass('post__nav--selected');
}
$(function() {
$('.post a').on('click', function(e) {
e.preventDefault()
showSlide($(this).parent().parent().parent(),$(this).index());
});
// load default slide
$('.post').each(function(index, item) {
showSlide(item, 0);
});
});
&#13;
.post {
position: relative;
}
.post .post__nav {
display: flex;
border: 2px solid;
flex-wrap: wrap;
align-items: stretch;
width: 100px;
}
.post .post__nav a {
padding: 20px 0px;
text-align: center;
width: 100%;
cursor: pointer;
}
.post .post__nav a:hover,
.post .post__nav a.post__nav--selected {
color: #737d8b;
font-weight: 700;
}
.post .post__slide {
position: absolute;
top: 0px;
left: 100px;
width: 0px;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
opacity: 0;
transition: opacity 0.1s linear 0s;
}
.post .post__slide.post__slide--visible {
width: calc(100% - 100px);
overflow: scroll;
opacity: 1;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="post">
<div class="post__menu">
<nav class="post__nav">
<a>post__slide #1</a>
<a>post__slide #2</a>
<a>post__slide #3</a>
</nav>
</div>
<div class="post__slide">
<p>post__slide #1</p>
</div>
<div class="post__slide">
<p>post__slide #2</p>
</div>
<div class="post__slide">
<p>post__slide #3</p>
</div>
</div>
<div class="post">
<div class="post__menu">
<nav class="post__nav">
<a>post__slide #1</a>
<a>post__slide #2</a>
<a>post__slide #3</a>
</nav>
</div>
<div class="post__slide">
<p>post__slide #1</p>
</div>
<div class="post__slide">
<p>post__slide #2</p>
</div>
<div class="post__slide">
<p>post__slide #3</p>
</div>
</div>
&#13;
答案 1 :(得分:0)
如果您只是想寻找快速解决方案并且没有计划添加更多幻灯片,您可以在showSlide函数中添加另一个选项,然后快速检查这些类。
我认为你因为CSS关系而不想编辑类 - 但是在第二个滑块上添加一个额外的类不会改变它的外观。
同样,这是一种快速简便的方法 - 有更复杂的方法来实现这一点,并且可以更好地遵循DRY原则。
为了解释,第二个滑块上的新类允许我检查它所在的滑块(hasClass),然后根据父级&#39;分配(2)或(&#39;&#39;)。上课。在showSlide函数中,我使用数字变量来构建选择器 - 所以如果它是2,那么它将以新类为目标 - 否则它不会添加任何内容。
$(function() {
$('.post a').on('click', function(e) {
e.preventDefault()
if ($(this).parent().hasClass('post__nav2')) {
var number = '2'
showSlide($(this).index(), number)
} else {
var number = ''
showSlide($(this).index(), number);
}
});
showSlide(0);
function showSlide(index, number) {
// Make the post__slide post__slide--visible
$('.post' + number + ' ' + '.post__slide' + number).removeClass('post__slide--visible');
$('.post' + number + ' ' + '.post__slide' + number).eq(index).addClass('post__slide--visible');
// Set the tab to post__nav--selected
$('.post' + number + ' ' + 'a').removeClass('post__nav--selected');
$('.post' + number + ' ' + 'a').eq(index).addClass('post__nav--selected');
}
});
&#13;
.post {
position: relative;
}
.post .post__nav {
display: flex;
border: 2px solid;
flex-wrap: wrap;
align-items: stretch;
width: 100px;
}
.post .post__nav a {
padding: 20px 0px;
text-align: center;
width: 100%;
cursor: pointer;
}
.post .post__nav a:hover,
.post .post__nav a.post__nav--selected {
color: #737d8b;
font-weight: 700;
}
.post .post__slide {
position: absolute;
top: 0px;
left: 100px;
width: 0px;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
opacity: 0;
transition: opacity 0.1s linear 0s;
}
.post .post__slide.post__slide--visible {
width: calc(100% - 100px);
overflow: scroll;
opacity: 1;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="post">
<div class="post__menu">
<nav class="post__nav">
<a>post__slide #1</a>
<a>post__slide #2</a>
<a>post__slide #3</a>
</nav>
</div>
<div class="post__slide">
<p>post__slide #1</p>
</div>
<div class="post__slide">
<p>post__slide #2</p>
</div>
<div class="post__slide">
<p>post__slide #3</p>
</div>
</div>
<div class="post post2">
<div class="post__menu post__menu2">
<nav class="post__nav post__nav2">
<a>post__slide #1</a>
<a>post__slide #2</a>
<a>post__slide #3</a>
</nav>
</div>
<div class="post__slide post__slide2">
<p>post__slide #1</p>
</div>
<div class="post__slide post__slide2">
<p>post__slide #2</p>
</div>
<div class="post__slide post__slide2">
<p>post__slide #3</p>
</div>
</div>
&#13;