专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  GPU:DeepSeek ... ·  13 小时前  
码农翻身  ·  漫画 | 为什么大家都愿意进入外企? ·  昨天  
程序员的那些事  ·  OpenAI ... ·  2 天前  
程序员的那些事  ·  印度把 DeepSeek ... ·  3 天前  
程序猿  ·  “我真的受够了Ubuntu!” ·  4 天前  
51好读  ›  专栏  ›  SegmentFault思否

我脑中飘来飘去的 CSS 魔幻属性

SegmentFault思否  · 公众号  · 程序员  · 2017-12-26 08:00

正文

最近看到一篇20个CSS高级技巧汇总的汇总,感触很深,不过我想,与技巧相比,有些常见css布局难题,有时候更加让我们的日常开发变得踌躇沮丧吧。

在写这一篇文章之前,自己还写过一篇: 我所不注意的那些CSS冷知识,但却阻止了我做项目的速度 ,如果你看了,我相信你也会受益的。

为什么此处li标签内的p元素看起来独自撑开了一行

这是我在segmentfault上看到的一个问题,以前自己遇到过,所以就很热情洋溢的去回答了一下,难道遇到个自己会的,示例代码是这样的:

  1.    li{

  2.        display: inline-block;

  3.        text-align: center;

  4.    }

  5.    .left,.center,.right{

  6.        width:300px;

  7.        height:300px;

  8.    }

  9.    .left{

  10.        background-color: #999;

  11.    }

  12.    .center{

  13.        background-color: #ccc;

  14.    }

  15.    .right{

  16.        background-color: #eee;

  17.    }  

  18.    HTML:

  19.    

    •        

    • class="left">
    •            

      "display: inline-block;">1

       

    •        

    •        

    • class="center">
    •        

    • class="right">
    •      

    大概就是这样子,其实文和图有点不对应,代码中第一个模块他只写了一个“1”,我为了现象更加明显,且好说明为什么,就打了一大段文字,现在我们来说说为什么。先来一张图,看懂vertical-align的几个属性,顺便带上图片出处,文章讲得还可以,理解这张图片,后面就好理解了。

    inline-block的vertical-align 属性默认是baseline对齐(深入理解的送福利),也就是英文文字小写字母a,b,c这类字母底部的那条线,因为这些是外国人发明的,所以以英文字母才有针对性。

    inline-block拥有vertical-align属性,其默认是基线对齐的,所以这三个inline-box需要基线对齐,而其基准线就是正常流中最后一个line box的基线,如果这个元素是空的,没有内容,那么这个基线就是最后这个元素的margin-bottom线;如果这个元素不为空,那么这个元素的基线就是元素里面内容最后一行文字的基线;所以我们一个一个来套,发现这三个li元素在一行,第一个有文字,其基线为文字底部;最后一个没有文字, 其基线为margin-bottom线,考试要考,划重点,可以自己为元素设置margin-bottom试试 ,这就会造成第一个和二,三个错行的感觉,其实他两是为了基线对齐,所以多敲几十个文字就能明显看出其差别。

    所以最简单的解决方案就是为li添加vertical-align: 属性不为baseline,气不气,改变其纵向的对齐方式的默认属性;为啥非弄个折腾人勒。关于vertical-align,如果还想做这方面的深入了解,可以看看张大侠的分析

    img图片撑不满整个div,有空隙

    直接上图更直观(箭头所指):

    相关css和html:

    1.    

    2.        body,div{margin: 0;padding: 0;}

    3.        .test{

    4.            background-color: yellowgreen;

    5.        }

    6.        img{

    7.            width:260px;

    8.            height:260px;

    9.        }

    10.    

    11.    

    12.    

      class= "test">
    13.         width="130" height="130" src="http://img2.jintiankansha.me/get3?src=http://user-gold-cdn.xitu.io/2017/12/10/160409cc0f090c6f">

    14.    

  20. 其实这个问题,如果你单单这样看,和我一样涉世未深的话,是一眼看不出答案的,但是如果你在图片后面多敲两个文字,你就会发现,和上个问题,这又是一个有关于vertical-align属性相关的问题。

    1.    

      class="test">
    2.         width="130" height="130" src="http://img2.jintiankansha.me/get3?src=http://user-gold-cdn.xitu.io/2017/12/10/160409cc0f090c6f">abcd看文字

    3.    

    4.  

    让人恍然大悟的效果图:

    这下你应该就懂了,下面的空隙的距离实际上等与1个line-height的底边与baseline之间的间距。仔细观察,图片的底边是和a的下边缘是在一条水平线上的,而不是和‘看’字下边缘一条水平线上的。所以为什么上面说这又是一个和vertical-align属性相关的问题。先说解决方案。

    针对于父元素div

    • 设置行高足够小,比如.test{line-height:0},至于这么小吗,其实高度小于top线和baseline线之间的距离的距离就行了,至于到底多小,这和font-size是相关的,其目的就是没有多余的高度拿来给baseline下面的空间用(个人理解);

    • 上面说了设置line-height最小和font-size相关,所以,还有的方法,就是直接设置字体大小为0,.test{font-size:0;},道理你应该懂;

    针对于图片div

    • 上面说了这是一个和vertical-align属性相关的问题,所以设置vertical-align属性不为baseline也可以解决,比如img{vertical-align:top;},当然也可以是数字,比如img{vertical-align:-10px;},这个数值绝对不是正值,其数值应该是大于bottom线和line-height的底边距离的;

    • 最后一种,就是vertical-align是一个对块状元素无效的属性,仅针对于内联元素有效的,当然inline-block也有效.所以img{display:block;}也可以解决问题。

    也许到这里,你和我一样,有疑惑,为什么vertical-align是一个对块状元素无效的属性,设置img为块级元素,其和div就可以完美在一起,而一个内联元素放在块状元素里,就非得有隔阂。

    开始,我也是有这个疑问的,个人理解就是块状元素里面装了一个内联元素,如果块状没有显示的设置高度,其高度是由里面的最高的lineboxes组成的,这个div其实就是有两个lineboxes组成,图片linebox和 ,其实还有一个linebox就是div自身的innerText(''),这不过这里内容为空,如果你把span去掉,你就更能理解这个隐身的linebox,所以就像是两个内联元素在一起,需要baseline对齐。

    所以网上有人说设置img{font-size:0;},是非常错误的,img元素很特殊,他不但是内联元素,他还是一个置换元素(下面会讲),它的高度不是文字内容撑开的,是其置换的图片高度撑开的,所以设置font-size是无效的。

    浮动不按想要的方式浮

    像上图那样的形式,盒子由导航栏和右侧一个搜索框或者登录名什么的一起组成,这也是我们常用浮动的方式来解决这样的布局。
    说浮动前,先说三点概念:

    1. 浮动最初出现的意义是为了解决文字环绕图片这种在杂志报纸中常会出现的布局样式; (看下图)

    2. 浮动与绝对定位能实现相同的效果,但的区别是,浮动未脱离正常文档流,但绝对定位脱离了正常文档流;

    3. 浮动能带来灵活的布局,但同时也带来了父元素高度塌陷的缺点(看下图),所以清除浮动是使用浮动前的必修课,后面会说到;

    现在看一下高度塌陷相关的代码:

    1.        

      class="test">
    2.         width="130" height="130" src="http://img2.jintiankansha.me/get3?src=http://user-gold-cdn.xitu.io/2017/12/10/160409cc0f090c6f">

    3.        1.浮动最初出现的意义是为了解决文字环绕图片这种在杂志报纸中常会出现的布局样式;

    4.        2.浮动与绝对定位能实现相同的效果,但的区别是,浮动未脱离正常文档流,但绝对定位脱离了正常文档流;

    5.        3.浮动能带来灵活的布局,但同时也带来了父元素高度塌陷的缺点,所以清除浮动是使用浮动前的必修课,后面会说到;

    6.        

    7.        

    8.        

      class="blank">

    9.        

    10.        

      class="box">
    11.             class= "dot">

    12.            我是下面一个div的文字。

    13.        

    14.            

      class="blank">

    15.        

      class="box">
    16.             class="dot">

    17.            我是再下面一个div的文字。。

    18.        

    19.              width="260" value="输入一段文字"/>

    20.        

    21.        .test {

    22.        background-color: yellowgreen;

    23.        font-size: 18px;

    24.        vertical-align: top;

    25.        }

    26.        .test span {

    27.            background-color: bisque;

    28.        }

    29.        .blank {

    30.            line-height: 20px;

    31.            height: 20px;

    32.        }

    33.        img {

    34.            width: 260px;

    35.            height: 260px;

    36.            float: left;

    37.        }

    38.        input {

    39.            border: 1px solid red;







    请到「今天看啥」查看全文