JavaScript-----元素偏移量offset

     一.  offset是什么

  1.  offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。
  2.     获得元素距离带有定位父元素的位置
  3.     获得元素自身的大小(宽度高度)
  4.     注意:返回的数值都不带单位

offect系列常用属性:

element.offsetHeight返回任何一个元素的高度包括边框(border)和内边距(padding),但不包含外边距(margin)
element.offsetWidth返回元素的宽度,包括边框(border)和内边距(padding),但不包含外边距(margin)
element.offsetLeft返回当前元素的相对带有定位父元素水平偏移位置的偏移容器
element.offsetParent返回元素的偏移容器   带有定位的父级元素,如果父级都没有定位则返回body
element.offsetTop返回当前元素的相对带有定位父元素垂直偏移位置的偏移容器

可以得到元素的偏移,位置,返回不带单位的数值 

1.element.offsetTop

2.element.offsetLeft

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .father {
            width: 200px;
            height: 200px;
            background-color: pink;
            margin: 100px;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <script>
        let father = document.querySelector('.father');
        console.log(father.offsetTop);
        console.log(father.offsetLeft);

有这样一个例子

只有父元素,这时候我们打印一下父元素的偏移量,都是100,可见是和我们设置的margin是有关的

如果margin改成了200像素,那么元素偏移量也会动态的变成200px

 这个时候我们在父盒子的内部加一个子盒子来看一下它的元素偏移量

        .son {
            width: 100px;
            height: 100px;
            background-color: skyblue;
            margin-left: 45px;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <script>
        let father = document.querySelector('.father');
        let son = document.querySelector('.son');
        //可以得到元素的偏移,位置,返回不带单位的数值
        console.log(son.offsetTop);
        console.log(son.offsetLeft);

 如图所示:顶部偏移量为100,左侧偏移量是145,这个145是父盒子距离左侧偏移量再加上子盒子距离父盒子的左侧偏移量得到的,并没有以父盒子为基准,而是以子盒子为基准的偏移量,那为什么不是45呢,子盒子不是在父盒子中的吗,这个时候要注意:

它以带有定位的父盒子为准,如果没有父盒子或者父盒子没有定位,则以body为准

 我们尝试一下给父盒子加上相对定位

那么就变成了0 和45


 可以得到元素的大小高度和宽度

3.element.offsetHeigh

4.element.offsetWidth

  .one {
            width: 200px;
            height: 200px;
            background-color: blueviolet;
            margin-left: 100px;
        }
    </style>

    <div class="one"></div>
        //可以得到元素的大小高度和宽度
        let one = document.querySelector('.one');
        console.log(one.offsetWidth);
        console.log(one.offsetHeight);

 此时设置的200高度和宽度都是一致的,那么 如果加上padding值呢.padding值会撑大盒子,那么大小会不会发生变化呢?

我们给他加上20px的padding值,左右两侧的padding值加一起再加上宽度就是240,高度同理

 

 padding会撑大盒子,盒子的大小会发生变化,那么再加上border呢,我们尝试一下

 就变成了260px,他加上了border的值,所以我们要注意:

element.offsetHeigh 和 element.offsetWidth  变化的时候是包含padding和border和width/heigth的

他不包含margin哦

5.element.offsetParent

element.offsetParent返回元素的偏移容器   带有定位的父级元素,如果父级都没有定位则返回body

根据刚刚的案例,带有父元素的是son盒子,那么我们来打印一下son

 console.log(son.offsetParent);

父级元素带有相对定位

 父级元素不带有相对定位

 提起返回父级元素,我们之前也学过一个返回父级元素的属性

 console.log(son.parentNode);

 这两个都是返回的父级元素,那他们的区别是什么呢?

  1. son.parentNode ,返回的是最近一级的父级元素,不管父级元素有没有定位
  2. element.offsetParent   带有定位的父级元素,如果父级都没有定位则返回body

### 自定义 `std::map` 比较器的定义与使用 在 C++ 中,`std::map` 默认使用小于运算符 (`<`)比较键。然而,在某些情况下,默认的行为可能不满足需求,这时可以提供自定义比较器来改变这种行为。 #### 使用函数对象作为比较器 可以通过创建个类并重载其调用操作符 (`operator()`) 来实现自定义比较逻辑: ```cpp struct CustomComparator { bool operator()(const int& lhs, const int& rhs) const { return abs(lhs) < abs(rhs); // 自定义比较规则:按绝对值大小排序 } }; ``` 接着可以在声明 `std::map` 时传递该比较器实例给模板参数列表: ```cpp #include <map> #include <cmath> int main() { std::map<int, char, CustomComparator> myMap; myMap[-1] = 'a'; myMap[2] = 'b'; myMap[-3] = 'c'; for (auto&& [key, value] : myMap) { printf("%d -> %c\n", key, value); } return 0; } ``` 这段代码会按照整数的绝对值从小到大排列键值对[^1]。 #### 使用 lambda 表达式简化语法 如果不想额外定义结构体或者类,则可以直接利用lambda表达式来构建匿名函数作为比较器: ```cpp #include <map> int main(){ auto comp = [](int l, int r){return abs(l)<abs(r);} ; std::map<int,char,decltype(comp)> m{{-1,'a'},{2,'b'}, {-3,'c'} ,comp}; for(auto &&p:m){ cout<< p.first <<":"<<p.second<<"\n"; } return 0; } ``` 这里通过指定第三个模板参数为 `decltype(comp)` 并传入具体的 lambda 对象实现了相同的效果。 当涉及到更复杂的类型或需要特定处理的情况下,建议采用显式的函数对象形式以便于维护和理解;而对于简单的场景下,Lambda 表达式则提供了更加简洁的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值