美文网首页
CSS之 有趣记录

CSS之 有趣记录

作者: June_Done | 来源:发表于2020-12-29 18:13 被阅读0次

    断断续续的在看《css世界》这本书,途中会发现很多自己平时没太注意就有趣的点,故记录。(笔记来自:《CSS世界》张鑫旭 著 人民邮电出版社)

    术语

    • 未定义行为
      Web 标准也是不可能面面俱到的,会存在规范描述以外的场景,各大浏览器厂家只能根据自己的理解与喜好去实现,同时个性化就会出现差异,此时遇到的表现差异并不是浏览器的 bug,用计算机领域的专业术语描述应该是“未定义行为”(undefined behavior)。
      例如:CSS 世界中有很多伪类,其中一个比较常用的就是:active,在 IE8 及以上版本的浏览器行为表现非常统一,支持非焦点元素①,鼠标按下,执行:active 伪类对应的 CSS 样式,鼠标抬起还原。
      而在Firefox 浏览器的UI没有任何变化,和其他浏览器表现形式不一样,这是浏览器的bug吗?当然不是,而是因为规范上并没有对这种场景的具体描述,所以 Firefox 为:active 发生在mousedown 事件之后,也没啥毛病。
      像一些范顾及不到的细枝末节的实现,就称为 “未定义行为”
    image.png

    块级元素

    • 为什么 list-item 元素会出现项目符号?
      之所以 list-item 元素会出现项目符号是因为生成了一个附加的盒子,学名“标记盒子”(marker box),专门用来放圆点、数字这些项目符号。IE浏览器下伪元素不支持 list-item 或许就是无法创建这个“标记盒子”导致的
    • 特殊的inline-block
      其实每个元素都是有两个盒子,即外在盒子和内在盒子
      外在盒子负责元素是可以一行显示,还是只能换行显示;内在盒子负责宽高、内容呈现什么的。但是呢,造物主又想了想,叫“内在盒子”虽然容易理解,但是未免有些俗气,难登大雅之堂,于是,又想了一个更专业的名称,叫作“容器盒子”
      于是,按照 display 的属性值不同,值为 block 的元素的盒子实际由外在的“块级盒子”和内在的“块级容器盒子”组成,值为 inline-block 的元素则由外在的“内联盒子”和内在的“块级容器盒子”组成,值为 inline 的元素内外均是“内联盒子”。
      现在,大家应该明白为何display属性值是inline-block的元素既能和图文一行显示,又能直接设置 width/height 了吧!因为有两个盒子,外面的盒子是 inline 级别,里面的盒子是 block 级别。

    width/height 繁枝细节

    • width:auto
      在 CSS 世界中,盒子分“内在盒子”和“外在盒子”,显示也分“内部显示”“外部显示”,同样地,尺寸也分“内部尺寸”和“外部尺寸”。其中“内部尺寸”英文写作“Intrinsic Sizing”,表示尺寸由内部元素决定;还有一类叫作“外部尺寸”,英文写作“Extrinsic Sizing”,宽度由外部元素决定。
      所谓流动性,并不是看上去的宽度 100%显示这么简单,而是一种 margin/border/padding和 content 内容区域自动分配水平空间的机制。
    • “包裹性”对实际开发有什么作用呢?
      请看这个需求:页面某个模块的文字内容是动态的,可能是几个字,也可能是一句话。然后,希望文字少的时候居中显示,文字超过一行的时候居左显示。该如何实现?
      如下:
    .box {
      padding: 10px;
      background-color: #cd0000;
      text-align: center;
    }
    .content {
      display: inline-block;
      text-align: left;
    }
    
    <div class="box">
      <p id="conMore" class="content">文字内容</p>
    </div>
    
    • 首选最小宽度
      所谓“首选最小宽度”,指的是元素最适合的最小宽度。
      • 东亚文字(如中文)最小宽度为每个汉字的宽度。
      • 西方文字最小宽度由特定的连续的英文字符单元决定。并不是所有的英文字符都会组成连续单元,一般会终止于空格(普通空格)、短横线、问号以及其他非英文字符等。
      tips:如果想让英文字符和中文一样,每一个字符都用最小宽度单元,可以试试 CSS 中的 word-break:break-all。

    “首选最小宽度”实际开发中的作用

    • 如何使用一层 HTML 标签分别实现图 3-13 所示的“凹”和“凸”效果(注意要兼容 IE8)?
      由于要兼容 IE8,CSS 新世界中图形构建利器的盒阴影和背景渐变全都没有用武之地,怎
      么办呢?我们可以利用“首选最小宽度”的行为特点把需要的图形勾勒出来。核心 CSS 代码如
      下(以“凹”效果示意):
    .ao,
    .tu {
      display: inline-block;
      width: 0;
      font-size: 14px;
      line-height: 18px;
      margin: 35px;
      color: #fff;
    }
    .ao:before,
    .tu:before {
      outline: 2px solid #cd0000;
      font-family: Consolas, Monaco, monospace;
    }
    .ao:before {
      content: "love你love";
    }
    .tu {
      direction: rtl;
    }
    .tu:before {
      content: "我love你";
    }
    
    <span class="ao"></span>
    <span class="tu"></span>
    
    image.png
    • max-width
      经常会有图片,这些图片都是用户上传产生的,因此尺寸会有大有小,为了避免图片在移动端展示过大影响体验,常常会有下面的 max-width 限制:
    img { 
     max-width: 100%; 
     height: auto!important; 
    }
    

    height:auto是必需的,否则,如果原始图片有设定 height,max-width 生效的时候,图片就会被水平压缩。强制 height 为 auto 可以确保宽度不超出的同时使图片保持原来的比例。但这样也会有体验上的问题,那就是在加载时图片占据高度会从 0 变成计算高度,图文会有明显的瀑布式下落。

    • 超越最大
      超越最大指的是min-width覆盖max-width,此规则发生在min-width和max-width冲突的时候。例如,下面这种设置:
    .container { 
     min-width: 1400px; 
     max-width: 1200px; 
     } 
    

    最小宽度居然比最大宽度设置得还大,此时,两者必定是你死我活的状态。究竟谁死呢?遵循“超越最大”规则(注意不是“后来居上”规则),min-width 活下来,max-width 被忽略,于是,.container 元素表现为至少 1400 像素宽。

    • 任意高度元素的展开收起动画技术
      收起展开效果,为了使效果没那么生硬,除了jQuery 的 slideUp()/ slideDown()方法,然后就是CSS 实现动画,我们的第一反应就是使用 height + overflow:hidden 实现。
    • 但是,很多时候,我们展开的元素内容是动态的,换句话说高度是不固定的,因此,height 使用的值是默认的 auto,应该都知道的 auto 是个关键字值,并非数值,正如 height:100%的 100%无法和 auto 相计算一样,从 0px 到 auto 也是无法计算的,因此无法形成过渡或动画效果。
    .element { 
     max-height: 0; 
     overflow: hidden; 
     transition: max-height .25s; 
    } 
    .element.active { 
     max-height: 666px; /* 一个足够大的最大高度值 */ 
    }
    

    其中展开后的 max-height 值,我们只需要设定为保证比展开内容高度大的值就可以,因为max-height 值比 height 计算值大的时候,元素的高度就是 height 属性的计算高度,在本交互中,也就是 height:auto 时候的高度值。于是,一个高度不定的任意元素的展开动画效果就实现了。且max-height 使用足够安全的最小值,收起的延迟才不会那么长。

    • 内联空白节点
      “内联空白节点”是内联盒模型中非常重要的一个概念,具体指的是:在HTML5 文档声明中,内联元素的所有解析和渲染表现就如同每个行框盒子的前面有一个“空白节点”一样。这个“空白节点”永远透明,不占据任何宽度,看不见也无法通过脚本获取,就好像幽灵一样,但又确确实实地存在,表现如同文本节点一样,因此,我称之为“幽灵空白节点”。
    div{
         background: #ccc;
    }
    span{
        display: inline-block;
    }
    <div><span></span></div>
    
    image.png

    相关文章

      网友评论

          本文标题:CSS之 有趣记录

          本文链接:https://www.haomeiwen.com/subject/sauvzhtx.html