javascript - 一个输入的多个标签上的复选框动画
问题描述
label
选择for时,如何.select-label
发射它的CSS动画?label
.pick-select
我希望第二个标签也能对输入label
的input
变化做出反应,.pick-select
label
并为.select-label
label
.
$(document).ready(function() {
$(".select-all").on("click", function() {
$(this).is(":checked") ?
$(".select-input")
.prop("checked", true)
.change() :
$(".select-input")
.prop("checked", false)
.change();
});
$("input[name='select-check']:checkbox").change(function() {
if ($(this).is(":checked")) {
if ($("input[name='select-check']:checkbox:not(:checked)").length == 0) {
$(".select-all").prop("checked", true);
}
$(this)
.closest(".shrink")
.addClass("active");
} else {
$(".select-all").prop("checked", false);
$(this)
.closest(".shrink")
.removeClass("active");
}
});
});
.pick-select {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 999;
}
.shrink {
height: 50px;
width: 50px;
border: 3px solid;
position: relative;
-webkit-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-o-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
.shrink.active {
-webkit-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-o-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-webkit-transform: scale(0.8);
-ms-transform: scale(0.8);
transform: scale(0.8);
border: 2px solid red;
}
.select-label {
display: inline-block;
cursor: pointer;
position: relative;
}
.select-label span {
display: inline-block;
position: relative;
background-color: transparent;
width: 15px;
height: 15px;
transform-origin: center;
border: 2px solid silver;
border-radius: 50%;
vertical-align: -6px;
margin-right: 10px;
transition: background-color 150ms,
transform 350ms cubic-bezier(0.78, -1.22, 0.17, 1.89);
}
input[name="select-check"] {
display: none;
}
input[name="select-check"]:checked + label span {
background-color: blue;
border-color: blue;
transform: scale(1.25);
}
input[name="select-check"]:checked + label span:after {
width: 10px;
background: #fff;
transition: width 150ms ease 100ms;
}
input[name="select-check"]:checked + label span:before {
width: 5px;
background: #fff;
transition: width 150ms ease 100ms;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="selectall-btn">
<input type="checkbox" id="selectall" class="select-all" name="select-check" />
<label class="select-label" for="selectall"><span></span>Select All
</label>
</div>
<div class="post-list">
<div class="item">
<div class="selectall-btn">
<label class="select-label" for="post-select1"><span></span>
</label>
</div>
<div class="shrink">
<div class="select-block">
<label class="pick-select hidden">
<input id="post-select1" type="checkbox" class="select-input" name="select-check">
</label> 1
</div>
</div>
</div>
<div class="item">
<div class="selectall-btn">
<label class="select-label" for="post-select2"><span></span>
</label>
</div>
<div class="shrink">
<div class="select-block">
<label class="pick-select hidden">
<input id="post-select2" type="checkbox" class="select-input" name="select-check">
</label> 2
</div>
</div>
</div>
</div>
解决方案
在我的方法中,当 acheckbox.select-input
是时checked
,最近的.selectall-btn
被激活(active
添加到它的class
)。请参阅.selectall-btn.active label > span
CSS 中的。
$(document).ready(function() {
$(".select-all").on("click", function() {
$(this).is(":checked") ?
$(".select-input")
.prop("checked", true)
.change() :
$(".select-input")
.prop("checked", false)
.change();
});
$("input[name='select-check']:checkbox").change(function() {
if ($(this).is(":checked")) {
// This didn't work; hence I added `:not(.select-all)` to the selector. The
// `.is()` check should be kept there.
if (! $(this).is('.select-all') &&
$("input[name='select-check']:checkbox:not(:checked):not(.select-all)").length == 0) {
$(".select-all").prop("checked", true);
}
$(this)
.closest(".shrink")
.addClass("active")
// This does what you wanted. (see the CSS code)
.prev('.selectall-btn').addClass('active');
} else {
if (! $(this).is('.select-all')) {
$(".select-all").prop("checked", false);
}
$(this)
.closest(".shrink")
.removeClass("active")
// This does what you wanted. (see the CSS code)
.prev('.selectall-btn').removeClass('active');
}
});
});
.pick-select {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 999;
}
.shrink {
height: 50px;
width: 50px;
border: 3px solid;
position: relative;
-webkit-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-o-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
.shrink.active {
-webkit-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-o-transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
transition: all 600ms cubic-bezier(0.19, 1, 0.22, 1);
-webkit-transform: scale(0.8);
-ms-transform: scale(0.8);
transform: scale(0.8);
border: 2px solid red;
}
.select-label {
display: inline-block;
cursor: pointer;
position: relative;
}
.select-label span {
display: inline-block;
position: relative;
background-color: transparent;
width: 15px;
height: 15px;
transform-origin: center;
border: 2px solid silver;
border-radius: 50%;
vertical-align: -6px;
margin-right: 10px;
transition: background-color 150ms,
transform 350ms cubic-bezier(0.78, -1.22, 0.17, 1.89);
}
input[name="select-check"] {
display: none;
}
input[name="select-check"]:checked + label span,
.selectall-btn.active label > span {
background-color: blue;
border-color: blue;
transform: scale(1.25);
}
input[name="select-check"]:checked + label span:after,
.selectall-btn.active label > span:after {
width: 10px;
background: #fff;
transition: width 150ms ease 100ms;
}
input[name="select-check"]:checked + label span:before,
.selectall-btn.active label > span:before {
width: 5px;
background: #fff;
transition: width 150ms ease 100ms;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="selectall-btn">
<input type="checkbox" id="selectall" class="select-all" name="select-check" />
<label class="select-label" for="selectall"><span></span>Select All
</label>
</div>
<div class="post-list">
<div class="item">
<div class="selectall-btn">
<label class="select-label" for="post-select1"><span></span>
</label>
</div>
<div class="shrink">
<div class="select-block">
<label class="pick-select hidden">
<input id="post-select1" type="checkbox" class="select-input" name="select-check">
</label> 1
</div>
</div>
</div>
<div class="item">
<div class="selectall-btn">
<label class="select-label" for="post-select2"><span></span>
</label>
</div>
<div class="shrink">
<div class="select-block">
<label class="pick-select hidden">
<input id="post-select2" type="checkbox" class="select-input" name="select-check">
</label> 2
</div>
</div>
</div>
</div>
推荐阅读
- machine-learning - 关于统计和机器学习的问题
- mysql - 选择 MYSQL 中其他表中不存在的值
- active-directory - 使用 AD 组成员信息从 ADFS 请求令牌
- javascript - Angular 组件:扩展类的实例似乎被覆盖了
- c# - 双击 datagridview 中的项目会出现“索引超出范围错误”
- javascript - 使用 React Native 在标签栏中显示图标
- excel - 在文本列表中查找下一个数字
- google-cloud-dataflow - 如何在 Google Dataflow 作业中使用 ImpersonatedCredentials?
- swift - 如何在 MapKit 中进行长按事件
- c# - 成员“身高”无法识别或无法访问