首页 > 编程语言 >记录--谁还没个靠bug才能正常运行的程序

记录--谁还没个靠bug才能正常运行的程序

时间:2023-10-20 18:44:34浏览次数:35  
标签:box 滚动 -- 没个 高度 滚动条 border bug

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

最近遇到一个问题,计算滚动距离,滚动比例达到某界定值时,显示mask,很常见吧^ _ ^

这里讲的不是这个需求的实现,是其中遇到了一个比较有意思的bug,靠这个bug才达到了正确效果,以及这个bug是如何暴露的(很重要)。

下面是演示代码和动图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .container {
            width: 300px;
            max-height: 300px;
            background-color: black;
            position: absolute;
            top: 60px;
            left: 50%;
            transform: translateX(-50%);
            overflow-y: auto;
        }
        .child {
            width: 260px;
            height: 600px;
            margin: 0px 20px;
            background-color: pink;
            position: relative;
        }
        .flag {
            position: absolute;
            width: 100%;
            height: 25px;
            background-color: blueviolet;
            color: aliceblue;
            text-align: center;
            line-height: 25px;
            font-size: 14px;
            left: 0;
            right: 0;
        }
        .top {
            top: 0;
        }
        .bottom {
            bottom: 0px;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="child">
            <div class="flag top">top</div>
            <div class="flag bottom">bottom</div>
        </div>
    </div>
</body>
</html>

开始计算啦,公式:滚动比例 = 滚动距离 / 可滚动距离

滚动距离: $0.scrollTop

可滚动距离: $0.scrollHeight - $0.offsetHeight

即:scrollRatio = scrollTop / (scrollHeight - offsetHeight)

滚动到底部,计算结果是 300 / (600 - 300) = 1

我们需要拿scrollRatio某界定值(比如0.1)作大小的比较,计算是true还是false(用isShow = scrollRatio < 某界定值来保存)。

这里一切正常。


不正常的情况出现了

就是没有出现滚动条的情况,即.child的高度没有超过.container的高度时,把.child的高度设成.containermax-height,就没有滚动条了(下面讲的情景也都是没有滚动条的情况)。

 这个时候再去计算,得到了NaN,以至于 NaN < 0.1 = false

因为isShow的预期就是false,所以一直都没有发现这个bug。


那么它是如何暴露的呢?

后来新的需求给.container加了border。演示一下加border,然后再去计算:

发现没,这时候$0.offsetHeight的高度把border的高度也算进去了,结果就成了true,这不是想要的结果 ❌。


然后就是一番查验

offsetHeight是一个元素的总高度,包括可见内容的高度、内边距(padding)、滚动条的高度(如果存在)以及边框(border)的高度。

而我们这里只需要可见的高度,就可以用到另一个属性了clientHeight

clientHeight是指元素的可见内容区域的高度,不包括滚动条的高度和边框的高度。它仅包括元素的内部空间,即内容加上内边距。

当然这也只是继续使除数为0,然后得到结果为NaN,不过bug已经暴露出来了,后面就是一些其他的优化啦~


总结 + 复习(盒模型 box-sizing)

发现没有,offsetHeightclientHeight的区别,就像盒模型中的标准盒模型怪异盒模型的区别:

box-sizing: content-box(默认,标准盒模型):宽度和高度的计算值都 不包含 内容的边框(border)和内边距(padding)。添加padding和border时, 使整个div的宽高变大。

box-sizing: border-box(怪异盒模型):宽度和高度的计算值都 包含 内容的边框(border)和内边距(padding)。添加padding和border时, 不会 使整个div的宽高变大。

本文转载于:

https://juejin.cn/post/7283087306603823116

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:box,滚动,--,没个,高度,滚动条,border,bug
From: https://www.cnblogs.com/smileZAZ/p/17777798.html

相关文章

  • 小记-忙不应该成为做不好某件事的借口
    我越来越忙了,领导选择把很多重要的事都放在我身上但是我以此为借口,经常偷闲,没有好好为自己的kpi忙碌,很有可能导致年终奖不理想,甚至可能导致职级晋升出问题,以后应分清主次。另,今天在向没给我提供重要资料的技服人员发脾气之后深有感触。工作,大可不必如此伤神动气。在恋爱中,不应......
  • Linux-管道、环境变量、常用命令
    目录管道概念要点与文件重定向的区别环境变量概念查看常用命令查看系统状况权限文件查找用户相关工具管道概念管道的作用类似于文件重定向,可以将前一个命令的stout做为下一个命令的stdin要点管道命令进处理stdout,会忽略stderr管道右边的命令必须能接受stdin多个管道命令可......
  • OPNsense 系列十:liteip 配合 DDNS 实现 IPv6 地址变化电子邮件通知
    liteip介绍基于Python的终端网络信息获取小工具,实现域名、IPv4、IPv6、MAC更新的电子邮件通知。支持Windows7、Windows10、FreeBSD(Linux应该都可以支持),建议搭配DDNS配合使用。Gitee:liteip文件说明liteip_main_debug.py为主要程序,用于实现功能。read_lit......
  • 石油管螺纹刀具,公司参加第十七届中国国际机床展览会(CIMT2021)
    成都工具研究所有限公司的前身是成都工具研究所,于1956年创建于北京,是原机械工业部的直属研究所,是我国机械工业的综合性工具科研机构。公司官网:http://www.ctri.com.cn/公司主要从事精密切削工具、精密测量仪器以及表面改性处理技术的技术研究、产品开发和应用服务。 4月12-17......
  • 汽车零部件加工刀具,“数控刀具协同设计制造与服务关键技术研究及应用示范”召开工作会
    成都工具研究所有限公司的前身是成都工具研究所,于1956年创建于北京,是原机械工业部的直属研究所,是我国机械工业的综合性工具科研机构。公司官网:http://www.ctri.com.cn/公司主要从事精密切削工具、精密测量仪器以及表面改性处理技术的技术研究、产品开发和应用服务。2021年3月17日......
  • 金刚石刀具,爱心一日捐活动
    成都工具研究所有限公司的前身是成都工具研究所,于1956年创建于北京,是原机械工业部的直属研究所,是我国机械工业的综合性工具科研机构。公司官网:http://www.ctri.com.cn/公司主要从事精密切削工具、精密测量仪器以及表面改性处理技术的技术研究、产品开发和应用服务。为响应国机集......
  • 经纬恒润推出全新一代智能电动座椅模块
        随着智能驾驶、智能座舱的广泛应用,人们对于汽车的定位不再局限于代步工具,对于汽车座舱这个私密空间也有了不一样的期待。更安全、更舒适、更智能化的体验将成为未来智能座椅的发展方向,而传统的座椅控制系统已无法满足人们新的需求。    为了进一步满足用户对于......
  • 如何在Linux中实施密码策略(Ubuntu / CentOS)
    尽管Linux被认为是一个安全的操作系统,但其安全性与登录用户的密码强度一样。密码策略的存在是为了确保为用户设置一个强大的密码,作为一个Linux用户,你应该注意执行这些策略,使违规行为难以发生。你肯定不希望用户配置弱密码或容易猜测的密码,这些密码可以在几秒钟内被黑客强行破解。......
  • 6
    1.使用SQL语句ALTERTABLE分别删除studentsdb数据库的student_info表、grade表、curriculum表的主键索引。ALTERTABLEstudent_infoDROPPRIMARYKEY;ALTERTABLEgradeDROPPRIMARYKEY;ALTERTABLEcurriculumDROPPRIMARYKEY;主键已经全部删除2.使用SQL语句为curri......
  • 轴承套圈加工刀具,公司CAD/CAM/NC专题培训班圆满结束
    成都工具研究所有限公司的前身是成都工具研究所,于1956年创建于北京,是原机械工业部的直属研究所,是我国机械工业的综合性工具科研机构。公司官网:http://www.ctri.com.cn/公司主要从事精密切削工具、精密测量仪器以及表面改性处理技术的技术研究、产品开发和应用服务。为适应数控加......