理清window和document的区别以及两者的宽高

一、window和document的区别是什么?
  • window
    1.window对象表示浏览器中打开的窗口。
    2.window对象可以省略,如:
    alert() 等价于 window.alert()
  • document
    1.document对象是window对象的一部分。如:
    document.body 等价于 window.document.body
    2.浏览器的html文档成为document对象。
二、window.location和document.location一样吗?
  • window对象的location属性引用的是location对象,表示该窗口中当前显示文档的URL。
  • document对象的location属性也是引用了location对象。
  • 因此
    window.location === document.location //true
    location.herf === window.location.href === document.location.href
三、与window相关的宽高(不考虑window.document的情况下)
  1. window.innerWidth(打开窗口的内部宽度)与window.outerWidth(打开窗口的外部宽度)


    两者在此表示一样的值
  2. window.innerHeight(打开窗口的内部高度)与window.outerHeight(打开窗口的外部高度)


    window的内高与外高

    3.window.screen包含有关用户屏幕的信息

  • window.screen.height(整个屏幕的高。。固定值)
  • window.screen.width(整个屏幕的宽。。固定值)
  • window.screen.availHeight(可利用的高,即不包括浏览器Google属性栏。。固定值)
  • window.screen.availWidth(可利用的宽,与window.screen.width是一样的。。固定值)
  • window.screenTop(浏览器顶部距屏幕顶部的距离。。随浏览器的缩放以及位置决定)
  • window.screenLeft(浏览器左侧距屏幕左侧的距离。。随浏览器的缩放以及位置决定)
window.screen.height与window.screen.availHeight

四、与document相关的宽高(以document.body为例)
1. 与client相关的宽高
  • document.body.clientWidth
  • document.body.clientHeight
  • document.body.clientTop
  • document.body.clientLeft

clientWidth与clientHeight
1> 该属性指的是元素的可视部分宽度和高度,即padding + content。
2> 如果没有滚动条,即为元素设定的高度和宽度。
3> 如果出现滚动条,那么滚动条会遮盖元素的宽高,那么该属性就是其本来宽高减去滚动条的宽高。(注意:mac系统下滚动轴不占宽度)
总结:
假如无padding无滚动:clientWidth = style.width
假如有padding无滚动:clientWidth = style.width + style.padding*2 
假如有padding有滚动,并且滚动轴是显示的:clientWidth = style.width+style.padding*2 - 滚动轴宽度

clientTop和clientLeft
这两个返回的是元素周围边框的厚度,如果不指定一个边框或者不定位该元素,它的值就是0.
总结:
这一对属性是用来读取元素的border的宽度和高度的。
clientTop = border-top的border-width(边框像素)
clientLeft = border-left的border-widrh(边框像素)

2. 与offset相关的宽高
  • document.body.offsetWidth
  • document.body.offsetHeight
  • document.body.offsetTop
  • document.body.offsetLeft

offsetWidth与offsetHeight
1> 这一对属性指的是元素的border + padding + content的宽度和高度。
2> 该属性和其内部的内容是否超出元素大小无关,只和本来设定的border以及width和height有关。
总结:
假如无padding 无滚动 无border:offsetWidth = clientWidth = style.width
假如有padding 无滚动 有border:offsetWidth = style.width+style.padding·2 + (border-width)·2 或者 offsetWidth = clientWidth + (border-width)·2
假如有padding 有滚动 有border:offsetWidth = style.width+style.padding·2 + (border-width)·2 或者 offsetWidth = clientWidth +滚动轴宽度 + (border-width)·2

offsetLeft与offsetTop

  • 首先先要了解offsetParent这个属性:

1> 如果当前元素的父级元素没有进行CSS定位(position为absolute或relative),offsetParent为body。
2> 如果当前元素的父级元素中有CSS定位(position为absolute或relative),offsetParent取最近的那个父级元素。

  • 这两个属性对于浏览器的兼容问题:
兼容性

对照上面的公式,下面的例子可帮助深入理解:


3. 与scroll相关的宽高
  • document.body.scrollWidth
  • document.body.scrollHeight
  • document.body.scrollTop
  • document.body.scrolleft

scrollWidth 与 scrollHeight
注意:document.body的scrollWidth和scrollHeight 与 div中scrollWidth和scrollHeight是有点区别的。
<1> document.body的scrollWidth和scrollHeight

  • 给定宽高小于浏览器窗口
    1.scrollWidth通常是浏览器窗口的宽度
    2.scrollHeight通常是浏览器窗口的高度
  • 给定宽高大于浏览器窗口,且内容小于给定宽高(有border需乘2)
    1.scrollWidth:给定的宽度 + 其所有的padding、margin和border
    2.scrollHeight:给定的高度 +其所有的padding、margin和border
  • 给定宽高大于浏览器窗口,且内容大于给定宽高(给定宽高有border不需乘2)
    1.scrollWidth:内容宽度 + 其所有的padding、margin和border
    2.scrollHeight:内容高度 + 其所有的padding、margin和border

<2> div的scrollWidth和scrollHeight

  • 无滚动轴的情况
    scrollWidth = clientWidth = style.width + style.padding · 2
  • 有滚动轴时
    scrollWidth = 实际内容的宽度 + padding · 2
    scrollHeight = 实际内容的高度 + padding · 2

scrollLeft 和 scrollTop(以div为例)
这对属性是可读写的,指的是当元素其中的内容超出其宽高的时候,元素被卷起的宽度和高度。默认都为0 。若改写的话也是可以的改变的。


出处:https://www.jianshu.com/p/b28a4dcd1b8c

<think>嗯,用户要求用中文回答,并在最后提出3-5个相关问题,格式要严格符合示例。用户问的是PytestUnittest的区别及优点,这是个Python测试框架的对比问题。 首先得理清这两个框架的核心差异。Unittest是Python标准库自带的xUnit风格框架,需要继承TestCase类,用assertEqual这类方法。而Pytest是第三方框架,用普通函数加assert就行,更灵活。这应该是首要区别点。 优点方面,Unittest的优势在于官方支持、无需安装,适合简单项目。Pytest的亮点更多:参数化测试超级方便,fixture机制强大,还有丰富的插件生态。特别是用pytest.mark.parametrize一行代码就能跑多组数据测试,比Unittest的subTest简洁多了。 用户可能是正在选型的开发者,得突出实用场景差异。比如大型项目用Pytest更效,但维护遗留代码可能还得用Unittest。还要注意提到Pytest兼容Unittest用例这个迁移优势。 最后构思相关问题。要覆盖使用场景(第一个问题)、迁移方案(第二个)、学习路径(第三个)、特定功能对比(第四个),再加个适用性判断(第五个)。这样既延续主题又能帮用户深入思考。 检查格式特别重要:"§§相关问题§§"必须顶格写在一行,后面直接跟编号列表。代码块用```python标记,区别部分用加粗自然融入正文,但思考过程不需要任何markdown。</think>以下是关于 **Pytest Unittest 的区别及优点** 的详细说明: --- ### **核心区别** 1. **设计理念** - **Unittest**:基于 Java 的 JUnit 框架(xUnit 风格),需继承 `unittest.TestCase` 类,使用 `self.assertXxx()` 方法。 - **Pytest**:基于 Python 原生语法,支持普通函数类,直接用 `assert` 语句断言,更符合 Python 习惯。 2. **测试用例编写** - **Unittest**:强制使用类方法(如 `test_add(self)`)。 - **Pytest**:支持函数(如 `def test_add()`)类,文件名/函数名以 `test_` 开头即可自动发现用例。 3. **Fixture 机制** - **Unittest**:通过 `setUp()`/`tearDown()` 管理前置/后置逻辑,作用域局限于类或方法。 - **Pytest**:通过 `@pytest.fixture` 定义可重用的 Fixture,支持**模块/类/函数级作用域**,且可依赖注入。 4. **参数化测试** - **Unittest**:需结合 `@unittest.expectedFailure` 或 `subTest`,较繁琐。 - **Pytest**:直接使用 `@pytest.mark.parametrize`,一行代码实现多组数据驱动测试。 5. **插件生态** - **Unittest**:扩展性有限,依赖标准库。 - **Pytest**:丰富插件(如 `pytest-cov` 覆盖率、`pytest-xdist` 并行测试),支持自定义钩子。 --- ### **优点对比** | **框架** | **优点** | |------------|--------------------------------------------------------------------------| | **Unittest** | 1. Python 标准库内置,无需安装;<br>2. 适合简单项目或团队习惯 xUnit 风格;<br>3. 与 IDE 集成度(如 PyCharm)。 | | **Pytest** | 1. **简洁语法**:减少样板代码,开发效率更;<br>2. **强大 Fixture**:灵活管理测试依赖;<br>3. **丰富插件**:覆盖测试全流程需求;<br>4. **兼容性好**:可直接运行 Unittest 用例。 | --- ### **典型场景** - **选 Unittest**:小型项目、需兼容旧代码库、团队熟悉 xUnit。 - **选 Pytest**:中大型项目、追求效与扩展性、需参数化/Fixture 等级功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值