我希望有一个标准复选框的替代方案 - 基本上我想使用图像,当用户点击图像时,将其淡出并覆盖一个勾选框。
从本质上讲,我想做一些类似于Recaptcha 2的功能,当它让你点击符合特定标准的图像时。您可以see a Recaptcha demo here但有时可能会让您解决文本问题,而不是图像选择。所以这是一个截图:
当您单击其中一个图像(在这种情况下,包含牛排图片)时,您单击的图像会缩小并显示蓝色勾号,表示您已勾选它。
假设我想重现这个确切的例子。
我意识到我可以有9个隐藏的复选框,并附加一些jQuery,这样当我点击图像时,它会选择/取消选择隐藏的复选框。但是如何缩小图像/覆盖滴答声呢?
答案 0 :(得分:284)
这很容易实现,无需预先制定的解决方案。此外,它会教你很多,因为你似乎不太容易使用CSS。
您的复选框需要具有不同的id
属性。这样,您就可以使用标签<label>
- 属性将for
连接到它。
示例:
<input type="checkbox" id="myCheckbox1" />
<label for="myCheckbox1"><img src="http://someurl" /></label>
将标签附加到复选框将触发浏览器行为:每当有人点击标签(或其中的图像)时,都会切换复选框。
接下来,您可以通过向其申请display: none;
来隐藏该复选框。
现在剩下要做的就是为label::before
伪元素设置你想要的样式(它将用作可视复选框替换元素):
label::before {
background-image: url(../path/to/unchecked.png);
}
在最后一个棘手的步骤中,您在选中复选框时使用CSS“:checked
伪选择器来更改图像:
:checked + label::before {
background-image: url(../path/to/checked.png);
}
+
(相邻的兄弟选择器)确保您只更改标记中直接跟随隐藏复选框的标签。
您可以通过将两个图像放在一个精灵地图中并仅在background-position
中应用更改而不是交换图像来优化它。
当然,您需要正确定位标签并应用display: block;
并设置正确的width
和height
。
我在这些说明之后创建的codepen示例和代码段使用相同的技术,但不是使用图像作为复选框,复选框替换完全使用CSS ,创建一个{{标签上的1}},一旦选中,就有::before
。添加一些圆形边框和甜蜜过渡,结果非常可爱!
这是一个工作的codepen,展示了该技术,并且不需要复选框的图像:
以下是代码段中的相同代码:
content: "✓";
ul {
list-style-type: none;
}
li {
display: inline-block;
}
input[type="checkbox"][id^="cb"] {
display: none;
}
label {
border: 1px solid #fff;
padding: 10px;
display: block;
position: relative;
margin: 10px;
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
label::before {
background-color: white;
color: white;
content: " ";
display: block;
border-radius: 50%;
border: 1px solid grey;
position: absolute;
top: -5px;
left: -5px;
width: 25px;
height: 25px;
text-align: center;
line-height: 28px;
transition-duration: 0.4s;
transform: scale(0);
}
label img {
height: 100px;
width: 100px;
transition-duration: 0.2s;
transform-origin: 50% 50%;
}
:checked+label {
border-color: #ddd;
}
:checked+label::before {
content: "✓";
background-color: grey;
transform: scale(1);
}
:checked+label img {
transform: scale(0.9);
box-shadow: 0 0 5px #333;
z-index: -1;
}
答案 1 :(得分:28)
有三个整洁的设备被调用:
:checked
选择器::before
伪选择器content
属性。
label:before {
content: url("https://cdn1.iconfinder.com/data/icons/windows8_icons_iconpharm/26/unchecked_checkbox.png");
position: absolute;
z-index: 100;
}
:checked+label:before {
content: url("https://cdn1.iconfinder.com/data/icons/windows8_icons_iconpharm/26/checked_checkbox.png");
}
input[type=checkbox] {
display: none;
}
/*pure cosmetics:*/
img {
width: 150px;
height: 150px;
}
label {
margin: 10px;
}
&#13;
<input type="checkbox" id="myCheckbox1" />
<label for="myCheckbox1">
<img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR0LkgDZRDTgnDrzhnXGDFRSItAzGCBEWEnkLMdnA_zkIH5Zg6oag">
</label>
<input type="checkbox" id="myCheckbox2" />
<label for="myCheckbox2">
<img src="https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRhJjGB3mQxjhI5lfS9SwXou06-2qT_0MjNAr0atu75trXIaR2d">
</label>
<input type="checkbox" id="myCheckbox3" />
<label for="myCheckbox3">
<img src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQuwWbUXC-lgzQHp-j1iw56PIgl_2eALrEENUP-ld72gq3s8cVo">
</label>
&#13;
答案 2 :(得分:8)
请参阅此jQuery插件:imgCheckbox (在 npm 和 bower )
免责声明:无需javascript即可解决此问题。紧张是在代码的可维护性和效率之间。虽然不需要插件(或任何javascript),但它确实可以使构建更快,并且通常更容易更改。
非常简单的HTML (没有复选框和标签等):
result = [s [0; cumsum(diff(s))]];
您可以使用jQuery的 toggleClass 打开/关闭<img class="checkable" src="http://lorempixel.com/100/100" />
事件的selected
或checked
课程:
click
使用
获取已检查的项目$("img.checkable").click(function () {
$(this).toggleClass("checked");
});
您可以根据此设置图像样式,但一个大问题是,如果没有其他DOM元素,您甚至无法使用$(".checked")
和::before
添加复选标记之类的内容。解决方案是用另一个元素包装你的图像(将点击监听器附加到包装元素也是有意义的。)
::after
这使你的html非常干净,你的js令人难以置信的可读性。看一下片段......
$("img.checkable").wrap("<span class='fancychecks'>")
/* Note that this js actually responds
to a click event on the wrapped element!
(not the image) */
$("img.checkable").wrap("<span class='fancychecks'>")
.parent().click(function() {
$(this).toggleClass("checked");
});
/* style the images */
span.fancychecks img {
display: block;
margin: 0;
padding: 0;
transition-duration: 300ms;
transform: scale(1);
filter: none;
-webkit-filter: grayscale(0);
}
span.fancychecks.checked img {
transform: scale(0.8);
filter: gray;
filter: grayscale(1);
-webkit-filter: grayscale(1);
}
/* style the parent spans */
span.fancychecks {
padding: 0;
margin: 5px;
display: inline-block;
border: 1px solid transparent;
transition-duration: 300ms;
}
span.fancychecks.checked {
border-color: #ccc;
}
/* Using conexo's fantastic CSS, make the checkmarks */
span.fancychecks::before {
background-color: rgba(50, 200, 50, 0.7);
color: white;
content: "✓";
font-weight: bold;
border-radius: 50%;
position: absolute;
margin: 2px;
top: 1;
left: 1;
z-index: 1;
width: 25px;
height: 25px;
text-align: center;
line-height: 28px;
transform: scale(0);
transition-duration: 300ms;
}
span.fancychecks.checked::before {
transform: scale(1);
}
受上述解决方案的启发,我构建了一个插件,可以像以下一样轻松使用:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<img class="checkable" src="http://lorempixel.com/100/100/city/1" />
<img class="checkable" src="http://lorempixel.com/100/100/city/2" />
<img class="checkable" src="http://lorempixel.com/100/100/city/3" />
查看 in action (和see the source)
答案 3 :(得分:6)
我会添加一个额外的div position: relative;
和class="checked"
,其宽度/高度与图片相同,而不是包含图标的left: 0; top: 0;
中的位置。它以display: none;
开头。
现在您可以收听click
- 事件:
$( '.captcha_images' ).click( function() {
$(this + '.checked').css( 'display', 'block' );
$(this).animate( { width: '70%', height: '70%' } );
});
这样您就可以获得图标并以较小的方式调整图像大小。
注意:只是想向您展示我的想法背后的“逻辑”,这个例子可能不起作用或有一些错误。
答案 4 :(得分:2)
我注意到其他答案要么不使用foreach($user->jobs as $job) {
echo $job->pivot->current_salary;
}
(为什么不?),要么需要匹配foreach($job->users as $user) {
echo $user->pivot->current_salary;
}
和<label>
属性。这意味着如果您有冲突的ID,您的代码将无法运行,并且您必须记住每次都创建唯一的ID。
此外,如果您使用for
或id
隐藏input
,浏览器将无法关注它。
复选框及其文本(或在本例中为图像)可以包装在标签中:
display:none
visibility:hidden
答案 5 :(得分:1)
这是一个选择像复选框一样的图像的快速示例
使用Knockout.js更新了示例:
var imageModel = function() {
this.chk = ko.observableArray();
};
ko.applyBindings(new imageModel());
&#13;
input[type=checkbox] {
display:none;
}
input[type=checkbox] + label
{
display:inline-block;
width:150px;
height:150px;
background:#FBDFDA;
border:none;
}
input[type=checkbox]:checked + label
{
background:#CFCFCF;
border:none;
position:relative;
width:100px;
height:100px;
padding: 20px;
}
input[type=checkbox]:checked + label:after
{
content: '\2713';
position:absolute;
top:-10px;
right:-10px;
border-radius: 10px;
width: 25px;
height: 25px;
border-color: white;
background-color: blue;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
<input type='checkbox' name='image1' value='image1' id="image1" data-bind="checked: chk"/><label for="image1"></label><label for="image1"><img class='testbtn'/></label>
<div data-bind="html: chk"></div>
&#13;
答案 6 :(得分:0)
扩展使用WordPress&amp; GravityForms生成表单并希望自动填充复选框字段,其中包含帖子列表及其相关的精选缩略图
// Change '2' to your form ID
add_filter( 'gform_pre_render_2', 'populate_checkbox' );
add_filter( 'gform_pre_validation_2', 'populate_checkbox' );
add_filter( 'gform_pre_submission_filter_2', 'populate_checkbox' );
add_filter( 'gform_admin_pre_render_2', 'populate_checkbox' );
function populate_checkbox( $form ) {
foreach( $form['fields'] as &$field ) {
// Change '41' to your checkbox field ID
$field_id = 41;
if ( $field->id != $field_id ) {
continue;
}
// Adjust $args for your post type
$args = array(
'post_type' => 'pet',
'post_status' => 'publish',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'pet_category',
'field' => 'slug',
'terms' => 'cat'
)
)
);
$posts = get_posts( $args );
$input_id = 1;
foreach( $posts as $post ) {
$feat_image_url = wp_get_attachment_image( get_post_thumbnail_id( $post->ID ), 'thumbnail' );
$feat_image_url .= '<br />' . $post->post_title;
if ( $input_id % 10 == 0 ) {
$input_id++;
}
$choices[] = array( 'text' => $feat_image_url, 'value' => $post->post_title );
$inputs[] = array( 'label' => $post->post_title, 'id' => "{$field_id}.{$input_id}" );
$input_id++;
}
$field->choices = $choices;
$field->inputs = $inputs;
}
return $form;
}
CSS:
.gform_wrapper .gfield_checkbox li[class^="gchoice_2_41_"] {
display: inline-block;
}
.gform_wrapper .gfield_checkbox li input[type="checkbox"][id^="choice_2_41_"] {
display: none;
}
.gform_wrapper .gfield_checkbox li label[id^="label_2_41_"] {
border: 1px solid #fff;
padding: 10px;
display: block;
position: relative;
margin: 10px;
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
label[id^="label_2_41_"]:before {
font-family: "font-icons";
font-size: 32px;
color: #1abc9c;
content: " ";
display: block;
background-color: transparent;
position: absolute;
top: -5px;
left: -5px;
width: 25px;
height: 25px;
text-align: center;
line-height: 28px;
transition-duration: 0.4s;
transform: scale(0);
}
label[id^="label_2_41_"] img {
transition-duration: 0.2s;
transform-origin: 50% 50%;
}
:checked + label[id^="label_2_41_"] {
border-color: #ddd;
}
/* FontAwesome tick */
:checked + label[id^="label_2_41_"]:before {
content: "\e6c8";
background-color: transparent;
transform: scale(1);
}
:checked + label[id^="label_2_41_"] img {
transform: scale(0.9);
box-shadow: 0 0 5px #333;
z-index: 0;
}