inline-block元素上浮无法对齐的解决办法

本文探讨了使用 CSS 属性 display:inline-block 进行布局时出现的元素上浮问题及其解决方法,深入分析了基线(baseline)的概念,并提供了一种简单有效的解决策略。

不得不说display:inline-block;是一个强大的css属性,它解决了很多float浮动布局的不足,让页面布局更随意、富有弹性。但这个改变了元素类型的属性也存在着很多容易让人忽视的小问题,如之前我有写过的《li标签间有空白是怎么回事? 消除li横排后空隙》,我们姑且称之为“bug”吧(实则不然),只有我们掌握了这些问题的解决办法,才能更加熟练的使用这一布局神器。

inline-block元素上浮无法对齐的解决办法

笔者这次遇到的一个问题场景是元素设置为display:inline-block;后,部分元素出现了上浮,无法与其他同行元素水平对齐。

部分代码如下:

 
  1. <div class="wrap">
  2.  <div class="a">iyaxi.com</div>
  3.  <div class="a">雅兮网</div>
  4.  <div class="a">iyaxi.com</div>
  5.  <div class="a">雅兮网</div>
  6. </div>

css部分

 
  1. <style type="text/css">
  2.  *{
  3. border: 0;
  4. padding: 0;
  5. margin: 0;
  6.  }
  7. body{
  8. font-size: 14px;
  9.  }
  10.  .wrap{
  11. width: 960px;
  12. margin: 0 auto;
  13. margin-top: 100px;
  14.  }
  15.  .a{
  16. width: 100px;
  17. height: 60px;
  18. background-color: #0088ff;
  19. color: #fff;
  20. display: inline-block;
  21.  *display: inline;
  22.  *zoom:1;
  23.  }
  24.  </style>

可以看到,我们制作的这个小demo,预期是将四个<div>设置为块状行内元素,让他们水平对齐以达到如下图效果。

inline-block元素上浮无法对齐的解决办法

当四个块状元素内都写有文本的时候,实现了预期的效果;但当其中一个块状元素无内容填充时,出现了异常,该空白元素出现了上浮,导致整个页面变得参差不齐了,如下图,为什么会这样呢?

inline-block元素上浮无法对齐的解决办法

重点来了(敲黑板!!!)行内元素和替换元素(如<input><textarea>等)会有一个叫做基线(baseline)的玩意,他的位置位于文本框的底部,即文字的最底端;当块状行内元素无文本填充的时候,它的基线就会自动移至元素的最底端;同时,图片以及其他非替换元素的基线也为元素的最底端。

总结起来就是,行内元素和替换元素的基线位于文本框的底端,无文本的块状行内元素、图片和非替换元素的基线就是元素的最底端。大家横向对齐的参照物默认就是这个基线(baseline)

所以上面的问题就很好理解了,空白的块状行内元素基线默认为元素底端,其他几个元素的基线位于文本的底部,大家都参照基线进行了对齐。看似参差不齐,其实上还是对齐的,如下图。

你也可以直接查看demo

inline-block元素上浮无法对齐的解决办法

那么又延伸出另外的一个情况,当各元素之间的文本字体大小或者文本长度不一致时,基线的位置也会发生改变,页面会呈现更加的“混乱”状态,但实际上还是参照基线对齐的。如下图,

你也可以直接查看demo

inline-block元素上浮无法对齐的解决办法

下面就是解决办法:既然页面的混乱是因为“基线对齐”导致的,那只需要设置元素的垂直对齐不参照基线即可,引入vertical-align属性,设置元素的垂直对齐方式。

inline-block元素上浮无法对齐的解决办法

本例中,由于各元素高度相同,top、middle、bottom任选其一就可实现对齐。

将 vertical-align:top; 加入 .a{}样式即可,

你也可以直接查看demo

文章出处为:http://www.iyaxi.com/2017-07-03/1473.html


async createChartStep2(type, title, barData, barData2,lineData,months,yearToMonth) { const chart = echarts.init(document.getElementById("chartStep2-" + type), null, { renderer: 'svg' });// 替换默认的 Canvas let stepTwoData = {} stepTwoData = await this.getProjectInitiationTrendChartStepTwo(title,yearToMonth) let barWidth = stepTwoData.deptNameList&&stepTwoData.deptNameList.length > 1 ? 'auto' : '15%'; // 动态调整柱形图宽度 const option = { animation: true, tooltip: { trigger: 'axis', axisPointer: { type: 'none' }, formatter: function (params) { // 默认圆点样式 const defaultDot = (color) => `<span style="display:inline-block;margin-right:5px;border-radius:50%;width:10px;height:10px;background-color:${color};"></span>`; // 构建 tooltip 内容 let tooltipContent = `<div style="font-size:14px;margin-bottom:10px;">${params[0].name}</div>`; params.forEach(param => { const value = param.seriesIndex === 2 ? `${param.value}%` : param.value; // 显示为百分比 tooltipContent += ` <div style="margin-bottom:5px;"> ${defaultDot(param.color)} <span style="font-size:14px;">${param.seriesName} : ${value}</span> </div> `; }); return tooltipContent; } }, legend: { data: this.legends[title], top: 0 }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, xAxis: { type: 'category', data: stepTwoData.deptNameList?stepTwoData.deptNameList:[], axisLabel: { fontSize: 12, formatter: function (value) { // 将字符串拆分为单个字符,并用 \n 连接 return value.toString().split('').join('\n'); } } }, yAxis: [ { type: 'value', name: title.includes('资金')?'金额(万元)':'数量', position: 'left', splitLine: { show: true, // 显示背景线 lineStyle: { type: "dotted", // 设置为点线 color: "#d6d6d6", // 背景线的颜色 width: 1, // 背景线的宽度 }, }, }, { type: 'value', name: '百分比(%)', min: 0, max: 100, position: 'right', axisLabel: { formatter: '{value}%' }, splitLine: { show: false, // 显示背景线 lineStyle: { type: "dotted", // 设置为点线 color: "#d6d6d6", // 背景线的颜色 width: 1, // 背景线的宽度 }, }, } ], series: [ { name: this.legends[title][0], type: 'bar', barMaxWidth: barWidth, data: (type=='zijin1' || type=='zijin2' )?(stepTwoData.planPaymentAmountList || []):(stepTwoData.sumList || []), itemStyle: { color: '#2563eb' }, label: { normal: { show: true, position: 'top', distance: 15, // 上浮15像素 verticalAlign: 'bottom', // 文字底部对齐标签点 fontSize: 14, fontWeight: "bold", formatter: function (params, ticket, callback) { return params.value ? params.value : ''; } } }}, { name: this.legends[title][1], type: 'bar', barMaxWidth: barWidth, data: (type=='zijin1' || type=='zijin2' )?(stepTwoData.expectExpenditureAmountList || []):(stepTwoData.numList || []), itemStyle: { color: '#f97316' }, label: { normal: { show: true, position: 'top', // 改为底部显示 distance: 2, // 上浮15像素 verticalAlign: 'bottom', // 文字底部对齐标签点 fontSize: 14, fontWeight: "bold", formatter: function (params, ticket, callback) { return params.value ? params.value : ''; } } }}, { name: this.legends[title][2], type: 'line', yAxisIndex: 1, data: stepTwoData.rateList, itemStyle: { color: '#22c55e' }, label: { show: true, formatter: '{c}%', position: 'top', fontSize: 15, fontWeight: "bold", } } ] }; chart.setOption(option); let than = this; // 绑定事件前先移除旧的事件 chart.off('click'); // 以 click 事件为例 chart.on("click", function (params) { let searchFieldsName = '' if(title == '立项完成率趋势图(累加值)' || title == '立项完成率趋势图(当月值)'){ than.showbar1Step2 = false than.showbar1Step3 = true if(title == '立项完成率趋势图(累加值)') { than.showOneSetpEd = 1 searchFieldsName = 'search14Fields' } if(title == '立项完成率趋势图(当月值)') { than.showOneSetpEd = 2 searchFieldsName = 'search15Fields' } than.stepbar1Breadcrumb = [ { title: title, step: 1, value: 1 + '1', selected: false }, { title: title+'部门情况', step: 2, value: 1 + '2', selected: false }, { title: '详情', step: 3, value: 1 + '3', selected: true } ] } if(title == '结项完成率趋势图(累加值)' || title == '结项完成率趋势图(当月值)'){ than.showbar2Step2 = false than.showbar2Step3 = true if(title == '结项完成率趋势图(累加值)') { than.showTwoSetpEd = 1 searchFieldsName = 'search16Fields' } if(title == '结项完成率趋势图(当月值)') { than.showTwoSetpEd = 2 searchFieldsName = 'search17Fields' } than.stepbar2Breadcrumb = [ { title: title, step: 1, value: 1 + '1', selected: false }, { title: title+'部门情况', step: 2, value: 1 + '2', selected: false }, { title: '详情', step: 3, value: 1 + '3', selected: true } ] } if(title == '资金完成率趋势图(累加值)'){ than.showbar3Step2 = false than.showbar3Step3 = true if(title == '资金完成率趋势图(累加值)') { than.showTreeSetpEd = 1 searchFieldsName = 'search18Fields' } if(title == '资金完成率趋势图(当月值)') { than.showTreeSetpEd = 2 searchFieldsName = 'search23Fields' } than.stepbar3Breadcrumb = [ { title: title, step: 1, value: 1 + '1', selected: false }, { title: title+'部门情况', step: 2, value: 1 + '2', selected: false }, { title: '详情', step: 3, value: 1 + '3', selected: true } ] } if(title == '计划外项目趋势图(累加值)' || title == '计划外项目趋势图(当月值)'){ than.showbar4Step2 = false than.showbar4Step3 = true if(title == '计划外项目趋势图(累加值)') { than.showFourSetpEd = 1 searchFieldsName = 'search19Fields' } if(title == '计划外项目趋势图(当月值)') { than.showFourSetpEd = 2 searchFieldsName = 'search20Fields' } than.stepbar4Breadcrumb = [ { title: title, step: 1, value: 1 + '1', selected: false }, { title: title+'部门情况', step: 2, value: 1 + '2', selected: false }, { title: '详情', step: 3, value: 1 + '3', selected: true } ] } if(title == '项目变更趋势图(累加值)' || title == '项目变更趋势图(当月值)'){ than.showbar5Step3 = false than.showbar5Step3 = true if(title == '项目变更趋势图(累加值)') { than.showFiveSetpEd = 1 searchFieldsName = 'search21Fields' } if(title == '项目变更趋势图(当月值)') { than.showFiveSetpEd = 2 searchFieldsName = 'search22Fields' } than.stepbar5Breadcrumb = [ { title: title, step: 1, value: 1 + '1', selected: false }, { title: title+'部门情况', step: 2, value: 1 + '2', selected: false }, { title: '详情', step: 3, value: 1 + '3', selected: true } ] } setTimeout(() => { than.$nextTick(()=>{ if(than.$refs[searchFieldsName]){ than.$refs[searchFieldsName].handleQuery('init',stepTwoData.deptIdList[params.dataIndex]*1,than.legends[title][params.seriesIndex],'',than.formatMonth(yearToMonth)) } }) }, 1000); }); // 监听窗口尺寸变化并自动调整图表 window.addEventListener("resize", function () { chart.resize(); }); // 使用 ResizeObserver 监听 div 大小变化 const resizeObserver = new ResizeObserver(() => { chart.resize(); // 当 div 尺寸发生变化时,重新调整 ECharts 图表大小 }); // 开始监听指定的 div 元素 resizeObserver.observe(document.getElementById("chartStep2-" + type)); }, stepTwoData.planPaymentAmountList 如果存在负值会导致 百分比的基线在负数上 不对
最新发布
08-19
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值