【问题标题】:Form autocomplete breaks CSS hover表单自动完成中断 CSS 悬停
【发布时间】:2019-11-23 00:08:33
【问题描述】:

好的,我有一个桌面网站的下拉表单。 用户将光标悬停在链接上,表单会显示在下方,他们可以填写。

这是通过 CSS 完成的

.subscribe-popup .subscribe-form {
  opacity: 0;
  visibility: hidden;
}

.subscribe-popup:hover .subscribe-form,
.subscribe-popup:active .subscribe-form {
  visibility: visible;
  opacity: .95;
}

这是(为简洁起见编辑)标记

<div class="subscribe-popup desktop-only">
    <span class="subscribe-cta">join our mailing list</span>
    <div class="subscribe-form">
        <div id="mc_embed_signup">
            <form  id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate="">
                <div id="mc_embed_signup_scroll">
                    <div class="mc-field-group">
                                <label for="mce-EMAIL">Email Address:  <span class="asterisk">*</span></label>
                                <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL">
                    </div>

                    <!-- etc. -->

                    <div class="clear"><input type="submit" class="button" value="Subscribe" name="subscribe" id="mc-embedded-subscribe"></div>
                </div>
            </form>
        </div>
    </div>
</div>

问题在于,当我单击表单中的任何文本输入时,Chrome 会生成一个带有自动完成建议的下拉菜单。只要我将鼠标悬停在任何建议上,悬停就会在表单上消失,并且表单会消失。

为什么会这样,我该如何阻止这种情况发生?

【问题讨论】:

    标签: html css forms css-selectors hover


    【解决方案1】:

    <form>
      <input type="text" autocomplete="off">
      <input type="submit" value="submit">
    </form>

    您可以通过执行以下操作来停止浏览器自动完成。

    <input type="text" autocomplete="off">
    

    autocomplete="off" 属性放在输入字段中。希望它能解决你的问题。

    【讨论】:

    • 谢谢。我试过了,它似乎没有用(自动完成由于某种原因仍然出现),此外我更愿意找到一个保持自动完成的解决方案,这是一个有用的功能,但是如果我找不到更好的解决方案,我会考虑这个.
    • @Rolf 再次检查所有拼写和语法是否正确。我在答案中添加了一个示例。你可以试试。
    • 我一次又一次地尝试。我猜这是 Chrome 的问题:stackoverflow.com/questions/12374442/…
    • 非常感谢您的时间和精力帮助我,顺便说一句!
    • 可能是。但是我以与此处所说的相同的方式解决了这个问题。 :(
    【解决方案2】:

    需要有关您的标记的更多信息,但如果您想保留自动完成功能,也许您可​​以通过在表单本身添加 :hover 来解决它,自动完成建议是某种影子 DOM输入,例如它将包含在表单/输入本身中,所以这样的事情可能会有所帮助:

    .subscribe-popup .subscribe-form {
      opacity: 0;
      visibility: hidden;
    }
    
    .subscribe-popup:hover .subscribe-form,
    .subscribe-popup:active .subscribe-form,
    .subscribe-form:hover { /* this is new */
      visibility: visible;
      opacity: .95;
    }
    

    编辑:提供标记后,我可以稍微摆弄一下,似乎防止闪烁的唯一方法是将表单上的:hover 替换为:focus-within,这似乎有效,但没有IE(两者都没有心爱的旧的也不是 Edge)确实支持它,所以如果你需要对这些的支持,你可能需要 JS,然后你可以处理与 JS 的整个交互!或者您可以尝试类似polyfill:focus-within (或者您不希望IE 用户成为订阅者?=D)

    .subscribe-popup .subscribe-form {
      opacity: 0;
      visibility: hidden;
    }
    
    .subscribe-popup:hover .subscribe-form,
    .subscribe-popup:active .subscribe-form,
    .subscribe-form:focus-within {
      visibility: visible;
      opacity: .95;
    }
    <div class="subscribe-popup desktop-only">
        <span class="subscribe-cta">join our mailing list</span>
        <div class="subscribe-form">
            <div id="mc_embed_signup">
                <form  id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate="">
                    <div id="mc_embed_signup_scroll">
                        <div class="mc-field-group">
                                    <label for="mce-EMAIL">Email Address:  <span class="asterisk">*</span></label>
                                    <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL">
                        </div>
    
                        <!-- etc. -->
    
                        <div class="clear"><input type="submit" class="button" value="Subscribe" name="subscribe" id="mc-embedded-subscribe"></div>
                    </div>
                </form>
            </div>
        </div>
    </div>

    一个可能的CSS-only替代方案可能是让不支持:focus-within的浏览器用户点击订阅链接而不是仅仅悬停它(如果什么都不做,这可能是他们无论如何都会做的事情发生,当然只是一个假设)。需要支持 通用同级组合器-选择器,该选择器广泛用于 supported(IE7+,其他所有人):

    .form-toggle {
        /* just make it invisible but not inaccessible */
        border: 0;
        clip: rect(1px, 1px, 1px, 1px);
        height: 1px;
        outline: none;
        overflow: hidden;
        padding: 0;
        position: absolute;
        width: 1px;
    }
    
    .subscribe-popup .subscribe-form {
        opacity: 0;
        visibility: hidden;
    }
    
    .subscribe-popup:hover .subscribe-form,
    .subscribe-popup:active .subscribe-form,
    .form-toggle:checked ~ .subscribe-form,
    .subscribe-form:focus-within {
        visibility: visible;
        opacity: .95;
    }
    <div class="subscribe-popup desktop-only">
        <input class="form-toggle" type="checkbox" id="form-toggle" />
        <label class="subscribe-cta" for="form-toggle">join our mailing list</label>
        <div class="subscribe-form">
            <div id="mc_embed_signup">
                <form  id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate="">
                    <div id="mc_embed_signup_scroll">
                        <div class="mc-field-group">
                                    <label for="mce-EMAIL">Email Address:  <span class="asterisk">*</span></label>
                                    <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL">
                        </div>
    
                        <!-- etc. -->
    
                        <div class="clear"><input type="submit" class="button" value="Subscribe" name="subscribe" id="mc-embedded-subscribe"></div>
                    </div>
                </form>
            </div>
        </div>
    </div>

    【讨论】:

    • 谢谢,我试试看。我将更新我的问题以包含一些标记。
    • 好吧,我将显示/隐藏功能移至表单元素本身,包括您的建议,奇怪的是,现在,只要我将鼠标悬停在建议上 - 而不是表单消失,建议会消失,并且表格闪烁。所以它更实用,但仍然有些破损。奇怪的。考虑到您所写的内容,这是有道理的 - 自动完成建议的悬停事件会传播到表单,但不会进一步。
    • 我认为正在发生的事情是,当我将鼠标悬停在建议上时,悬停在父级 (.subscribe-popup) 上结束并在表单上开始。表单闪烁,建议下拉菜单在转换中丢失。
    • @Rolf 查看上面的更新答案,添加了一个与:focus-within一起使用的sn-p
    • @Rolf 添加了第三个示例,它仅是 CSS,适用于所有支持“兄弟”选择器的浏览器,这是大多数...
    猜你喜欢
    • 2015-06-09
    • 2019-05-06
    • 2013-06-30
    • 2014-06-26
    • 1970-01-01
    • 2014-07-28
    • 2013-03-24
    • 2022-08-04
    • 2011-07-22
    相关资源
    最近更新 更多