提问人:learningnoob123 提问时间:12/9/2022 最后编辑:learningnoob123 更新时间:12/9/2022 访问量:19
使用 OOP 切换 3+ 个元素
toggling 3+ elements using OOP
问:
请看我的 Codepen(我在起点的地方留下了一张纸条):
我已经能够以一种非常手动的方式实现我喜欢的东西。基本上,我希望徽章遵循与评论相同的行为,例如:-
已选择 Delivery-badge - 具有活动类
退货徽章和调整徽章 - 删除活动类
选择退货后,投放和调整将删除活动类别等。 (本质上是这种行为,但更干净 - https://gyazo.com/e31ffc01e0e4be0ceecc3b46fd89c7e7 )
不幸的是,我似乎无法使用 OOP 获得这种行为:/..我觉得如果可能的话,它会更干净。对不起我的菜鸟,谢谢你的看!
https://codepen.io/FarahU94/pen/VwdgLwz
`
<section class="review-block">
<ul class="badges">
<li><div class="delivery-badge badge">
<i class="fa-solid fa-truck"></i>delivery</div></li>
<li><div class="returns-badge badge">
<i class="fa-solid fa-arrow-rotate-left"></i>returns</div> </li>
<li><div class="adjustments-badge badge">
<i class="fa-solid fa-ring"></i>adjust</div>
</li>
</ul>
<ul class="reviews">
<li class="review">Review 1</li>
<li class="review delivery">Review 2 - delivery</li>
<li class="review delivery">Review 3 - delivery</li>
<li class="review returns">Review 4 - returns</li>
<li class="review adjustments">Review 5 - adjustments</li>
<li class="review returns">Review 6 - returns</li>
<li class="review adjustments">Review 7 - adjustments</li>
<li class="review adjustments">Review 8 - adjustments</li>
<li class="review">Review 9</li>
</ul>
</section>
`
`
$(".badge").each(function () {
$(this).on('click', function () {
var classList = $(this).attr("class");
const classIdentifier = classList.split('-')[0]
if ($(this).hasClass('active')) {
$(this).removeClass('active');
$(".review").each(function () {
if (!$(this).hasClass(classIdentifier)) {
$(this).fadeIn(200);
}
});
} else {
// Can only do this manually, am a little stuck and seems like a borky/old school way :(, feel free to help here and thank you !! >
if($(this).hasClass('returns-badge'))
{
$('.returns-badge').addClass('active'),
$('.delivery-badge').removeClass('active'),
$('.adjustments-badge').removeClass('active');
} else if($(this).hasClass('delivery-badge'))
{
$(this).addClass('active'),
$('.returns-badge').removeClass('active'),
$('.adjustments-badge').removeClass('active');
} else if($(this).hasClass('adjustments-badge'))
{
$(this).addClass('active'),
$('.returns-badge').removeClass('active'),
$('.delivery-badge').removeClass('active');
}
// End of bork
$(".review").each(function () {
$(this).fadeOut(200);
if ($(this).hasClass(classIdentifier)) {
$(this).fadeIn(200);
}
});
};
});
});
`
答:
0赞
Carsten Løvbo Andersen
12/9/2022
#1
您可以使用一种模式,将其与单击的对象的类相匹配。然后全部隐藏,只显示与你找到的模式相关的这些。.review
const pattern = /(\w*-badge\w*)/gi;
const result = ([...$(this).attr("class").match(pattern)] || [""])[0].replace("-badge","");
$(".reviews .review").removeClass("active")
$(".reviews .review."+result).addClass("active")
演示
$(".badge").each(function() {
$(this).on('click', function() {
var classList = $(this).attr("class");
const classIdentifier = classList.split('-')[0]
if ($(this).hasClass('active')) {
$(this).removeClass('active');
$(".review").each(function() {
if (!$(this).hasClass(classIdentifier)) {
$(this).fadeIn(200);
}
});
} else {
const pattern = /(\w*-badge\w*)/gi;
const result = ([...$(this).attr("class").match(pattern)] || [""])[0].replace("-badge","");
$(".reviews .review").removeClass("active")
$(".reviews .review."+result).addClass("active")
$(this).data('clicked', true);
$(".review").each(function() {
$(this).fadeOut(200);
if ($(this).hasClass(classIdentifier)) {
$(this).fadeIn(200);
}
});
};
});
});
body {
font-family: calibri;
padding: 2rem;
}
body .review-block {
width: 390px;
box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px;
margin: auto;
border: 1px solid linen;
text-align: center;
}
body .review-block .badges {
padding-inline-start: 0;
}
body .review-block .badges > li {
display: inline-block;
}
body .review-block .badges .active {
background-color: linen !important;
}
body .review-block .badges .delivery-badge, body .review-block .badges .returns-badge, body .review-block .badges .adjustments-badge {
cursor: pointer;
height: 50px;
width: 50px;
background-color: peachpuff;
margin: 1rem;
border-radius: 100px;
color: palevioletred;
padding: 1rem;
}
body .review-block .reviews {
background-color: linen;
display: flex;
flex-direction: column;
padding-inline-start: 0;
margin-bottom: 0;
}
body .review-block .reviews li {
list-style: none;
border-top: 1px solid linen;
padding: 1rem;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<section class="review-block">
<ul class="badges">
<li>
<div class="delivery-badge badge">
<i class="fa-solid fa-truck"></i>delivery</div>
</li>
<li>
<div class="returns-badge badge">
<i class="fa-solid fa-arrow-rotate-left"></i>returns</div>
</li>
<li>
<div class="adjustments-badge badge">
<i class="fa-solid fa-ring"></i>adjust</div>
</li>
</ul>
<ul class="reviews">
<li class="review">Review 1</li>
<li class="review delivery">Review 2 - delivery</li>
<li class="review delivery">Review 3 - delivery</li>
<li class="review returns">Review 4 - returns</li>
<li class="review adjustments">Review 5 - adjustments</li>
<li class="review returns">Review 6 - returns</li>
<li class="review adjustments">Review 7 - adjustments</li>
<li class="review adjustments">Review 8 - adjustments</li>
<li class="review">Review 9</li>
</ul>
</section>
</body>
评论