复选框(checkbox)和单选框(radio)与文字居中对齐

本文探讨了在前端开发中复选框(checkbox)和单选框(radio)与文字居中对齐的问题。通过分析浏览器渲染差异,发现vertical-align:middle并非完美解决方案。经过实验,作者发现通过设置font-family为Tahoma等特定字体,结合调整元素样式,可以实现多选框和提示文字的对齐,同时也适用于其他表单元素。
部署运行你感兴趣的模型镜像

最近的项目涉及到很多表单的制作,特别是复选框(checkbox)和单选框(radio)。但是在前端开发过程中发现,单(复)选框和它们后面的 提示文字在不进行任何设置的情况下,是无法对齐的,而且在Firefox和IE中相差甚大。即使设置了vertical-align:middle,也依 然不能完美对齐。如下图所示:

liuhanyu-1

于是上网查看了一些网站,发现这个问题是普遍存在的,如下图(FF3.5):

error

在很多网站涉及到表单的页面中,都存在这种表单元素与提示文字无法对齐的问题。于是打算研究一下这个问题。首先,搜索到了蓝色上wheatlee前辈的文章《大家都对vertical-align的各说各话》。wheatlee在他的文章中关于垂直居中提到了这样几个关键点:

1、vertical-align:middle的时候,是该元素的中心对齐周围元素的中心。

2、这里“中心”的定义是:图片当然就是height的一半的位置,而文字应该是基于baseline往上移动0.5ex,亦即小写字母“x”的正中心。但是很多浏览器往往把ex这个单位定义为0.5em,以至于其实不一定是x的正中心

(baseline等名词如果不懂,请先阅读wheatlee的文章)

按照这个思路,对照我遇到的问题,首先想到的是先验证一下浏览器对于“复选框”和图片是不是使用同样的规则来渲染(是不是把复选框当成一个正方形图片来对待)。于是写出下面的代码:
<style>
body{font-size:12px;}
</style><input style=”vertical-align:middle;” name=”test” type=”checkbox”>
<img style=”vertical-align:middle;” src=”testpic.gif” />
测试文字

代码中的testpic.gif是一个尺寸与复选框完全一样的黑色图片。FF3.5下显示如下:

02

事实证明,FF3.5对于复选框和图片的垂直对齐方式是采用同样的规则进行渲染的,即将复选框当作一个正方形的图片(IE不是)。按照wheatlee“middle的时候,是该元素的中心对齐周围元素的 中心”的观点,如果我在复选框后面输入英文字符,那么复选框的中心将与英文中小写字母x的中心对齐。经测试,FF3.5下面基本上是这样的(在一些字号的 时候会有一定的误差,比如,如果字体高度是偶数,那么这个中心点有时在一半偏上1px,有时在一半偏下1px)。如图:

03

但是这对于中文来说,并不是一个好的结果。因为中文是方块字,并且相同字号的情况下,高度会比小写的x高出很多。所以,按照浏览器内置的方式,只用 vertical-align:middle是无论如何也无法对齐中文的(无论是只写中文,中文在前,英文在前,FF3.5都是按照小写x中心那种方法来 对齐的。)。但是回头再看看wheatlee的文章,他说这个小写x中心对齐的渲染方式,是对于“文字”来说的。那么,如果不是文字呢…?如果复选框后面 跟的是一个行内元素,如label,而文字是写在它内部的,会是什么样呢?浏览器会不会将这个内联元素整体看作一个“块”,然后依照类似图片的规则进行渲 染呢?如果那样,我们就达到目的了。

但是经过测试,很遗憾,事实并不是这样,加上label后跟没加没有任何区别。FF3.5/IE6/IE7均是如此。在FF3.5中用firebug看一下,证明浏览器并没有按照label的高度值来去对齐中心点。如图:

04

如果按照之前的设想,红蓝两线应该是重合的。但现在的情况是,它们相差了1px。并且这1px是没有规律的,随着字号的放大,并不恒定,貌似轻易也无法提炼出对应关系来。于是想到,再试一下将label也加上vertical-align:middle。结果如图:

05

在FF3.5和IE7下面已经很接近于我们希望的状态了,只差1px。IE6下… 无语了。

经过以上折腾,我得出了跟wheatlee相同的结论,就是,各种浏览器之间对这个问题的处理貌似没有任何规律。并且,似乎每一种浏览器对于 vertical-align:middle的渲染都不是完全遵从W3C所说的“Align the vertical midpoint of the box with the baseline of the parent box plus half the x-height of the parent.”

但是经过仔细总结和分析,发现好像最终对齐的结果跟label的高度当前字体中小写x的中心点都有关系,两者同时影响着渲染结果。那么,既然现在的情况以及非常接近于希望的状态了,是否可以通过设置字体的方式来改变小写x的中心点的位置,接入对垂直对齐结果进行“微调”呢?

最终,在不断的测试中发现,如果将font-family中的第一个字体设置为Tahoma,则可以完美的实现对齐(Verdana等字体也可以)。而且在FF3.5/IE6/IE7/IE8和Chrome中均显示正常。最终代码如下:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<title>测试vertical-align</title>
<style>
label{vertical-align:middle}
.inputcheckbox{vertical-align:middle;}
body{font-family:tahoma;font-size:12px;}
</style>
</head>
<body>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>测试文字x</label>
</html>

最终效果:

06

至此,多选框(checkbox)和提示文字对齐的问题已经解决,那么其他表单元素呢?试验了一下单选框(radio),发现,还是有问题。文字提 示依然 是偏上。用firebug看了一下,发现radio元素默认有5px的左边距和3px的上、右边距,却没有下边距。如图:

08

于是,尝试去掉radio的外边距,刷新后显示正常。(其实多选框也是有外边距的,只是它的外边距四个方向都有,并且相等,所以对于垂直对齐没有影 响。) 下图是一些常用表单元素的最终显示效果以及最终代码,大家可以用不同浏览器看一下实际的效果(注:由于演示使用的12px的中文实际只有11px高,而 IE下文本框等元素的高度是22px,一个是奇数,一个是偶数,所以这些部分在IE中是无论如何也对不齐的,差1px。如果手动控制文本框高度为奇数,或 者将文字设置成为偶数的高度,则显示正常):

09
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<title>测试vertical-align</title>
<style>
*{margin:0;}
label{vertical-align:middle}
.inputcheckbox{vertical-align:middle;}
body{font-family:tahoma;font-size:12px;}
</style>
</head>
<body>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>测试文字x</label>
<br/><br/>
<input class=”inputcheckbox” name=”test2″ value=”2″ type=”radio”>
<label>测试文字x</label>
<br/><br/>
<input class=”inputcheckbox” name=”Text1″ type=”text” />
<label>文字</label>
<input class=”inputcheckbox” name=”Text1″ type=”text” />
<label>文字</label>
<br/><br/>
<label>测试文字</label>
<input class=”inputcheckbox” name=”Button1″ type=”button” value=”按钮” />
<br/><br/>
<select class=”inputcheckbox” name=”Select1″>
<option>测试文字</option>
</select>
<label>测试文字</label>
</html>

而且我发现,不但解决了中文的问题,如果提示信息换成其他语言,基本上也能够对齐,至少不会像开始那样偏移太多。下面是截图、代码和一些例子:

07
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<title>测试vertical-align</title>
<style>
label{vertical-align:middle}
.inputcheckbox{vertical-align:middle;}
body{font-family:tahoma;font-size:12px;}
</style>
</head>
<body>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>测试文字x</label>
<br/>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>這是繁體中文</label>
<br/>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>次回から自動的にログイン</label>
<br/>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>English</label>
<br/>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>Чужой компьютер</label>
<br/>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>????? ?? ‏???????? </label>
<br/>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>????</label>
<br/>
<input class=”inputcheckbox” name=”test” value=”1″ type=”checkbox”>
<label>?????</label>
<br/>
</html>

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 创建包含多种输入类型的表单布局 为了实现一个包含姓名、手机号输入框、性别单选框、爱好多选框、留言文本框以及确认提交按钮的表单布局,可以按照以下方式编写 HTML CSS。 #### HTML 结构 HTML 提供了 `<form>` 标签用于构建表单,并通过不同的 `input` 类型来定义各种功能的输入控件。以下是完整的 HTML 示例: ```html <form id="contactForm"> <div class="form-group"> <label for="name">姓名:</label> <input type="text" id="name" name="name" required /> </div> <div class="form-group"> <label for="phone">手机号:</label> <input type="tel" id="phone" name="phone" pattern="[0-9]{11}" required /> </div> <div class="form-group"> <label>性别:</label> <label><input type="radio" name="gender" value="male" /> 男</label> <label><input type="radio" name="gender" value="female" /> 女</label> </div> <div class="form-group"> <label>爱好:</label> <label><input type="checkbox" name="hobby" value="reading" /> 阅读</label> <label><input type="checkbox" name="hobby" value="sports" /> 运动</label> <label><input type="checkbox" name="hobby" value="music" /> 音乐</label> </div> <div class="form-group"> <label for="message">留言:</label> <textarea id="message" name="message" rows="4"></textarea> </div> <div class="form-group"> <button type="submit">确认提交</button> </div> </form> ``` 上述代码中包含了多个常见的表单元素[^4],例如 `type="text"` 的单行文本输入框、`type="tel"` 的电话号码输入框、`type="radio"` 的单选按钮组、`type="checkbox"` 的多选框组、`<textarea>` 多行文本区域以及提交按钮。 #### CSS 样式 为了让表单更加美观并满足布局需求,可以通过 CSS 定义样式规则如下: ```css /* 表单整体容器 */ #contactForm { width: 50%; margin: auto; padding: 20px; border: 1px solid #ccc; background-color: #f8f8f8; } /* 单个表单项分组 */ .form-group { margin-bottom: 15px; } /* label 对齐设置 */ label { display: block; font-weight: bold; margin-bottom: 5px; } /* 输入框通用样式 */ input[type="text"], input[type="tel"], textarea { width: 100%; padding: 8px; box-sizing: border-box; } /* 单选按钮复选框排列 */ input[type="radio"], input[type="checkbox"] { margin-right: 5px; } /* 提交按钮样式 */ button { padding: 10px 15px; background-color: #007bff; color: white; border: none; cursor: pointer; } button:hover { background-color: #0056b3; } ``` 以上 CSS 设置了一个居中的固定宽度表单容器[^1],并通过 `.form-group` 控制各表单项之间的间距。同时为不同类型的输入框设置了统一的外观风格,使界面更整洁一致。 #### 功能扩展(可选) 如果需要动态控制某些字段的行为,比如禁用或隐藏特定输入框,则可以借助 jQuery 实现[^2]。例如,当用户未填写必填项时阻止表单提交: ```javascript $(document).ready(function () { $('#contactForm').on('submit', function (e) { const name = $('#name').val(); if (!name.trim()) { alert('请输入您的姓名'); e.preventDefault(); // 阻止默认行为 } }); }); ``` 此脚本会在表单提交前验证用户的姓名是否为空。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值