在触发器及其相关文本(同级)上切换 class
Toggle class on trigger and on its associated text (sibling)
我正在尝试创建我自己的带有复选框的多选下拉菜单。工作得很好,到目前为止,我唯一的问题是,触发复选框矩形设计的 class .checkbox-selected
仅在我单击复选框时触发,而不是在右边的文本,或者一般的 link。
如何实现,触发器也可以通过点击 link 或文本来设置?
$(document).ready(function(e) {
$(".dropdown-items .checkbox").click(function() {
$(this).toggleClass("checkbox-selected");
});
});
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
更新:(有多个下拉菜单)
$(document).ready(function() {
$('.trigger-dropdown').on('click', function() {
$('.filter-dropdown-wrapper').toggleClass('filter-dropdown-active');
return false;
});
});
$(document).click(function() {
if ($('.filter-dropdown-wrapper').hasClass('filter-dropdown-active')) {
$('.filter-dropdown-wrapper').toggleClass('filter-dropdown-active');
}
});
$('.filter-dropdown-wrapper').click(function(event) {
event.stopPropagation();
});
/* Triggers Checkbox Icon for Dropdowns */
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
.sidebar-filter-wrapper {
padding-top: 1.25rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.filter-dropdown {
position: relative;
}
.filter-label {
font-size: .875rem;
line-height: 1.375em;
border: 1px solid #E2E2E2;
border-radius: 50px;
padding: 0.5rem 1.25rem;
position: relative;
cursor: pointer;
transition: background-color ease 250ms;
}
.filter-label:hover {
background-color: rgba(226, 226, 226, 0.20);
color: #303030;
}
.filter-label img {
margin-left: .625rem;
}
.filter-dropdown-wrapper {
margin-top: .625rem;
display: none;
border-radius: 5px;
border: 1px solid #e2e2e2;
background-color: #fff;
padding: 1.25rem;
position: absolute;
top: 2.5rem, ;
left: 0;
}
.filter-dropdown-active {
display: flex;
flex-direction: column;
}
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.dropdown-items:last-child {
margin-bottom: 0;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="sidebar-filter-wrapper">
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
</div>
您只需将事件侦听器绑定到包含的锚标记和 select 处理程序中的 .checkbox
find()
:
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
工作示例:
$(document).ready(function(e) {
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
});
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
(参考你更新的问题)
触发点击处理程序:
您正在切换所有 .filter-dropdown-wrapper
的 class。相反,您应该只 select 关联的下拉菜单并切换其 class。为此,您可以使用 $(this)
作为点击触发器,使用 siblings()
方法查找相关的下拉菜单。
$(this).siblings('.filter-dropdown-wrapper')
要关闭其他活动的下拉菜单,如果关联的下拉菜单在变量中处于活动状态,您可以先保存状态。
let active_dropdown = $(this).siblings('.filter-dropdown-wrapper').hasClass('filter-dropdown-active');
然后您可以从所有包装器中删除 filter-dropdown-active
class 并将 class 添加到关联的下拉列表中(如果它未处于活动状态)。
外下拉点击:
如果您只是切换活动 class,您也会在关闭的下拉列表中切换 class。因此,您应该简单地从所有下拉列表中删除 class( 不需要 if
)。
工作示例:
我在 $(document).ready(function() {...});
中声明了所有事件侦听器,因为我没有发现为什么只有 trigger-click-listener 应该在里面。
$(document).ready(function() {
$('.trigger-dropdown').on('click', function() {
let active_dropdown = $(this).siblings('.filter-dropdown-wrapper').hasClass('filter-dropdown-active');
$('.filter-dropdown-wrapper').removeClass('filter-dropdown-active');
if (!active_dropdown) {
$(this).siblings('.filter-dropdown-wrapper').addClass('filter-dropdown-active');
}
return false;
});
$(document).click(function() {
$('.filter-dropdown-wrapper').removeClass('filter-dropdown-active');
});
$('.filter-dropdown-wrapper').click(function(event) {
event.stopPropagation();
});
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
});
.sidebar-filter-wrapper {
padding-top: 1.25rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.filter-dropdown {
position: relative;
}
.filter-label {
font-size: .875rem;
line-height: 1.375em;
border: 1px solid #E2E2E2;
border-radius: 50px;
padding: 0.5rem 1.25rem;
position: relative;
cursor: pointer;
transition: background-color ease 250ms;
}
.filter-label:hover {
background-color: rgba(226, 226, 226, 0.20);
color: #303030;
}
.filter-label img {
margin-left: .625rem;
}
.filter-dropdown-wrapper {
margin-top: .625rem;
display: none;
border-radius: 5px;
border: 1px solid #e2e2e2;
background-color: #fff;
padding: 1.25rem;
position: absolute;
top: 2.5rem, ;
left: 0;
}
.filter-dropdown-active {
display: flex;
flex-direction: column;
}
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.dropdown-items:last-child {
margin-bottom: 0;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="sidebar-filter-wrapper">
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
</div>
我正在尝试创建我自己的带有复选框的多选下拉菜单。工作得很好,到目前为止,我唯一的问题是,触发复选框矩形设计的 class .checkbox-selected
仅在我单击复选框时触发,而不是在右边的文本,或者一般的 link。
如何实现,触发器也可以通过点击 link 或文本来设置?
$(document).ready(function(e) {
$(".dropdown-items .checkbox").click(function() {
$(this).toggleClass("checkbox-selected");
});
});
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
更新:(有多个下拉菜单)
$(document).ready(function() {
$('.trigger-dropdown').on('click', function() {
$('.filter-dropdown-wrapper').toggleClass('filter-dropdown-active');
return false;
});
});
$(document).click(function() {
if ($('.filter-dropdown-wrapper').hasClass('filter-dropdown-active')) {
$('.filter-dropdown-wrapper').toggleClass('filter-dropdown-active');
}
});
$('.filter-dropdown-wrapper').click(function(event) {
event.stopPropagation();
});
/* Triggers Checkbox Icon for Dropdowns */
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
.sidebar-filter-wrapper {
padding-top: 1.25rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.filter-dropdown {
position: relative;
}
.filter-label {
font-size: .875rem;
line-height: 1.375em;
border: 1px solid #E2E2E2;
border-radius: 50px;
padding: 0.5rem 1.25rem;
position: relative;
cursor: pointer;
transition: background-color ease 250ms;
}
.filter-label:hover {
background-color: rgba(226, 226, 226, 0.20);
color: #303030;
}
.filter-label img {
margin-left: .625rem;
}
.filter-dropdown-wrapper {
margin-top: .625rem;
display: none;
border-radius: 5px;
border: 1px solid #e2e2e2;
background-color: #fff;
padding: 1.25rem;
position: absolute;
top: 2.5rem, ;
left: 0;
}
.filter-dropdown-active {
display: flex;
flex-direction: column;
}
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.dropdown-items:last-child {
margin-bottom: 0;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="sidebar-filter-wrapper">
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
</div>
您只需将事件侦听器绑定到包含的锚标记和 select 处理程序中的 .checkbox
find()
:
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
工作示例:
$(document).ready(function(e) {
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
});
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>demo</p>
</a>
(参考你更新的问题)
触发点击处理程序:
您正在切换所有 .filter-dropdown-wrapper
的 class。相反,您应该只 select 关联的下拉菜单并切换其 class。为此,您可以使用 $(this)
作为点击触发器,使用 siblings()
方法查找相关的下拉菜单。
$(this).siblings('.filter-dropdown-wrapper')
要关闭其他活动的下拉菜单,如果关联的下拉菜单在变量中处于活动状态,您可以先保存状态。
let active_dropdown = $(this).siblings('.filter-dropdown-wrapper').hasClass('filter-dropdown-active');
然后您可以从所有包装器中删除 filter-dropdown-active
class 并将 class 添加到关联的下拉列表中(如果它未处于活动状态)。
外下拉点击:
如果您只是切换活动 class,您也会在关闭的下拉列表中切换 class。因此,您应该简单地从所有下拉列表中删除 class( 不需要 if
)。
工作示例:
我在 $(document).ready(function() {...});
中声明了所有事件侦听器,因为我没有发现为什么只有 trigger-click-listener 应该在里面。
$(document).ready(function() {
$('.trigger-dropdown').on('click', function() {
let active_dropdown = $(this).siblings('.filter-dropdown-wrapper').hasClass('filter-dropdown-active');
$('.filter-dropdown-wrapper').removeClass('filter-dropdown-active');
if (!active_dropdown) {
$(this).siblings('.filter-dropdown-wrapper').addClass('filter-dropdown-active');
}
return false;
});
$(document).click(function() {
$('.filter-dropdown-wrapper').removeClass('filter-dropdown-active');
});
$('.filter-dropdown-wrapper').click(function(event) {
event.stopPropagation();
});
$(".dropdown-items").click(function() {
$(this).find('.checkbox').toggleClass("checkbox-selected");
});
});
.sidebar-filter-wrapper {
padding-top: 1.25rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.filter-dropdown {
position: relative;
}
.filter-label {
font-size: .875rem;
line-height: 1.375em;
border: 1px solid #E2E2E2;
border-radius: 50px;
padding: 0.5rem 1.25rem;
position: relative;
cursor: pointer;
transition: background-color ease 250ms;
}
.filter-label:hover {
background-color: rgba(226, 226, 226, 0.20);
color: #303030;
}
.filter-label img {
margin-left: .625rem;
}
.filter-dropdown-wrapper {
margin-top: .625rem;
display: none;
border-radius: 5px;
border: 1px solid #e2e2e2;
background-color: #fff;
padding: 1.25rem;
position: absolute;
top: 2.5rem, ;
left: 0;
}
.filter-dropdown-active {
display: flex;
flex-direction: column;
}
.dropdown-items {
font-size: .875rem;
line-height: 1.375em;
margin-bottom: 0.625rem;
display: flex;
align-items: center;
}
.dropdown-items:last-child {
margin-bottom: 0;
}
.checkbox {
width: 18px;
height: 18px;
border: 1px solid #E2E2E2;
border-radius: 5px;
margin-right: 0.625rem;
}
.checkbox-selected {
background-color: #BC9590;
width: 18px;
height: 18px;
border-color: #bc9590;
background-image: url(../img/checked.svg);
background-repeat: no-repeat;
background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="sidebar-filter-wrapper">
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
<div class="filter-pill-wrapper">
<div class="filter-dropdown">
<a class="filter-label trigger-dropdown">
Marken vor Ort
<img src="img/toggle.svg">
</a>
<div class="filter-dropdown-wrapper">
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Skinceuticals</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Babor</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Eucerin</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Hermés</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Kérastase</p>
</a>
<a href="#" class="dropdown-items">
<div class="checkbox"></div>
<p>Clinique</p>
</a>
</div>
</div>
</div>
</div>