Better

Ethan的博客,欢迎访问交流

label for check input did't work in iOS browser

在项目中,由于原生的input自带样式使用丑陋,因此一般会将input结合label使用,设置input不可见,通过点击label的方式触发input,但有个奇怪的现象,在ios浏览器上,针对checkbox类型的input并没有点击效果。在这里记录下解决办法。

背景

有如下代码:

<label class="checkbox">
    <input type="checkbox">
    <span class="name>名称</span>
</label>

有如下一段css美化input

.checkbox {
    display: inline-block;
    font-size: 24px;
    margin-right: 10px;
    margin-bottom: 20px;
    position: relative;
    font-weight: normal;

    .name {
        display: block;
        width: 190px;
        line-height: 60px;
        text-align: center;
        border-radius: 30px;
        cursor: pointer;
        background-color: #F4F4F4;
        color: #333;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    input[type='checkbox'] {
        position: absolute;
        opacity: 0;

        &:checked+.name {
            background-color: #E72714;
            color: #fff;
        }
    }
}

以上代码在android上运行一切正常,奇怪的bug再一次出现在ios上,为什么会这样,我印象中,我以前也有这么玩的情形,怎么就没出现这样的问题呢。赶紧翻以前的代码,差别竟然只是radio和checkbox的区别,之前是美化radio类型,怀着不敢相信的态度,将这里也改成radio类型,在此点击竟然有效了,因此这里郑重声明:这个问题仅针对checkbox类型

尝试办法

既然使用label包含input的方式无法触发,那就试试label的for属性吧,将input移到和label兄弟级别,同时设置一个id值,通过for属性关联指定input,基本代码如下

<label for="id"><label>
<input type="checkbox" id="id">

再次尝试问题解决了,但是有两个地方十分不满意,第一就是我要设置多余的id,第二我的场景是一个循环列表,难道我要制造那么多的id?果断不能忍啊!

终极办法

搬出stackoverflow神器哇,这么奇怪的问题,肯定不只有我碰到啊,输入标题,果然有。

采纳人数最高的是给label元素添加一个空click事件,但这对我而言无效。

第二个办法就是给span.name元素添加pointer-events: none;,啊哈哈,牛逼牛逼,完美解决!



留言