web前端之实现高度自动过渡功能、变形、grid栅格的特殊单位fr、getBoundingClientRect、offsetHeight

204 篇文章 6 订阅
74 篇文章 0 订阅


方式一、方式二和方式三的公共样式

.btn {
    position: relative;
    border: none;
    outline: none;
    background-color: #409eff;
    color: #ffffff;
    display: inline-block;
    line-height: 1;
    cursor: pointer;
    text-align: center;
    transition: 0.1s;
    font-weight: 500;
    user-select: none;
    padding: 12px 20px;
    font-size: 14px;
    border-radius: 4px;
}

.btn:hover {
    background-color: #66b1ff;
}

.btn:active {
    background-color: #3a8ee6;
}

.btn:disabled {
    background-color: #66b1ff80;
    cursor: not-allowed;
}

.detail {
    position: absolute;
    left: 0;
    top: 100%;
    overflow: hidden;
    padding-top: 0.2em;
}

.content {
    width: 200px;
    border-radius: 5px;
    background-color: #007bff;
    color: #ffffff;
    line-height: 1.5;
    min-height: 0;
}

.inner {
    padding: 20px;
}

方式一

.detail {
    transform-origin: center top;
    transform: scaleY(0);
    transition: 0.5s;
}

.btn:hover .detail {
    transform: scaleY(1);
}

方式二

.detail {
    display: grid;
    grid-template-rows: 0fr;
    transition: grid-template-rows .5s;
}

.btn:hover .detail {
    grid-template-rows: 1fr;
}

方式三(JavaScript)

JavaScript

const btn = document.querySelector('.btn');
const detail = document.querySelector('.detail');

btn.onmouseenter = function () {
    detail.style.height = 'auto';
    const { height } = detail.getBoundingClientRect();
    detail.style.height = 0;
    detail.style.transition = '.3s';
    detail.offsetHeight;
    detail.style.height = height + 'px';
}

btn.onmouseleave = function () {
    detail.style.height = 0;
    detail.style.transition = '.3s';
}

css

.detail {
    height: 0;
}

html

<div class="btn">
    <div>hover me</div>

    <div class="detail">
        <div class="content">
            <div class="inner">
                Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur veniam nihil, repudiandae
                ratione vitae ipsa natus itaque ipsum deserunt consequuntur exercitationem nisi reiciendis debitis
                quam et quibusdam quos magni optio?
            </div>
        </div>
    </div>
</div>

offsetHeight

菜鸟教程

offsetHeight属性是一个只读属性,它返回该元素的像素高度,高度包含内边距(padding)和边框(border),不包含外边距(margin),是一个整数,单位是像素px。
通常,元素的offsetHeight是一种元素CSS高度的衡量标准,包括元素的边框、内边距和元素的水平滚动条(如果存在且渲染的话),不包含:before或:after等伪类元素的高度。

offsetHeight

对于文档的body对象,它包括代替元素的CSS高度线性总含量高。浮动元素的向下延伸内容高度是被忽略的。
如果元素被隐藏(例如:元素或者元素的祖先之一的元素的style.display被设置为none),则返回0。
注意:要了解该属性,可以参阅CSS盒子模型
提示:该属性通常与offsetWidth属性一起使用。
提示: 使用clientHeightclientWidth属性返回元素的可见高度和宽度,仅包括内边距(padding)。
提示:元素添加滚动条,可以使用overflow属性。
这是一个只读属性。

offsetHeight


MDN

HTMLElement.offsetHeight是一个只读属性,它返回该元素的像素高度,高度包含该元素的垂直内边距和边框,且是一个整数。
通常,元素的offsetHeight是一种元素CSS高度的衡量标准,包括元素的边框、内边距和元素的水平滚动条(如果存在且渲染的话),不包含:before或:after等伪类元素的高度。
对于文档的body对象,它包括代替元素的CSS高度线性总含量高。浮动元素的向下延伸内容高度是被忽略的。
如果元素被隐藏(例如 元素或者元素的祖先之一的元素的style.display被设置为none),则返回0
备注:这个属性值会被四舍五入为整数值,如果你需要一个浮点数值,请用element.getBoundingClientRect()


getBoundingClientRect

W3CSHOOL

getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。
getBoundingClientRect()方法返回的是拥有八个属性的DOMRect对象:
1、left
2、top
3、right
4、bottom
5、x
6、y
7、width
8、height
提示:已经完成的滚动也算在内。这意味着每次滚动位置更改时,矩形的边缘(top、left、bottom 以及 right)都会更改其值。


MDN

Element.getBoundingClientRect()方法返回一个DOMRect对象,其提供了元素的大小及其相对于视口的位置。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值