前端笔记(十六) | 元素尺寸与位置、时间对象

66 阅读3分钟

(4)元素尺寸与位置

1.获取宽高:

(1)获取元素的自身宽高、包含元素自身设置的宽高、padding、border

(2)offsetWidth和offsetHeight

(3)获取出来的是数值,方便计算

(4)注意: 获取的是可视宽高, 如果盒子是隐藏的,获取的结果是0

2.获取位置:

(1)获取元素距离自己定位父级元素的左、上距离

(2)offsetLeft和offsetTop注意是只读属性

备注:element.getBoundingClientRect( )获取方法返回元素的大小及其相对于视口(可视区)的位置。

案例:仿京东滑动

    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        .content {
            overflow: hidden;
            width: 1000px;
            height: 3000px;
            background-color: pink;
            margin: 0 auto;
        }

        .backtop {
            display: none;
            width: 50px;
            left: 50%;
            margin: 0 0 0 505px;
            position: fixed;
            bottom: 60px;
            z-index: 100;
        }

        .backtop a {
            height: 50px;
            width: 50px;
            background: url(./images/bg2.png) 0 -600px no-repeat;
            opacity: 0.35;
            overflow: hidden;
            display: block;
            text-indent: -999em;
            cursor: pointer;
        }

        .header {
            position: fixed;
            top: -80px;
            left: 0;
            width: 100%;
            height: 80px;
            background-color: purple;
            text-align: center;
            color: #fff;
            line-height: 80px;
            font-size: 30px;
            transition: all .3s;
        }

        .sk {
            width: 300px;
            height: 300px;
            background-color: skyblue;
            margin-top: 500px;
        }
    </style>
    
    <body>
    <div class="header">我是顶部导航栏</div>
    <div class="content">
        <div class="sk">秒杀模块</div>
    </div>
    <div class="backtop">
        <img src="./images/close2.png" alt="">
        <a href="javascript:;"></a>
    </div>
    <script>
        const sk = document.querySelector('.sk')
        const header = document.querySelector('.header')
        // 1. 页面滚动事件
        window.addEventListener('scroll', function () {
            // 当页面滚动到 秒杀模块的时候,就改变 头部的 top值
            // 页面被卷去的头部 >=  秒杀模块的位置 offsetTop
            const n = document.documentElement.scrollTop
            // if (n >= sk.offsetTop) {
            //     header.style.top = 0
            // } else {
            //     header.style.top = '-80px'
            // }
            header.style.top = n >= sk.offsetTop ? 0 : '-80px'
        })
    </script>
</body>
属性作用说明
scrollLeft和scrollTop被卷去的头部和左侧配合页面滚动来用,可读写
clientWidth和clientHeight获得元素宽度和高度不包含border,margin,滚动条用于js获取元素大小,只读属性
offsetWidth和offsetHeight获得元素宽度和高度包含border、padding,滚动条等,只读
offsetLeft和offsetTop获取元素距离自己定位父级元素的左、上距离获取元素位置的时候使用,只读属性

7.日期对象

(1)实例化

需要借助new关键字来创建日期对象。

1. 得到当前时间 :

const date = new Date( )

2. 得到指定时间:

const date = new Date('2022-5-1 08:30:00')

(2)日期对象方法

方法作用说明
getFullYear( )获取年份获取四位年份
getMonth( )获取月份取值为 0 ~ 11(记得加1)
getDate( )获取月份中的每一天不同月份取值也不相同
getDay( )获取星期取值为 0 ~ 6(星期天为0)
getHours( )获取小时取值为 0 ~ 23
getMinutes( )获取分钟取值为 0 ~ 59
getSeconds( )获取秒取值为 0 ~ 59
    // 获得日期对象
    const date = new Date()
    // 使用里面的方法
    console.log(date.getFullYear())
    console.log(date.getMonth() + 1)  // 月份要 + 1
    console.log(date.getDate())
    console.log(date.getDay())  // 星期几

案例:显示格式化时间

<body>
  <div></div>
  <script>
    const div = document.querySelector('div')
    function getMyDate() {
      const date = new Date()
      let h = date.getHours()
      let m = date.getMinutes()
      let s = date.getSeconds()
      h = h < 10 ? '0' + h : h
      m = m < 10 ? '0' + m : m
      s = s < 10 ? '0' + s : s
      return `今天是: ${date.getFullYear()}${date.getMonth() + 1}${date.getDate()}${h}:${m}:${s}`
    }

    div.innerHTML = getMyDate()
    setInterval(function () {
      div.innerHTML = getMyDate()
    }, 1000)
  </script>
</body>

(3)时间戳

定义:时间戳是指1970年01月01日00时00分00秒起至现在的总秒数或毫秒数,它是一种特殊的计量时间的方式。

备注:ECMAScript 中时间戳是以毫秒计的。

算法:

1.将来的时间戳—现在的时间戳=剩余时间毫秒数

2.剩余时间毫秒数转换为剩余时间的年月日时分秒就是倒计时时间

3.1000ms转换就是0小时0分1秒。

三种获取时间戳的方式;

1.getTime( )方法

2.+new Date()

3.Date.now( )

备注:第一种要实例化,其余不用;第三种只能得到当前的时间戳,前面两种可以返回指定时间的时间戳。所以第二种最方便。

    // 1. getTime()
    const date = new Date()
    console.log(date.getTime())
    // 2. +new Date()
    console.log(+new Date())
    //console.log(+new Date('2022-4-1 18:30:00'))
    // 3. Date.now()
    console.log(Date.now());
// 我要根据日期 Day()  0 ~ 6  返回的是 星期一
const arr = ['星期天', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
console.log(arr[new Date().getDay()])

案例:倒计时(含随机更换颜色)

    <style>
        .countdown {
            width: 240px;
            height: 305px;
            text-align: center;
            line-height: 1;
            color: #fff;
            background-color: brown;
            /* background-size: 240px; */
            /* float: left; */
            overflow: hidden;
        }

        .countdown .next {
            font-size: 16px;
            margin: 25px 0 14px;
        }

        .countdown .title {
            font-size: 33px;
        }

        .countdown .tips {
            margin-top: 80px;
            font-size: 23px;
        }

        .countdown small {
            font-size: 17px;
        }

        .countdown .clock {
            width: 142px;
            margin: 18px auto 0;
            overflow: hidden;
        }

        .countdown .clock span,
        .countdown .clock i {
            display: block;
            text-align: center;
            line-height: 34px;
            font-size: 23px;
            float: left;
        }

        .countdown .clock span {
            width: 34px;
            height: 34px;
            border-radius: 2px;
            background-color: #303430;
        }

        .countdown .clock i {
            width: 20px;
            font-style: normal;
        }
    </style>
    
    <body>
    <div class="countdown">
        <p class="next">今天是2222年2月22日</p>
        <p class="title">下班倒计时</p>
        <p class="clock">
            <span id="hour">00</span>
            <i>:</i>
            <span id="minutes">25</span>
            <i>:</i>
            <span id="scond">20</span>
        </p>
        <p class="tips">18:30:00下课</p>
    </div>
    <script>
        // 随机颜色函数
        // 1. 自定义一个随机颜色函数
        function getRandomColor(flag = true) {
            if (flag) {
                // 3. 如果是true 则返回 #ffffff
                let str = '#'
                let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
                // 利用for循环随机抽6次 累加到 str里面
                for (let i = 1; i <= 6; i++) {
                    // 每次要随机从数组里面抽取一个  
                    // random 是数组的索引号 是随机的
                    let random = Math.floor(Math.random() * arr.length)
                    // str = str + arr[random]
                    str += arr[random]
                }
                return str

            } else {
                // 4. 否则是 false 则返回 rgb(255,255,255)
                let r = Math.floor(Math.random() * 256)  // 55
                let g = Math.floor(Math.random() * 256)  // 89
                let b = Math.floor(Math.random() * 256)  // 255
                return `rgb(${r},${g},${b})`
            }

        }

        // 页面刷新随机得到颜色
        const countdown = document.querySelector('.countdown')
        countdown.style.backgroundColor = getRandomColor()
        // 函数封装 getCountTime
        function getCountTime() {
            // 1. 得到当前的时间戳
            const now = +new Date()
            // 2. 得到将来的时间戳
            const last = +new Date('2023-4-29 22:30:00')
            // console.log(now, last)
            // 3. 得到剩余的时间戳 count  记得转换为 秒数
            const count = (last - now) / 1000
            // console.log(count)
            // 4. 转换为时分秒
            // h = parseInt(总秒数 / 60 / 60 % 24)   //   计算小时
            // m = parseInt(总秒数 / 60 % 60);     //   计算分数
            // s = parseInt(总秒数 % 60);   
            // let d = parseInt(count / 60 / 60 / 24)               //   计算当前秒数
            let h = parseInt(count / 60 / 60 % 24)
            h = h < 10 ? '0' + h : h
            let m = parseInt(count / 60 % 60)
            m = m < 10 ? '0' + m : m
            let s = parseInt(count % 60)
            s = s < 10 ? '0' + s : s
            console.log(h, m, s)

            //  5. 把时分秒写到对应的盒子里面
            document.querySelector('#hour').innerHTML = h
            document.querySelector('#minutes').innerHTML = m
            document.querySelector('#scond').innerHTML = s
        }
        // 先调用一次
        getCountTime()

        // 开启定时器
        setInterval(getCountTime, 1000)
    </script>
</body>