覆盖HTML5表单验证/必填弹窗的CSS

59

如何覆盖HTML5表单中必填字段的默认弹出提示?

示例:http://jsfiddle.net/uKZGp/ (确保点击提交按钮以查看弹出提示)

HTML代码:

<form>
<input type="text" name="name" id="name" placeholder="Name*" required="required" />
<input type="submit" />
</form>

注意:您必须使用像Google Chrome或FireFox这样的HTML5浏览器查看此内容。

这个链接并没有解决我的问题,但它可能会让某些人打破常规思维:


1
可能是重复的问题:如何为HTML5表单验证消息设置样式? - James A. Rosen
6个回答

36

只用HTML/CSS是无法改变验证样式的。

这是浏览器的一部分。我找到的唯一可以更改的属性是使用以下示例更改错误消息:

 document.getElementById("name").setCustomValidity("Lorum Ipsum");

但是,正如这个例子所示:http://jsfiddle.net/trixta/qTV3g/,你可以通过使用jQuery来覆盖面板样式。这不是一个插件,它是一个核心功能,使用了一个叫做Webshims的DOM库,当然还有一些CSS来为弹出窗口设置样式。
我在这个bug post标题为Improve form validation error panel UI的帖子中找到了这个非常有用的例子。
我认为这是你能找到的最好的解决方案,也是覆盖基本(丑陋)错误面板的唯一方法。

我在我的问题中添加了另一个链接,可能有帮助(也可能没有)。不过是个好建议,谢谢。 - Phill Pafford

24

我不确定为什么,但是 ::-webkit-validation-bubble-message { display: none; } 对我不起作用。我能够通过阻止无效事件的默认行为来获得所需结果(在FF 19、Chrome版本29.0.1547.76 m中进行了测试),这不会冒泡。

  document.addEventListener('invalid', (function(){
      return function(e){
          //prevent the browser from showing default error bubble/ hint
          e.preventDefault();
          // optionally fire off some custom validation handler
          // myvalidationfunction();
      };
  })(), true);

2
我点赞了这个回答,因为对于在2014年左右寻找解决方案的任何人来说,这是我发现的唯一有效的方法。额外的赞赏是为了无效事件监听器的创造性使用。非常感谢你花时间发布你的解决方案,它帮助了我很多! - KryptoniteDove
1
你可以在这里删除不必要的IIFE :) - ngryman
它在Chrome、Chromium和其他基于Blink的浏览器中不工作,因为Google在2013年7月的Chrome 28中删除了 ::-webkit-validation-bubble,并且此功能自那时以来尚未恢复。截至2020年初,WebKit和苹果Safari仍支持该功能。 - Dai
很棒的解决方案!大多数表单都有自己的验证样式。这真的很有帮助。它甚至允许事件传播,这是我本能地认为不可能的。 - sayandcode

13

对于 Webkit,您可以使用 ::-webkit-validation-bubble-message。例如,要隐藏它:

::-webkit-validation-bubble-message { display: none; }

还有其他选项:

::-webkit-validation-bubble-arrow-clipper{}
::-webkit-validation-bubble-arrow{}
::-webkit-validation-bubble{}
::-webkit-validation-bubble-top-outer-arrow{}
::-webkit-validation-bubble-top-inner-arrow{}
::-webkit-validation-bubble-message{}

更新: Chrome不再允许样式化表单验证气泡:https://code.google.com/p/chromium/issues/detail?id=259050

对于Firefox,您可以尝试使用:-moz-placeholder {}


4

当前默认的电子邮件验证是我见过的谷歌设计中最丑陋的之一!

Chrome HTML5 email type form validation

然而,它似乎包含在一个标准的 div 中,因此您可以对其进行一些更改,如果您记得重置这些值。

我发现您可以像以下这样更改背景、字体大小和颜色、边框和阴影:

div {
    background: rgba(0,0,0,0.8);
    color: #333;
    font-size: 11px;
    border: 0;
    box-shadow: none;
}

如果您在html标签内覆盖这些div,那么最终只有验证受到影响。
html div {
    background: rgba(0,0,0,1);
    color: #000;
    font-size: 12px;
}

不幸的是,您可能想要更改的一些关键属性,如marginfont-weight,无法进行修改。

NB. 目前该技术仅适用于Chrome(12),不适用于Firefox 4、Opera 11或Safari(Win 7)。


3

将类添加到输入类型,并在那里显示消息。希望在进行少量自定义后有所帮助。工作代码示例:

document.querySelector('#frm').addEventListener('submit', e => {
  e.preventDefault();
  e.currentTarget.classList.add('submitted');
});
body {
  font-family: Helvetica, sans-serif;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  overflow: hidden;
  width: 100%;
  height: 100vh;
  background: #ffa500;
}
form > div {
  position: relative;
  margin-bottom: 10px;
}
.theTooltip {
  -webkit-backface-visibility: hidden;
          backface-visibility: hidden;
  will-change: opacity, visibility;
  max-width: 250px;
  border-radius: 5px;
  background-color: rgba(0,0,0,0.7);
  padding: 15px;
  color: #fff;
  box-sizing: border-box;
  display: inline-block;
  position: absolute;
  -webkit-transform-style: preserve-3d;
          transform-style: preserve-3d;
  -webkit-transform: translate(15%, -50%);
          transform: translate(15%, -50%);
  top: 50%;
  left: auto;
  right: auto;
  bottom: auto;
  visibility: hidden;
  margin: 0;
  opacity: 0;
  -webkit-transition: opacity 0.3s ease-out;
  transition: opacity 0.3s ease-out;
  z-index: 100;
}
.theTooltip:after {
  content: '';
  position: absolute;
  width: 0;
  height: 0;
  top: 50%;
  margin-top: -10px;
  left: -10px;
  border-top: 10px solid transparent;
  border-bottom: 10px solid transparent;
  border-right: 10px solid rgba(0,0,0,0.7);
}
label {
  display: inline-block;
  vertical-align: center;
}
input {
  background: #fff;
  border: 1px solid transparent;
  cursor: pointer;
  display: inline-block;
  overflow: visible;
  margin: 0;
  outline: 0;
  vertical-align: center;
  text-decoration: none;
  width: auto;
  border-radius: 3px;
  cursor: text;
  padding: 7px;
}
input:focus,
input:active {
  outline: none;
}
.submitted input:invalid {
  border: 1px solid #f00;
}
.submitted input:invalid ~ .theTooltip {
  visibility: visible;
  opacity: 1;
}
.submitted input:valid ~ .theTooltip {
  -webkit-transition: opacity 0.3s, visibility 0s 0.3s;
  transition: opacity 0.3s, visibility 0s 0.3s;
}
<form id="frm" action="action">
  <div>
    <label>Email</label>
    <input type="email" required="required"/><span class="theTooltip">Invalid email</span>
  </div>
  <div>
    <button formnovalidate="formnovalidate">OK</button>
  </div>
</form>


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接