当两个设置了inline-block属性的元素并列排放时,它们的位置能够互相影响。

元素结构:

<div class="container">

<div class="container-demo1">

<span>1</span>

</div>

<div class="container-demo2">

<!-- <span>2</span> -->

</div>

<div class="container-demo3">

<span>3</span>

</div>

</div>

我们使三个div都设置为 inline-block,设置宽度使其居于一行内。如果再把 container-demo2 中的内容注释掉,我们可以看到一种十分诡异的情况,如图。

可以发现本该位于父容器顶端的demo1和demo3居然沉了下去,而没有内容的demo2还在正常位置上。这时候就会想:肯定是元素的内容造成了这种结果。那么我们现在给demo2加上内容看看效果:

可以看到三个元素都回到了我们想让它呈现的位置。那为什么inline-block元素的位置会受到其内容的影响呢?我们可以查到这样一句话:inline-block元素可以将对象呈递为内联对象,但是对象的内容作为块对象呈递。有了这样的属性,我们就可以在表现上将对象用作内敛元素但又可以对它进行宽高设置。但有一点需要注意的是对象仍然呈递为内联元素,而同一行内的内联元素默认是基于 baseline 对齐的,我们可以在1图中标记出来:

即图中的蓝色线条,具体的我们可以去查看W3C的 vertical-align 属性。好的,基于基线对齐的模式我们有了理解,但还有一个问题:为什么3个元素的方向不是相同的呢?为什么有内容的元素向下,而无内容的元素会向上呢?就此我们需要了解CSS渲染机制:对于一个inline-block元素,如果内部没有inline内联元素,或者overflow不是visible,则该元素的基线就是它margin的底边缘,否则就是元素内部最后一行内联元素的基线。

简单地就以上这种情况来说,没有内容的demo2会基于它的margin底边缘也就是它的下边缘对齐,而包含内容的demo1和demo3会基于其内部内联元素的基线对齐,所以会造成这种一上一下的情况。

解决办法:

1、暴力float,当然这是备选方案,毕竟脱离文档流后页面元素会不好控制

2、简单粗暴地给所有元素都加上内容,例如空格符

3、设置所有内联元素 vertical-align: top/middle/bottom; 属性,改变默认设置

最新文章

  1. jquery.validate.js表单验证
  2. EntityFramework Reverse POCO Generator工具
  3. jquery 删除cookie失效的解决方法
  4. 画虚线 iOS
  5. IP转换成LONG 的 问题
  6. c#中栈和堆的理解
  7. Android使用Webview加载网页
  8. 织梦dede自定义内容分页,datalist运用实例
  9. Linux看门狗脚本 1.4
  10. css3瀑布流
  11. 一次SSLPeerUnverifiedException,SSLHandshakeException问题的分析
  12. 使用Selenium进行浏览器自动化操作记录
  13. Django 2.0 学习
  14. JAVA Aes加解密详解
  15. BZOJ2794[Poi2012]Cloakroom——离线+背包
  16. HDU 5985/nowcoder 207D - Lucky Coins - [概率题]
  17. [No0000130]WPF 4.5使用标记扩展订阅事件
  18. Sql Server 生成连续时间段
  19. stark组件之过滤操作【模仿Django的admin】
  20. Hibernate 的Configuration、sessionFactory和session和transaction对象解释

热门文章

  1. pgjdbc源码分析
  2. C#去掉字符串头尾指定字符
  3. c#正则表达式应用实例
  4. 配置ssh免密码登陆
  5. 【机器学习】人工神经网络ANN
  6. 学习cordic算法所得(流水线结构、Verilog标准)
  7. Mac安装Elasticsearch时提示:No Java runtime present, requesting install.
  8. sockt套接字编程
  9. cocos2dx3.2移植android
  10. 用TensorFlow实现文本分析模型,做个聊天机器人