踩坑_vertical-align

这篇具有很好参考价值的文章主要介绍了踩坑_vertical-align。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题:

今天在做一个需求时遇到了如下问题:

  • 代码

    <style>
      *{
        margin:0;
        padding:0;
      }
      #app{
        width: 300px;
        height: 117px;
        background: #FFFFFF;
        border-radius: 6px;
        border: 1px solid #EAEAEA;
        margin-right: 15px;
        box-sizing: border-box;
        margin: auto;
      }
      del{
        font-size: 9px;
        line-height: 12px;
      }
    </style>
    
    <div id="app">
     <del>原价为19.9</del>
    </div>
    
  • 渲染
    踩坑_vertical-align,css,css,javascript,css3
    父元素(div)没有设置padding,那么子元素(del)上方的间距是哪里来的呢?

    这一切都和vertical-align属性有关~

vertical-align属性

vertical-align属性用于指定行内元素行内块元素以及表格单元格(table-cell)的垂直对齐方式。该属性对于块元素是不起作用的!
踩坑_vertical-align,css,css,javascript,css3
以上是基于一行文本的顶线、中线、基线、底线。

语法
vertical-align: baseline; // 默认值

vertical-align属性的属性值有很多,在此不一一赘述,只讲解几个常用属性值。

  • baseline:(默认值) 基线对齐
  • top: 顶线对齐
  • middle: 中线对齐
  • bottom:底线对齐

上述的对齐方式是相对于父元素而言的,比如设置vertical-align: baseline是当前元素与父元素的基线对齐。

父元素的基线怎么找呢?
  • 最初:父元素在最开始会有一个不可见的、零宽度的透明节点。它继承了父元素的font-family、font-size、line-height属性。

    • 若是父元素没有设置font-size,多数浏览器的默认字体大小均为16px
    • 若是父元素没有设置line-height,默认值是normal(大小为字体的1-1.2倍)
    • 下图的色块模拟的就是透明节点(当前父元素的基线就是就是这个色块中文本x的基线位置)
      踩坑_vertical-align,css,css,javascript,css3
    • 这也就解释了最初列出来的问题。
      踩坑_vertical-align,css,css,javascript,css3
      父元素(div)没有设置字体和行高;而子元素(del)设置的字体颜色为9px( 在pc端浏览器渲染为12px)。

      父元素内默认的透明色块就如上图的“x色块”,默认为字体和行高为16px\1-1.2,父元素的基线就是“x色块”的基线。

      del为行内元素,默认情况下vertical-align属性值为baseline即del的基线与父元素的基线对齐,因此就出现了del元素上面多了一块距离。

  • 基线位置偏移:当有元素的基线位置大于当前“x色块”的基线位置时,父元素的基线就以最大基线位置为准。
    踩坑_vertical-align,css,css,javascript,css3
    “原价为19.9”文本的基线小于默认基线("x色块"的基线),因此父元素的基线为“x”色块的基线➡️图1;“我是啦啦啦…”文本的基线大于默认基线("x色块"的基线),因此父元素的基线为“我是啦啦啦…”文本的基线➡️图2。

特殊元素的基线
  • 若是一个行内/行内块元素内没有文本\内联元素\overflow不是visible,则基线为margin的下边缘位置

    <style>
     *{
       margin:0;
       padding:0;
     }
     #app{
       width: 500px;
       height: 117px;
       background: #FFFFFF;
       border-radius: 6px;
       border: 1px solid #EAEAEA;
       margin-right: 15px;
       box-sizing: border-box;
       margin: auto;
     }
     del{
       font-size: 9px;
       line-height: 12px;
     }
     i{
       display: inline-block;
       width: 100px;
       height: 30px;
       margin-bottom: 20px;
     }
     span,del,i{
       background-color: #ccc;
     }
     
    </style>
    
    <div id="app">
      <del>原价为19.9</del>
      <span>x</span>
      <i></i>
    </div>
    

    踩坑_vertical-align,css,css,javascript,css3

    第三个元素为空元素,基线为margin的下边缘位置也就是橙色区域结束的位置;

  • img元素的基线也是margin的下边缘位置
    踩坑_vertical-align,css,css,javascript,css3

行盒

行盒(ine box) 是指一行的一个虚拟的矩形框,由该行中行内元素组成。每行都会生成一个行盒

解决

以上说明了问题产生的原因,那么问题应该如何解决呢?文章来源地址https://www.toymoban.com/news/detail-602498.html

  • [1] vertical-align属性对块元素没有作用,因此可以将元素设置为块元素
  • [2] 默认基线与父元素的font-size属性值相关,可以设置父元素的font-size属性值为0,子元素若有文本可单独设置字体大小。
  • [3] 通过修改vertical-align的属性值来改变元素的排列。

到了这里,关于踩坑_vertical-align的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包