CSS表单与数据表(下)
2.表单
表单是用户输入内容的地方。表单涉及的控件很多,而且一直很难给它们应用样式。无法控制样式的部分,可以通过自定义控件来解决。
2.1 简单的表单
2.1.1 fieldset与legend
fieldset
用于分组相关信息块,legend
表明每个fieldset的目的。
<fieldset>
<legend>Your contact details</legend>
<!-- 省略 -->
</fieldset>
2.1.2 字段名
label
元素用于给每个表单元素添加一个有意义的描述性的名字。在多数浏览器中,点击label元素也会把输入焦点定位到相关的表单元素。
label最大的作用是为使用辅助设备的人增强表单可用性。
将label
与具体表单元素相关联的方式:
1、隐式的:
<label>Email <input name="comment-email" type="email" /></label>
2、显式的:
<!-- 把label的for属性设为与相关表单控件的id属性相同的值。 -->
<label for="comment-email">Email Address:</label>
<input name="comment-email" id="comment-email" type="email" />
每个表单控件几乎都会有name和id属性。id属性是表单输入字段与label
元素间建立联系的关键,name属性则是表单正确地将数据提交给服务器的关键。
id和name值可以不一样,但为了保持一致性,让它们相同比较好。
2.1.3 输入字段与文本区
textarea
元素用于输入多行文本,通过cols和rows设置文本区默认的宽度和高度。
<textarea name="comment-text" id="comment-text" cols="20" rows="10"></textarea>
input
元素是个多面手。默认情况下,它被浏览器渲染为一个单行文本输入框,即type属性的默认值是text。
HTML5扩展了type属性。
在有屏幕键盘的设备上,改变type的值会触发软键盘布局相应改变。
2.1.4 把fieldset整合起来
修改fieldset
和legend
的默认样式:
<form id="comments_form" action="/comments/" method="post">
<div class="fieldset-wrapper">
<fieldset>
<legend>Your contact details</legend>
<p class="field field-text">
<label for="comment-author">Name:</label>
<input name="comment-author" id="comment-author" type="text" />
</p>
<!-- 省略 -->
</fieldset>
</div>
<!-- 省略 -->
<p class="field-submit">
<button id="submit" class="submit" name="submit" type="submit">Post comment</button>
</p>
</form>
/* 去掉fieldset的默认样式 */
fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
@-moz-document url-prefix() {
fieldset {
display: table-cell;
}
}
/* 给fieldset的包装元素应用样式。 */
.fieldset-wrapper {
padding: 1em;
margin-bottom: 1em;
border: 1px solid #eee;
background-color: #fff;
box-shadow: 0 0 .25em rgba(0, 0, 0, 0.25);
}
/* :root引用的是HTML元素(文本根元素) */
:root .fieldset-wrapper {
/* 不支持box-shadow的浏览器只会显示边框,这里去掉这个边框 */
border: 0;
}
legend {
/* 去掉legend的默认样式 */
padding: 0 0 .5em 0;
font-weight: bold;
color: #777;
display: table;
}
2.1.5 文本输入控件
继承字体属性,覆盖浏览器的默认值。
input,
textarea {
font: inherit;
}
默认情况下,label
是一个行内元素。文本输入框的默认宽度取决于浏览器。
.field-text {
max-width: 20em;
}
.field-text label {
cursor: pointer;
}
.field-text label,
.field-text input {
width: 100%;
box-sizing: border-box;
}
将宽度设置为百分比(width: 100%
),同时再用em
单位给它设置一个最大宽度(max-width: 20em
),可以实现可伸缩的输入字段,且不会过宽。
设置文本输入框的样式:
.field-text input,
.field-text textarea {
padding: .375em .3125em .3125em; /* 内边距 */
border: 1px solid #ccc; /* 边框 */
border-radius: .25em; /* 边框圆角 */
}
2.1.6 处理聚焦状态
设置input元素获得焦点时的样式:
.field-text :focus {
outline: 0;
box-shadow: 0 0 .5em rgba(93, 162, 248, 0.5);
border-color: #5da2f8;
}
2.1.7 留言区
很多浏览器支持让用户缩放文本区。有些浏览器允许横向和纵向缩放文本区,而有些则只允许纵向缩放。
textarea {
height: 10em;
resize: vertical; /* 指定缩放的轴向 */
}
2.1.8 单选按钮
<div class="fieldset-wrapper">
<fieldset>
<legend>Remember Me</legend>
<p class="field">
<label><input name="remember" type="radio" value="yes" />Yes</label>
</p>
<p class="field">
<label><input name="remember" type="radio" value="no" checked="checked" />No</label>
</p>
</fieldset>
</div>
input[type="radio"] {
margin-right: .75em;
}
单选按钮的input
类型是radio
,为了让用户从两个选项中选择一个,必须让两个input
元素的name
属性相同。
2.1.9 按钮
HTML支持两种创建按钮的方式:
1、将input
的type属性设置为button、reset或submit:
<input type="submit" value="Post comment" />
2、使用button
元素,可以指定相同的type属性值:
<button type="submit">Post comment</button>
button
控件如果用在表单外部,显然不能提交提交,但可以响应JavaScript的调用。
reset
类型的控件(如今用得已经不多了)用于将表单重置回其初始值。
submit类型的控件用于将表单数据发送到表单的action属性指定的URL,当然前提是这个控件必须在表单内部。对于button元素而言,其type属性的默认值是submit。
我们建议使用button
来创建按钮,因为这样就可以在button
里嵌入其他元素(如span
或图片),便于应用样式。
表单控件在不同浏览器中的默认样式不相同。
2.2 表单反馈与帮助
通过placeholder
属性为输入字段提供一个输入示例。
<input name="comment-url" id="comment-url" type="url" placeholder="http://example.com" />
占位符(placeholder)文本可以修改的样式有限,各种浏览器都为它提供了不同的伪元素。
::-webkit-input-placeholder {
font-style: italic;
}
:-ms-input-placeholder {
font-style: italic;
}
::-moz-placeholder {
font-style: italic;
}
占位符文本是为了提供输入示例,因此绝对不能把它们当成字段名来使用。
占位符会在用户输入时消失,而用户需要在任何情况下都能看到字段名。
支持HTML5的浏览器自带表单验证功能,相应地也有一批CSS伪类可用于辅助客户端验证。
只要使用较新的HTML5表单属性,浏览器就会帮你验证表单字段的值。比如,把input
的type属性设置为email后,如果输入了无效的电子邮件地址并提交表单,浏览器就会给你显示一条错误消息。
输入文本无效时的样式:
.field-text :invalid {
border-color: #e72633;
box-shadow: 0 0 .5em rgba(229, 43, 37, 0.5);
}
2.3 高级表单样式
默认情况下,多数表单元素都显示为行内块。
<form id="comments_form" action="/comments/" method="post">
<div class="fieldset-wrapper">
<fieldset>
<legend>Your contact details</legend>
<p class="field field-text">
<label for="applicant-name">Name:</label>
<input name="applicant-name" id="applicant-name" type="text" />
</p>
<p class="field field-text">
<label for="applicant-email">Email Address:</label>
<input name="applicant-email" id="applicant-email" type="email" />
</p>
<p class="field field-text">
<label for="applicant-twitter">Twitter handle:</label>
<span class="field-prefixed">
<span class="field-prefix" id="applicant-twitter-prefix" aria-label="You can omit the @">@</span>
<input aria-describedby="applicant-twitter-prefix" name="applicant-twitter" id="applicant-twitter" type="text" />
</span>
</p>
</fieldset>
</div>
<div class="fieldset-wrapper">
<fieldset>
<legend>Which languages have you mastered?</legend>
<ul class="checkboxes">
<li> <input type="checkbox" name="lang-as" id="lang-as" /> <label for="lang-as">ActionScript</label> </li>
<!-- 省略 -->
</ul>
</fieldset>
</div>
<p class="field-submit"> <button id="submit" class="submit" name="submit" type="submit">Send application</button> </p>
</form>
/* 省略 */
label {
cursor: pointer;
display: block;
}
.field {
max-width: 20em;
}
.field-text label,
.field-text input,
.field-prefixed,
.field-text textarea {
width: 100%;
max-width: 100%;
-webkit-appearance: none;
box-sizing: border-box;
}
.field-text input,
.field-text textarea {
padding: .375em .3125em .3125em;
border: 1px solid #ccc;
border-radius: .25em;
}
.checkboxes {
list-style: none;
padding: 0;
column-width: 10em; /* 让复选框组织成列。 */
}
/* 省略 */
在视口足够大的时候显示行内布局。
@media only screen and (min-width: 35em) {
.flexbox .field-text {
display: flex;
max-width: 28em;
}
.flexbox .field-text label {
/* 所有字段名的宽度都为8em,既不扩展也不收缩。 */
flex: 0 0 8em; /* flex: flex-grow flex-shrink flex-basis */
display: flex;
align-items: center;
}
}
这里input
元素的宽度设置成了width: 100%
,但flex
属性的默认值是0 1 auto
,因此它会收缩,给固定宽度的字段名腾出地方。
使用Flex实现带前缀的输入字段:
<p class="field field-text">
<label for="applicant-twitter">Twitter handle:</label>
<span class="field-prefixed">
<span class="field-prefix" id="applicant-twitter-prefix" aria-label="You can omit the @">@</span>
<input aria-describedby="applicant-twitter-prefix" name="applicant-twitter" id="applicant-twitter" type="text" />
</span>
</p>
/* 把前置文本放在一个行内块中。 */
.field-prefix {
display: inline-block;
/* 省略 */
border-radius: .25em;
}
.field-prefixed input {
max-width: 12em;
}
/* 把.field-prefix转换成一个Flexbox容器。 */
.flexbox .field-prefixed {
display: flex;
}
.flexbox .field-prefix {
display: flex;
border-right: 0;
border-radius: .25em 0 0 .25em;
align-items: center;
}
/* 给input元素重新应用max-width,让它自动填满所有剩余空间。*/
.flexbox .field-prefixed input {
max-width: 100%;
border-radius: 0 .25em .25em 0;
}
人造复选框:
:root input[type="checkbox"] + label {
/* 未选中的复选框字段名 */
background-image: url(images/checkbox-unchecked.png);
}
:root input[type="checkbox"]:checked + label {
/* 选中的复选框字段名 */
background-image: url(images/checkbox-checked.png);
}
/* 让复选框本身不可见,但仍然可以被访问和聚焦。这里我们使用一个复选框图片,作为label元素的背景。 */
:root input[type="checkbox"] {
position: absolute;
overflow: hidden;
width: 1px;
height: 1px;
clip: rect(0 0 0 0);
}
参考资料:
CSS表单与数据表(下)的更多相关文章
- CSS表单与数据表(上)
表单在现代Web应用中占据着重要地位. 表单可以很简单,也可以非常复杂,要横跨几个页面. 除了从用户哪里获得数据,Web应用还需要以容易看懂的方式展示数据.表格是展示复杂数据的最佳方式. 1.设计数据 ...
- 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- 使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- thinkPHP5.0使用form表单提交数据和删除文章,不用TP的提示页面,使用弹出提示信息
form表单提交数据和删除文章时,TP的默认信息提示页面的看起来不是很好看,想要实现弹窗提示怎么做呢? 前端:可以使用前端的一个知识--iframe,iframe元素会创建包含另外一个文档的内联框架: ...
- from表单提交数据之后,后台对象接受不到值
如果SSH框架下,前段页面通过from表单提交数据之后,在后台对象显示空值,也就是接收不到值得情况下.首先保证前段输入框有值,这个可以在提交的时候用jQuery的id或者name选择器alert弹出测 ...
- 解决iphone填写表单时,表单项获取焦点时往下拉屏,导致顶部标题栏下滑错位
$(function () { //解决iphone填写表单时,表单项获取焦点时往下拉屏,导致顶部标题栏下滑错位 var u = navigator.userAgent; var isiOS = !! ...
- form表单那点事儿(下) 进阶篇
form表单那点事儿(下) 进阶篇 上一篇主要温习了一下form表单的属性和表单元素,这一片主要讲解用JavaScript如何操作form. 目录: 表单操作 取值 赋值 重置 校验 提交 技巧 不提 ...
- 给ajax表单提交数据前面加上实体名称
有时候我们后台做了一个引用类型例如: 下面的实体以C#为例 public class Order{ public string orderId{get;set;} public OrderItem o ...
- django做form表单的数据验证
我们之前写的代码都没有对前端input框输入的数据做验证,我们今天来看下,如果做form表单的数据的验证 在views文件做验证 首先用文字描述一下流程 1.在views文件中导入forms模块 2. ...
随机推荐
- python面试题三:Python 网络编程与并发
1 简述 OSI 七层协议. OSI七层协议模型主要是: 应用层(Application):为用户的应用程序(例如电子邮件.文件传输和终端仿真)提供网络服务. 表示层(Presentation):使用 ...
- python数据处理(六)之数据清洗:标准化和脚本化
1.数据归一化和标准化 a. 归一化:对数据集进行计算,使数据都位于一个特定的范围\ b.标准化: c.删除离群值 2.数据存储 a.保存到SQLite数据库中 b.导出到简单的文件中csv 3.找到 ...
- 数据可视化之powerBI基础(十六)PowerQuery的这个小功能,让你轻松发现数据质量问题
https://zhuanlan.zhihu.com/p/64418072 源数据常常包含各种差错值,为了进行下一步的分析,我们必须先找出并更正这些差错,做这些工作几乎不会有什么快乐感可言,但却往往需 ...
- Shaderlab-10chapter-立方体纹理、玻璃效果
10.1.1天空盒子 window - Lighting - skyMaterial 创建mat,shader选自带的6 side shader 确保相机选skybox 如果某个相机需要覆盖,添加sk ...
- JavaScript 基础 学习 (二)
JavaScript 基础 学习 节点属性 每一个节点都有自己的特点 这个节点属性就记录着属于自己节点的特点 1. nodeType(以一个数字来表示这个节点类型) 语法:节点.nodeT ...
- Ethical Hacking - GAINING ACCESS(1)
Gaining Access Introduction Everything is a computer Two main approaches (1)Server Side Do not requi ...
- Python Ethical Hacking - VULNERABILITY SCANNER(8)
Implementing Code To Discover XSS in Parameters 1. Watch the URL of the XSS reflected page carefully ...
- 帮助你更好的理解Spring循环依赖
网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...
- 【C#】NET截屏网页,生成网页快照开发——IECapt、CutyCapt
软件介绍 IECapt.CutyCapt 生成网页快照 http://iecapt.sourceforge.net/ http://cutycapt.sourceforge.net/ ### 操作代码 ...
- grpc 之 word2pdf使用
做一个word转pdf的服务,采用grpc,使用libreoffice命令. 1.构建libreoffice镜像 FROM python:3.6 ENV TZ=Asia/Shanghai RUN ...