整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

html中怎样获取当前元素的高度?

HTML 中,通过 JavaScript 来获取当前元素的高度通常使用以下属性:

var element = document.getElementById("yourElementId"); // 获取元素var height = element.offsetHeight; // 获取元素高度(包括padding、border,但不包括margin)

如果你想获取元素的 CSS 定义的高度(不包括 padding 和 border),可以使用 style.height,但这只能获取到直接写在元素行内样式中的高度,而不是计算后的实际高度或 CSS 样式表中定义的高度:

var heightInStyle = element.style.height; // 只获取行内样式设置的高度

在 React 中获取当前元素的高度方式与 JavaScript 相似,但是你需要确保在 DOM 更新后获取元素高度。可以使用 ref 来访问实际 DOM 节点并获取其高度:

import React, { useRef, useEffect } from 'react';function YourComponent() {  const elementRef = useRef(null);  useEffect(() => {    if (elementRef.current) {      // 在这里,elementRef.current.clientHeight 获取元素的内容区域高度(不包括padding和border)      // elementRef.current.offsetHeight 获取元素的实际渲染高度(包括padding和border,但不包括margin)      console.log('Element height:', elementRef.current.offsetHeight);
    }
  }, []); // 确保此useEffect只在组件挂载后执行一次  return (    <div ref={elementRef}>
      {/* 你的组件内容 */}    </div>
  );
}export default YourComponent;

在上述代码中,useRef 创建了一个可变的引用对象,它可以用来保存任何可变值,包括 DOM 节点。然后通过将这个 ref 对象赋给元素的 ref 属性,React 会将对应的 DOM 节点保存到这个 ref 对象的 .current 属性上,这样我们就可以在回调函数或者其他适当的地方访问到该 DOM 节点,并获取其高度了。

如果要在图片加载完成后获取包含图片的元素高度,可以监听图片的 load 事件。在 React 中,你可以在组件内创建一个图片引用,并在 useEffect 中监听图片加载完成:

import React, { useRef, useEffect } from 'react';function YourComponent() {  const elementRef = useRef(null);  const imgRef = useRef(null);  useEffect(() => {    const handleImageLoad = () => {      if (elementRef.current) {        console.log('Element height after image load:', elementRef.current.offsetHeight);
      }
    };    // 如果img已经存在于DOM中,则立即触发handleImageLoad    // 否则,在img加载完成后触发handleImageLoad    if (imgRef.current && imgRef.current.complete) {      handleImageLoad();
    } else {
      imgRef.current.onload = handleImageLoad;
    }    // 可以选择在组件卸载时清除事件监听,避免内存泄漏    return () => {
      imgRef.current.onload = null;
    };
  }, []); // 确保此useEffect只在组件挂载后执行一次  return (    <div ref={elementRef}>      <img src="your-image-source.jpg" ref={imgRef} alt="Your Image" />
      {/* 其他内容 */}    </div>
  );
}export default YourComponent;

这样,当图片加载完成后,就会触发 handleImageLoad 函数,从而获取到包含图片的元素的实际高度。

如果图片是服务端渲染的,并且你无法直接在 img 标签上添加 ref,你可以考虑监听整个组件的 onLoad 事件来判断图片是否加载完成。由于 React 在浏览器中重新渲染时会保留 DOM 节点(除非有更改),所以可以通过检查元素的 offsetHeight 是否有变化来判断图片是否加载完毕。


在响应式布局逐渐成为主流的今天,网页或者app的流式布局已经不算是一个新鲜的词汇了。今天我要讲的一个内容也是跟页面流式布局有关,如何让你的网页实现完美的缩放?

网页布局

我们可以很快速的写出一个响应式布局的页面,首先看一下效果图。

网页布局

其中html部分的代码如下:

html部分代码

css中的item代码为:

css代码

通过以上代码,完成上述的流式布局后,在我们改变浏览器窗口大小时,div也会随之进行缩放。

问题

But,你以为这就是我们想要的结果吗?

当然不是!在改变浏览器窗口大小时,我们发现虽然div的宽度是进行了缩放,但是高度却没变,因此div的宽高比并未保持原始比例,我们可以看下以下的效果。

缩放后宽高比

从上图中可以很容易看出,缩放后的div宽高比比之前小很多,这并不是我们想要的结果。

我们需要达到的效果是在改变浏览器窗口大小时,div也会随之进行等比例的缩放。

实现办法

首先,可以使用Javascript代码去实现,这是没有问题的。但是绑定Javascript的onresize事件,在拖拽时可能会出卡顿现象,体验不是很好。

接下来我们通过CSS来实现以上的效果。

使用的核心属性是我们平时并不太注意的padding-bottom。

padding-bottom有一个很容易让人忽略的特性是,当取值为百分比形式时,其百分比的基数是父元素的宽度,而不是高度。

因此我们可以在不用给父元素设置高度的时候,就可以通过padding-bottom属性确定当前元素的高度。我们的做法如下。

  1. 将元素的height属性设为0,通过padding-bottom属性确定元素高度。

  2. 设置合理的padding-bottom值,例如上述的例子中,在宽度为21%时,如果需要高度是宽度的1.62倍,我们可以将padding-bottom取值为34%

修改后的CSS代码如下。

修改后的CSS

修改后,我们再次调整浏览器窗口的大小,就会发现div是等比例的进行缩放,完美达到了我们的要求。

修改后等比例缩放

疑问

在这里,可能会有人有疑问如果设置overflow:hidden;那么里面的文字会不会因为超过height,就会被隐藏了?

答案是不会的,根据CSS2.1的规范,overflow只会对处于padding外面的内容生效,即只有超出了 padding区域的内容才会被overflow属性隐藏掉。而在设置padding-bottom后,实际已经决定了元素的height属性,因此overflow:hidden;不会生效。

总结

今天这篇文章主要讲解了利用CSS完成页面等比例缩放的最简单方式,你学会了吗?

一篇文章用VBA下载一部完整小说,VBA除了可以轻松下载一部《水浒传》小说,还有什么用途?VBA获取网页信息(即爬虫技术)其用处可多了。今天介绍各位小伙用来监控的自选股票的主力资金变动的情况,愿大伙在2022年股票市场长红!也是把上期一个网友评论的内容(有些数据藏得很深,怎么找真正的地址……)回应一下。

东富的主力资金流入图

有一个理论我们会经常听到,A股的票涨涨跌跌主要是因为有大资金在活动、在操作,一些股票不断上涨是因为有主力资金不断买入,反而不断下跌是因为主力资金不断流出。喜欢做短线的,我们实时观察这些主力资金就变得很有意义,很多网站都有主力资金的数据,但是要对多支股票进行观察,则需要一个个打开网页、APP或者电脑程序查看数据,这样耗时也不能多支股票同框对比。还有一些小伙正上班,打开股票软件给老板或同事看到,总觉得怪怪的,当然这不是鼓励一些小伙上班玩股票,纯属用项目和大家一起交流学习。

用VBA就可以很轻松解决上述两个问题。大伙先看看效果吧!

点击按钮更新数据:2022年12月21日数据

完整代码如下:

Sub maincapital()

Application.DisplayAlerts = False
'循环A列数据,解析出相应股票代码
For Each cl In Range("a2:a" & Range("a2").End(xlDown).Row)
stock_code = Right(cl, 6) '取右边6位字符
Dim strText, stcok_code As String
'拼接构造网址
URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=1." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", URL, False
    .send
    strText = .responseText
End With

'判断是有null,解决深A股和上A股网址不同拼接问题,secids=0.是深A;secids=1.是上A。
Dim regStrTest As Object
With CreateObject("VBScript.Regexp")
    .Pattern = "null"
    Set regStrTest = .Execute(strText)
End With
If regStrTest.Count > 0 Then
'如果出现null则拼接构造一个新网址
URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=0." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", URL, False
    .send
    strText = .responseText
End With
End If

Rnum = cl.Row '股票名称所在行号
'利用正则表达式得到我们想要的内容,并写相应的表格
With CreateObject("VBScript.Regexp")
    .Pattern = """f62"":(.*?),"
Cells(Rnum, 2) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '主力净流进
    .Pattern = """f184"":(.*?),"
Cells(Rnum, 3) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '主力净比
    .Pattern = """f66"":(.*?),"
Cells(Rnum, 4) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '超大单净流进
    .Pattern = """f69"":(.*?),"
Cells(Rnum, 5) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '超大单净比
    .Pattern = """f72"":(.*?),"
Cells(Rnum, 6) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '大单净流进
    .Pattern = """f75"":(.*?),"
Cells(Rnum, 7) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '大单净比
    .Pattern = """f78"":(.*?),"
Cells(Rnum, 8) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '中单净流进
    .Pattern = """f81"":(.*?),"
Cells(Rnum, 9) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '中单净比
    .Pattern = """f84"":(.*?),"
Cells(Rnum, 10) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '小单净流进
    .Pattern = """f87"":(.*?),"
Cells(Rnum, 11) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '小单净比
    .Pattern = """f64"":(.*?),"
Cells(Rnum, 12) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '超大单流入
    .Pattern = """f65"":(.*?),"
Cells(Rnum, 13) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '超大流出
    .Pattern = """f70"":(.*?),"
Cells(Rnum, 14) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '大单流入
    .Pattern = """f71"":(.*?),"
Cells(Rnum, 14) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '大单流出
    
End With
Next
Application.DisplayAlerts = True
End Sub

这个项目用到的几个重要知识:

  1. 获取动态网页加载数据的真正网址;
  2. 使用CreateObject("MSXML2.XMLHTTP")对象获取网页信息,基本框架可以参考用VBA下载一部完整小说;
  3. 使用CreateObject("VBScript.Regexp")正则表达式对象,处理网页信息并写入表格;
  4. 点击按钮调用函数

获取动态网页加载数据的真正网址

我们在目标网页点击右键,并点击“查看网页源代码”后,当使用cttl+f键查看我们想要获取的信息进行查看(这里我输入主力净比数据-42.76),发现并没有相关的数据。

在源代码网页同时按cttl+f键查看

通过这个方法基本可以判断目标网页的部分数据是使用动态加载的方式。简单的动态加载数据,可以通过以下两步获取真正的网址:

第一步:打开浏览器控制台。演示使用的浏览器是chrome,按下F12键打开浏览器控制台,再次刷新网页,在控制台找到并点击扩大镜小按钮,打开search对话框,这里输入想找的数据(这里我输入主力净比数据42.76)后,按下回车键或输入框旁边的刷新按键,就会弹出一个“get”字符及一些类似网址的内容,点击弹出的内容,右下面对话框会弹出相应的内容(对话框的菜单有Headers,Preview,Response……)

图中主力净比数据为-42.73和在输入框的数据不一致,是因为资金数据动态变化了

第二步:找到加载数据的网址。点击Headers可以看到Resquest URl字符,后面网址就是加载数据真正的网址,复制网址在浏览器打开,我们可以看到相应的数据内容。获得这网址后,就可以通过VBA访问这个网址获取相应的数据,按下来的工作就好办了。

目标数据的网址


使用CreateObject("MSXML2.XMLHTTP")对象获取网页信息

stock_code = Right(cl, 6) '取右边6位字符
Dim strText, stcok_code As String '
'拼接构造网址
URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=1." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", URL, False
    .send
    strText = .responseText
End With

'判断是有null,解决深A股和上A股网址不同拼接问题,secids=0.是深A;secids=1.是上A。
Dim regStrTest As Object
With CreateObject("VBScript.Regexp")
    .Pattern = "null"
    Set regStrTest = .Execute(strText)
End With
If regStrTest.Count > 0 Then
'如果出现null则拼接构造一个新网址
URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=0." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", URL, False
    .send
    strText = .responseText
End With
End If

上面代码的说明:

1、使用right(目标字符串,字符个数)函数获取目标字符串从右边数起第几个字符。

2、做两次网址请求是因为深A股和上A股的数据网址是有区别,网址的参数“secids=0.+ 股票代码”是深A;“secids=1.+股票代码”是上A。如果人为对每支股票判断是上A还深A会很复杂,所以使用正则表达式,对请求数据内容出现“null”字样的网址,则更换网址参数。如下图:

上A网址请求结果

深A网址请求结果


使用CreateObject("VBScript.Regexp")正则表达式对象获取数据

For Each cl In Range("a2:a" & Range("a2").End(xlDown).Row)
……
Rnum = cl.Row '股票名称所在行号
'利用正则表达式得到我们想要的内容,并写相应的表格
With CreateObject("VBScript.Regexp")
    .Pattern = """f62"":(.*?)," 'VBA的英文的双引号
Cells(Rnum, 2) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '主力净流入
    .Pattern = """f184"":(.*?),"
Cells(Rnum, 3) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '主力净比
    .Pattern = """f66"":(.*?),"
……

上面代码的说明:

1、Range("a2").End(xlDown)是表示定位从A2单元往下最后一个不空值的单元格。

2、cl.Row是表示单元格的行数,Range("A1").Row,Cells(1, 1).Row都可以获取单元格行数,列值则是Range("A1").Column和Cells(1, 1).Column。

3、.Pattern = """f62"":(.*?)," 是正则表达式(网页的内容是:"f62":-15043563520.0),VBA的英文的双引号用正则表式表示则是两个双引号,即是""。"f62":后面数据就是主力净流入的数据,用(.*?)表示。再用.submatches.Item(0)得到目标数据,这个数据是以元为单位,网页显示的是亿,所以要/100000000。

4、Round(目标数据,小数点位数)是取多少位小数的方法。


点击按钮调用函数

Private Sub CommandButton1_Click()
Call maincapital '调用函数
End Sub



在这总结一下VBA抓取数据主要步骤:

分析网站->>分析网页数据->>处理网页数据->>储存网页数据

欢迎大家评论及提意见,相互学习,提高效率,创造价值。