客户区尺寸client

关于元素尺寸,一般地,有偏移大小offset、客户区大小client和滚动大小scroll。前文已经介绍过偏移属性,后文将介绍scroll滚动大小,本文主要介绍客户区大小client

客户区大小

  客户区大小client指的是元素内容及其内边距所占据的空间大小

clientHeight

  clientHeight属性返回元素节点的客户区高度

clientHeight = padding-top + height + padding-bottom

clientWidth

  clientWidth属性返回元素节点的客户区宽度

clientWidth = padding-left + height + padding-right

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div><script>//120(10+100+10)console.log(test.clientHeight);
console.log(test.clientWidth);</script>

  [注意]滚动条宽度不计算在内

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll"></div><script>//103(120-17),滚动条宽度为17pxconsole.log(test.clientHeight);
console.log(test.clientWidth);</script>

<div id="test" style="width:100px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:1;height:100px">
    内容<br>内容<br>内容<br>内容<br>内容<br>内容<br></div><script>//83(100-17)console.log(test.clientHeight);</script>

  当height和纵向padding的和为0(以及小于17px的情况)时,如果仍然存在滚动条,各浏览器表现不一样

<div id="test" style="width: 100px;height:0;margin: 10px;border: 1px solid black;overflow:scroll"></div><script>//chrome/safari:-17(0-17)//firefox/IE:0console.log(test.clientHeight);</script>

<div id="test" style="width: 100px;height:10px;margin: 10px;border: 1px solid black;overflow:scroll"></div><script>//chrome/safari:-7(10-17)//firefox/IE:0console.log(test.clientHeight);</script>

bug

  如果设置overflow:scroll,使得滚动条始终存在,当不设置高度height值时,各个浏览器表现不一样。firefox存在一个最小高度为34px的垂直滚动条,IE7-浏览器存在一个最小高度为19px的垂直滚动条,而其他浏览器的垂直滚动条无最小高度 

  所以,当clientHeight的值小于34px时,firefox会返回34;当clientHeight的值小于19px时,IE7-会返回19

<div id="test" style="width: 100px;margin: 10px;border: 1px solid black;overflow:scroll"></div><script>//chrome/IE8+/safari:0(因为height和padding都是0)//firefox:34(设置overflow:scroll之后,默认存在一个高34px的垂直滚动条)//IE7-:19(默认存在一个高19px的垂直滚动条)console.log(test.clientHeight);</script>

<div id="test" style="width: 100px;margin: 10px;border: 1px solid black;font-size:20px;line-height:1;overflow:scroll">内容</div><script>//chrome/IE8+/safari:20(20*1)//firefox:34(20<34)//IE7-:20(20>19)console.log(test.clientHeight);</script>

<div id="test" style="width: 100px;padding-top:20px;margin: 10px;border: 1px solid black;font-size:20px;line-height:1;overflow:scroll">内容</div><script>//chrome/IE8+/safari:40(20*1+20)//firefox:40(40>34)//IE7-:40(40>19)console.log(test.clientHeight);</script>

clientLeft

  clientLeft属性返回左边框的宽度

clientTop

  clientTop属性返回上边框的宽度

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div><script>//1 1console.log(test.clientLeft);
console.log(test.clientTop);</script>

  [注意]如果display为inline时,clientLeft属性和clientTop属性都返回0

<div id="test" style="display:inline;width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div><script>//0 0console.log(test.clientLeft);
console.log(test.clientTop);</script>

页面大小

  常用document.documentElement的client属性来表示页面大小(不包含滚动条宽度)

  [注意]在IE7-浏览器中,<html>元素默认存在垂直滚动条

<body style="overflow:scroll"><script>//1903(1920-17)console.log(document.documentElement.clientWidth);//930(947-17)console.log(document.documentElement.clientHeight);</script>

  另一个对常用的表示页面大小的属性是window.innerHeight和innerWidth属性(包含滚动条宽度)

  innerHeight和innerWidth表示的是浏览器窗口大小减去菜单栏、地址栏等剩余的页面尺寸,由于滚动条是属于页面的,所以包含滚动条

  [注意]IE8-浏览器不支持innerHeight和innerWidth属性

<body style="overflow:scroll"><script>//1920console.log(window.innerWidth);//947console.log(window.innerHeight);</script>

  如果没有滚动条,这两类属性在电脑端表示同样的值,但是却表示不同的含义。在移动端,innerWidth和innerHeight表示的是视觉视口,即用户正在看到的网站的区域;而document.documentElement.clientWidth和clientHeight表示的是布局视口,指CSS布局的尺寸。详细情况移步至此

  [注意]页面的客户区大小和页面的实际大小是不同的,页面的实际大小将由后文的scroll滚动大小来表示

注意事项

  【1】所有客户区client属性都是只读的

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div><script>console.log(test.clientHeight);//IE8-浏览器会报错,其他浏览器则静默失败test.clientHeight = 10;
console.log(test.clientHeight);</script>

  【2】如果给元素设置了display:none,则客户区client属性都为0

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;display:none;"></div><script>console.log(test.clientHeight);//0console.log(test.clientTop);//0</script>

  【3】每次访问客户区client属性都需要重新计算,重复访问需要耗费大量的性能,所以要尽量避免重复访问这些属性。如果需要重复访问,则把它们的值保存在变量中,以提高性能

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>      <script>console.time("time");for(var i = 0; i < 100000; i++){    var a = test.clientHeight;
}
console.timeEnd(‘time‘);//66.798ms</script>

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div>         <script>console.time("time");var a = test.clientHeight;for(var i = 0; i < 100000; i++){    var b = a;
}
console.timeEnd(‘time‘);//1.705ms</script>
时间: 2024-08-06 11:43:15

客户区尺寸client的相关文章

EVT_NC_PAINT 窗口非客户区的绘制

说明 NC就是non client意思,非客户区主要包括标题栏,状态栏,工具栏和边框等区域,目前wxwidgets只是提供了EVT_NC_PAINT 唯一的一个非客户区的事件,在MFC中,还有提供WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMOUSEMOVE等事件操作,如果需要关联这些事件,就必须要过滤该事件,或者在源码中实现该类事件 目前需要拖动边框的时候,客户区域不变,只是边框变大,等到边框拖动到合适的地方,鼠标弹起,客户区域重绘

C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT

窗体分为两部分:客户区(Client area)和非客户区(Non-Client area) WM_PAINT消息.OnPaint()方法.GetDC()API函数都是处理窗体客户区绘制的   而标题栏处于非客户区中,所以WM_PAINT消息.OnPaint()方法.GetDC()API函数都用不上   GetWindowDC()是获得整个窗体的画布句柄(Device Context翻译为:设备清单,我习惯称为画布句柄),包括非客户区   GDI的绘制都离不开DC,因为操作系统必须知道你要在什么

窗体皮肤实现 - 重绘窗体非客户区(三)

窗体边框基本的绘制和控制完成,在第二篇中主要遗留的问题. 标题区域图标和按钮没绘制 缩放时客户区显示有问题 解决完下面的问题,皮肤处理基本完整.大致的效果GIF GIF中TShape的颜色表现有些问题,实际是正常的. 绘制标题区域内容 获取标题有效区域 绘制窗体图标 绘制按钮 绘制标题 标题区域主要考虑窗体是否在最大化状态,最大化后实际的标题绘制区域会有变化.可以通过 IsZoomed 或 GetWindowLong(Handle, GWL_STYLE) and WS_MAXIMIZE = WS

屏幕坐标系和窗口客户区坐标

屏幕坐标系和窗口客户区坐标系最明显的区别在于坐标原点,屏幕坐标系的坐标原点在整个屏幕的左上角,而窗口客户区坐标系的坐标原点在窗口客户区的左上角,通常这两个点是不重合的. 一 设备坐标和逻辑坐标 设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口

MFC光标移动到按钮上时编辑框显示时间,并显示光标的窗口位置和客户区位置

建立MFC应用程序 选择基于对话框 添加一个按钮三个编辑框,三个编辑框分别用来显示系统时间.光标在windows的位置.光标在client的位置. 将Button的captain改为Time,ID改为IDC_time. 点击 项目/类向导/成员变量/  , 为按钮和编辑框添加变量m_time,m_showtime,m_client,m_window,(方法有很多). 注意类别为control,变量类型分别为cbutton和cedit 在类向导里 点击消息 找到mousemove,双击, 以上红字

Windows客户区窗口大小设置

#define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 Windows下设置的窗口(非客户区)长宽分别为800 x 600 所以当我们用函数GetClientRect(hwnd, &rect)获取客户区大小 rect.right为782   rect.bottom为555 所以如果要设置客户区成800 x 600 RECT rect1;RECT rect2;GetWindowRect(hwnd, &rect1);   // 四个坐标分别表示窗口

windows编程笔记(5):客户区输出字符

在客户区的界面显示程序是在放在回调函数的WM_PAINT消息的处理中,当客户区需要被重绘时,Windows系统会给应用程序窗口发送一个WM_PAINT消息.窗口在收到这个消息时,它就会重绘它的客户区. 显示文字的步骤: 1 用BeginPaint()函数得到客户区的设备环境句柄. 2 用TextOut()函数显示文字. 3 用EndPaint()函数结束显示. 显示文字的代码如下: case WM_PAINT: hdc=BeginPaint(hWnd,&ps); TextOut(hdc,10,1

窗口非客户区的绘制

1.根据需要,要改变nc区的大小. 响应WM_NCCALCSIZE可改变nc区的大小.关键在于lParam,msdn上说当wParam为True时, lParam为LPNCCALCSIZE_PARAMS的指定,当wParam为False时为LPRECT,做了些实验发现 只有第一次时wParam为False,LPNCCALCSIZE_PARAMS的语义相当复杂,不过我们只用 看第一个RECT就成.它表是窗口客户区的大小.当lParam为LPRECT时,也同样.只用改变 客户区的大小,相应的就改变了

2算法:客户区坐标转换成屏幕坐标

//显示菜单 POINT point = { 0 }; //转换时需要POINT数据结构 point.x = LOWORD(lParam); //客户区坐标 point.y = HIWORD(lParam); //转换成屏幕坐标 ClientToScreen(hWnd, &point); //point.x //point.y 这两个坐标可以直接使用 来自为知笔记(Wiz)