关于inline-block问题
来源:互联网 发布:基德2011总决赛数据 编辑:程序博客网 时间:2024/06/05 12:22
前言
在重新学习css,做自己的学习demo时,设置一堆div在一行显示,呈现对比。
结果如图,设置了display:inline-block之后,出现了部分下沉现象。
改为float之后,又恢复正常对齐。
不过,很快就得到了解决。于是,就写了这篇关于inline-block问题的文章,包含了以前分享过的间距问题,在这里与大家分享。
一、下沉问题
原因
1. 行内元素有一个基线,所有在这一行中的元素都以这条基线为准对齐。
如文字:
而行内块元素,如图片等,会以底部为准对齐:
2. 文本在容器中默认是上对齐的,且不能设置其他垂直对齐方式
要设置垂直居中之类的,只能用p标签或者其他标签包含之后,设置这些标签的对齐方式
3. 文本是老大,它不迁就别人,只有容器靠下来迁就它。
这是个很奇怪的现象,行内块元素的基线原本是底部,在有文本之后,该元素的基线就变成了文本的基线,为了与其他元素对齐,才导致下沉。
解决方案
1. 设置vertical-align
元素的默认vertical-align为baseline,也就是基线。把它的值设置为其他值,就能实现其他方式的对齐,如top、bottom、text-bottom、text-top、middle等,同高度下,效果相同。
display: inline-block;verticla-align: top;
CSS vertical-align 属性
2. 使用float
等其他方法替换inline-block
当然,在这里说到用其他方法还有很多,已经与inline-block
无关了,所以也不多说。
二、间距问题
原因
行内块元素或者设置成inline-block的元素之间,会自动存在间距。
这种表现是符合规范的应该有的表现。但是,在某些情况却会对我们的布局造成影响。
解决方法
1. 使用margin负值
.space a { display: inline-block; margin-right: -3px;}
margin负值的大小与上下文的字体和文字大小相关,其中,间距对应大小值可以参见“基于display:inline-block的列表布局”一文part 6的统计表格:
例如,对于12像素大小的上下文,Arial字体的margin
负值为-3
像素,Tahoma和Verdana就是-4
像素,而Geneva为-6
像素。
由于外部环境的不确定性,以及最后一个元素多出的父margin值等问题,这个方法不适合大规模使用。
2. 使用font-size:0
类似下面的代码:
.space { font-size: 0;}.space a { font-size: 12px;}
这个方法,基本上可以解决大部分浏览器下inline-block元素之间的间距(IE7等浏览器有时候会有1像素的间距)。不过有个浏览器,就是Chrome, 其默认有最小字体大小限制,因为,考虑到兼容性,我们还需要添加:类似下面的代码:
.space { font-size: 0; -webkit-text-size-adjust:none;}
点击这里查看示例:font-size:0清除换行符间隙demo
补充:目前Chrome浏览器已经取消了最小字体限制。因此,上面的-webkit-text-size-adjust:none;代码估计时日不多了。
3. 使用letter-spacing
类似下面的代码:
.space { letter-spacing: -3px;}.space a { letter-spacing: 0;}
该方法可以搞定基本上所有浏览器,不过Opera浏览器下有蛋疼的问题:最小间距1像素,然后,letter-spacing
再小就还原了。
4. 使用word-spacing
类似下面代码:
.space { word-spacing: -6px;}.space a { word-spacing: 0;}
一个是字符间距letter-spacing
,一个是单词间距word-spacing
,大同小异。据我测试,word-spacing
的负值只要大到一定程度,其兼容性上的差异就可以被忽略。因为,貌似,word-spacing即使负值很大,也不会发生重叠。
点击这里查看示例:word-spacing与元素间距去除demo
您使用Chrome浏览器,可能看到的是间距依旧存在。确实是有该问题,原因我是不清楚,不过我知道,可以添加display: table;
或display:inline-table;
让Chrome浏览器也变得乖巧。
.space { display: inline-table; word-spacing: -6px;}
5. 其他成品方法
下面展示的是YUI 3 CSS Grids 使用letter-spacing
和word-spacing
去除格栅单元见间隔方法(注意,其针对的是block水平的元素,因此对IE8-浏览器做了hack处理):
.yui3-g { letter-spacing: -0.31em;/* webkit */ *letter-spacing: normal; /* IE < 8 重置 */ word-spacing: -0.43em; /* IE < 8 && gecko */}.yui3-u { display: inline-block; zoom: 1; *display: inline; /* IE < 8: 伪造 inline-block */ letter-spacing: normal; word-spacing: normal; vertical-align: top;}
以下是一个名叫RayM的人提供的方法:
li { display:inline-block; background: orange; padding:10px; word-spacing:0;}ul { width:100%; display:table; /* 调教webkit*/ word-spacing:-1em;}.nav li { *display:inline;}
也就是上面一系列CSS方法的组组合合。
感谢
去除inline-block元素间间距的N种方法
inline-block之后意外发现块下沉
- 关于inline-block问题
- 关于display inline-block的对齐问题
- 关于display:inline-block问题总结
- 关于 display: inline 、block 、inline-block
- 关于 display: inline 、block 、inline-block (一)
- 关于 display: inline 、block 、inline-block (二)
- 关于 display: inline 、block 、inline-block
- 关于inline-block
- 关于display:inline-block
- 关于 inline-block 兼容问题
- 关于 display:inline-block
- 关于display:inline-block
- inline-block问题
- inline-block间隙问题
- inline-block问题
- inline-block间距问题
- 关于inline-block元素的行高问题
- 关于display: inline-block 默认空白间距的问题
- hexo + next主题高级配置
- Sublime Text 使用插件介绍
- gulp 自动化构建工具
- JS-SDK之分享功能整理(Java)
- CSS渐变的简单使用
- 关于inline-block问题
- samba 添加一个用户
- 史上最漂亮-Mac支持NTFS工具-NTFSX
- Transform 引起的 z-index "失效"
- 层叠上下文和层叠顺序
- 关于Flex布局
- Android 基础知识复习(一)
- 给不了解前端的同学讲前端
- CSS实现元素的居中显示