纯Css实现Div高度根据自适应宽度(百分比)调整

本文探讨了在响应式布局中实现div元素宽高比固定的技术。通过对比多种方法,如使用JS动态调整、vw单位及float布局,最终介绍了一种利用padding-top属性的解决方案,实现了div元素的宽高比自适应。
本文转载自: https://www.cnblogs.com/heyach/p/6494872.html 作者:heyach 转载请注明该声明。

在如今响应式布局的要求下,很多能自动调整尺寸的元素能够做到高宽自适应,如img,通过{width:50%;height:auto;}实现图片高度跟随宽度比例调整。

然而,用的最多的标签一哥Css实现Div高度根据自适应宽度+百分比+调整.html' target='_self'>Div却不能做到自动调整(要么从父级继承,要么自行指定px,要么给百分比!但是这个百分比是根据父级的高度来计算的,根本不是根据元素自身的宽度,那么就做不到Div的宽高达成一定的比例=-=)。

要实现这种功能(div的高度:宽度=1:1),通过各种加Buff,得知有以下几种处理方式

1,直接指定div的宽高+zoom来实现自适应

div{width:50px;heigth:50px;zoom:1.1;}

这样能达到初步的等宽高div,但是局限性太大,PASS!

2,通过js动态判断div的宽度来设置高度

div{width:50%;}

window.onresize = function(){div.height(div.width);}

也能实现等宽高div,但是总觉得有点别扭,PASS!

3,通过宽高单位来设置

div{width:20vw;height:20vw;/*20vw为viewport width的20%*/}

但是很多设备不支持这个属性,兼容性太差,PASS!

4,通过float来设置

#aa{background:#aaa;;}
#bb{background:#ddd;;float:left}
#cc{background:#eee;;float:right}

<div id="aa">父div
  <div id="bb">子div</div>
  <div id="cc">子div</div>
  <div style="clear:both">就是这个用于clear错误的</div>
</div>

能够让父级元素aa根据子元素的高度自动改变高度(在子元素里放置自适应元素)来调整高宽比一致,然而太麻烦,PASS!

5,终于到最终大杀器了,通过padding来实现此功能

通过以上几个方案的实验,发现宽度的自适应是根据viewport的width来调整的,比如{width:50%}就是浏览器可视区域的50%,resize之后也会自动调整。

而height指定百分比后,他会自行找到viewport的height来调整,跟width一毛钱关系没有,自然两者不能达到比例关系了。通过这个思路,要找到一个能跟viewport的width扯上裙带关系的属性,就能解决这个问题了。

这个属性就是padding,padding是根据viewport的width来调整的,巧就巧在padding-top和padding-bottom也是根据viewport的width来计算的,那么通过设置这个属性就能跟width达成某种比例关系了,

我们首先指定元素的width为父级元素的50%(父级元素为任意有高宽的元素,不能指定特定父级元素,否则影响此方案的通用性)

.father{width:100px;height:100px;background:#222}

.element{width:50%;background:#eee;}

这个时候我们再设置element的height为0,padding-bottom:50%;

.element{width:50%;height:0;padding-bottom:50%;background:#eee;}

element就变成了一个宽度50%,高度为0(但是他有50%width的padding-bottom)的正方形了,效果如下图灰白色的div

这个时候可能有人要问了,这个div的高度为0,那如果我要在element里放置元素呢,那岂不是overflow了,这里就要提到overflow属性了,它的计算是包括div的content和padding的,也就是说,

原来你的div可能是个{width:50px;height:50px;padding:0}的div,现在变成{width:50px;height:0;padding-bottom:50px;}的div了,尺寸还是一样的,通过指定这个div的子元素的定位,一样可以正常显示

这样就可以通过设定父级元素father、我们需要的元素element、子级元素datail来实现任意情况下该需求(div宽高定比例)。

参考:http://zihua.li/2013/12/keep-height-relevant-to-width-using-css/

 

### 计算点云数据的平均高度差 计算点云数据的平均高度差通常涉及以下几个方面:定义高度方向、提取点的高度信息并进行统计分析。以下是具体方法: #### 定义高度方向 在三维空间中,点云中的每个点由其坐标 $(x, y, z)$ 表示。假设 $z$ 轴代表高度方向,则可以通过比较不同点之间的 $z$ 坐标来衡量它们的高度差异。 #### 提取高度信息 对于一组点云数据 $\{P_1(x_1, y_1, z_1), P_2(x_2, y_2, z_2), \dots, P_n(x_n, y_n, z_n)\}$,可以提取所有点的 $z$ 值形成一个新的数组或向量 $Z = [z_1, z_2, \dots, z_n]$。 #### 统计分析 为了计算点云数据的平均高度差,需要先计算每一对点之间高度差的绝对值,并求这些差值的平均值。设总共有 $n$ 个点,则任意两点间的高度差为: $$ \Delta Z_{ij} = |z_i - z_j|, \quad i \neq j $$ 总的平均高度差可表示为: $$ \text{Average Height Difference} = \frac{\sum_{i=1}^{n}\sum_{j=i+1}^{n} |\Delta Z_{ij}|}{C(n, 2)} $$ 其中 $C(n, 2) = \frac{n(n-1)}{2}$ 是组合数,用于计算两两配对的数量[^1]。 如果直接计算上述公式的复杂度较高 ($O(n^2)$),则可以选择更高效的近似方法,例如仅考虑相邻点的高度差或者通过采样减少计算量。 #### 实现代码 以下是一个基于 C++ 的简单实现,利用 `std::vector` 存储点云的 $z$ 值,并计算平均高度差: ```cpp #include <iostream> #include <vector> #include <cmath> double calculateAverageHeightDifference(const std::vector<double>& heights) { int n = heights.size(); if (n < 2) return 0.0; double sum_diff = 0.0; int count = 0; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { double diff = std::abs(heights[i] - heights[j]); sum_diff += diff; count++; } } return (count > 0) ? sum_diff / count : 0.0; } int main() { // 示例点云的 z 值 std::vector<double> pointCloudHeights = {1.0, 2.5, 3.7, 4.8, 5.9}; double avgHeightDiff = calculateAverageHeightDifference(pointCloudHeights); std::cout << "Average height difference: " << avgHeightDiff << std::endl; return 0; } ``` 此代码实现了两两高度差的精确计算,并返回最终的平均值。 #### 点云处理算法优化 当点云规模较大时,可以直接采用随机抽样的方式降低计算成本。例如,在点云中均匀选取一定数量的子集来进行高度差计算[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值