学习line-height 和 vertial-align

本文探讨了CSS中line-height和vertical-align属性的工作原理,包括它们如何影响文本布局及解决常见显示问题的方法。

学习line-height 和 vertial-align

1 line-height

一个div元素的高度其本质上是由line-height属性决定的下面做实验。

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
  <style type="text/css">
    p:nth-child(1){
        background-color: #E31010;
        font-size: 26px;
        line-height: 10px;
        /*overflow: hidden;*/
    }
    p:nth-child(2){
        font-size: 16px;
        line-height: 26px;
        background-color: #00FF24;
    }
  </style>
</head>
<body>
<p >1111111111111111111111</p>
<p >1111111111111111111111</p>
</body>
</html>

CSS-lineheight1

我们可以看到当font-size大于line-height的时候溢出需要overflow处理验证了这一点,但是另外一方面font-size有时候也决定了line-height(例如:1em)。我们能够看到绿色的字上下都有距离,这是行距:

行距=’line-height’-‘font-size’

所以一行元素使用vertical-align能够居中因为上下行距相等所以近似使其上下居中,但是为什么是近似相等因为。vertical-align是在基线上与等分析按之间的距离基本上是X的高度所以不同的字体不一样。因此是近似居中。

2 line-height的一些细节

属性值

line-height的默认值是normal,但是不同字体以及不同浏览器的line-height的值都是不一样的。

line-height具有数值、百分比、长度值三种属性。他们在继承上有细微的差别,如果使用数值作为属性值那么所有属性值得继承都是这个值。但是如果使用其他的值则是在子元素计算之后得出的值。

line-height的大值特性

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
  <style type="text/css">
    .box{
      line-height: 96px;
      background-color: #00FF05;
    }
    .box span{
      line-height: 20px;
      background-color: #FF00BF;
    }
    .box2{
      line-height: 20px;
      background-color: #00FF05;
    }
    .box2 span{
      line-height: 96px;
      background-color: #FF00BF;
    }
  </style>
</head>
<body>
<div class="box">
  <span>内容...</span>  
</div>
<div class="box2">
  <span>内容...</span>  
</div>
</body>
</html>

我们可以看到两个外部box元素都是96,那么box2类下面的属性如何来理解呢。主要是因为无论内联元素的line-height如何进行设置,最终父级元素的高度都是由数值最大的那个line-height。上面的情况根据我的理解,每个内联元素都是会有一个空白节点在内联元素的前面,内部的span高度为96px时,那个空白节点则变为96px将其撑开。

vertial-align

内联元素默认都是沿着字母x的下边缘对齐的,对于图片等替换元素则是底部。在CSS中vertical-align的属性百分比则是基于line-height进行计算的。

注:vertial-align只能应用于内联元素以及dispaly为table-cell的元素。

图片底部的间隙

<style type="text/css">
    .box{
      width: 280px;
      outline: 1px solid #aaa;
      text-align: center;
      /*font-size: 0px;*/
    }
    .box >img{
      height: 96px;

    }
</style>
<div class="box">
  <img src="截图1.png"> 
</div>


如图所示图片的底部出现了一个缝隙,原因就在于内联元素的前面存在的空白节点,他的基线并不是底部导致会存在一个缝隙。

解决方案如下:

1、图片块状化
2、容器line-height足够小
3、容器font-size足够小
4、设置其他的vertial-align值

inline-block与vertical-align

一个inline-block元素,如果里面没有内联元素,或者overflow不是visible,则该园区的基线就是其margin底边缘;否则其基线就是元素里面的最后一行内联元素的基线。

参考

张鑫旭 CSS世界

要对 `vue-scroll-vertial-list`(推测你想说的是 `vue-scroll-vertical-list`)进行源码解析,以下是一个大致的解析思路,由于没有实际看到源码,这里基于常见的滚动列表组件的实现原理来讲解: ### 整体功能概述 `vue-scroll-vertical-list` 通常是一个用于实现垂直滚动列表的 Vue 组件,其核心功能是在有限的容器内显示大量数据,在滚动时动态加载渲染数据,以提升性能。 ### 源码结构解析 #### 组件定义 通常在一个 `.vue` 文件中定义组件,包含 `template`、`script` `style` 部分。 ```vue <template> <!-- 组件的 HTML 结构 --> <div class="scroll-vertical-list"> <!-- 列表容器 --> <div ref="listContainer" class="list-container"> <!-- 渲染列表项 --> <div v-for="(item, index) in visibleItems" :key="index" class="list-item"> {{ item }} </div> </div> </div> </template> <script> export default { name: 'VueScrollVerticalList', props: { // 传入的所有数据 data: { type: Array, default: () => [] }, // 每个列表项的高度 itemHeight: { type: Number, default: 30 }, // 可见区域显示的列表项数量 visibleCount: { type: Number, default: 10 } }, data() { return { // 当前可见的列表项 visibleItems: [], // 滚动偏移量 scrollTop: 0 }; }, mounted() { // 监听滚动事件 this.$refs.listContainer.addEventListener('scroll', this.handleScroll); // 初始化可见列表项 this.updateVisibleItems(); }, methods: { handleScroll() { // 获取滚动偏移量 this.scrollTop = this.$refs.listContainer.scrollTop; // 更新可见列表项 this.updateVisibleItems(); }, updateVisibleItems() { // 计算当前可见的起始索引 const startIndex = Math.floor(this.scrollTop / this.itemHeight); // 计算可见的结束索引 const endIndex = startIndex + this.visibleCount; // 截取可见的列表项 this.visibleItems = this.data.slice(startIndex, endIndex); } }, beforeDestroy() { // 移除滚动事件监听 this.$refs.listContainer.removeEventListener('scroll', this.handleScroll); } }; </script> <style scoped> .scroll-vertical-list { height: 300px; overflow-y: auto; } .list-container { height: auto; } .list-item { height: 30px; line-height: 30px; } </style> ``` #### 代码详细解释 1. **`template` 部分**:定义了组件的 HTML 结构,包含一个滚动容器列表项的渲染。 2. **`props` 部分**:接收传入的所有数据、每个列表项的高度可见区域显示的列表项数量。 3. **`data` 部分**:存储当前可见的列表项滚动偏移量。 4. **`mounted` 钩子**:在组件挂载后,监听滚动事件并初始化可见列表项。 5. **`handleScroll` 方法**:处理滚动事件,更新滚动偏移量并调用 `updateVisibleItems` 方法。 6. **`updateVisibleItems` 方法**:根据滚动偏移量计算当前可见的起始结束索引,截取可见的列表项。 7. **`beforeDestroy` 钩子**:在组件销毁前,移除滚动事件监听,避免内存泄漏。 ### 性能优化 - **虚拟列表**:只渲染可见区域的列表项,减少 DOM 操作,提升性能。 - **节流**:对滚动事件进行节流处理,减少不必要的计算。 ### 总结 `vue-scroll-vertical-list` 通过动态计算渲染可见的列表项,实现了在有限容器内显示大量数据的高效滚动列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值