分类目录归档:前端技术

DOM- 网页特效

1. 滚动事件和加载事件

1. 滚动事件scroll

  1. 当页面进行滚动时触发的事件

  2. 很多网页需要检测用户把页面滚动到某个区域后做一些处理, 比如固定导航栏,比如返回顶部

  3. 监听整个页面滚动给 window 或 document 加

  4. 监听某个元素的内部滚动直接给某个元素加即可

// 监听整个页面滚动
// 1. 滚动事件 监听整个页面滚动 固定导航/返回顶部
window.addEventListener('scroll', function () {
console.log(1)
})
let num1 = document.querySelector('.box')
num1.addEventListener('scroll', function () {
console.log(2)
})

2. 加载事件load

  1. 加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件

  2. 有些时候需要等页面资源全部处理完了做一些事情

  3. 老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到

  4. 注意:不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件

监听页面所有资源加载完毕:

// 监听整个页面资源给 window 加
// 2. 加载事件 监听页面资源加载完毕才执行load事件
// 也可以针对别的资源绑定load事件
// 把js写在head上面 导致dom元素找不到 用load事件
let n1 = document.querySelector('.box')
window.addEventListener('load', function () {
    console.log(11)
})
​

3. 加载事件DOMContentLoaded

  1. 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表 、图像等完全加载

监听页面DOM加载完毕:

// 给 document 添加 DOMContentLoaded 事件
// 2. 加载事件 等HTML文档加载完后再加载 无需等样式 图片就可以加载
document.addEventListener('DOMContentLoaded', function () {
    console.log(3)
})
​

2. scroll家族

  1. 我们想要页面滚动一段距离,比如100px,就让某些元素显示隐藏, 就可以使用scroll 来检测页面滚动的距离~

  2. 获取宽高: 获取元素的内容总宽高(不包含滚动条)返回值不带单位

  3. scrollWidth和scrollHeight

获取位置:

  1. 获取元素内容往左、往上滚出去看不到的距离

  2. scrollLeft和scrollTop

  3. 这两个属性是可以修改的

// 1. scroll家族 (了解)
let num1 = document.querySelector('.box')
// 当前宽度 不包含滚动条
console.log(num1.scrollWidth)
// 内容高度
console.log(num1.scrollHeight)
​
// 2. 被卷去的头部和左侧
num1.addEventListener('scroll', function () {
    console.log(this.scrollTop)
})
​
开发中,我们经常检测页面滚动的距离,比如页面滚动100像素,就可以显示一个元素,或者固定一个元素
  1. document.documentElement HTML 文档返回对象为HTML元素

// 3. 检测页面滚动的距离
window.addEventListener('scroll', function () {
    // 返回HTML元素距离
    console.log(document.documentElement.scrollTop)
    // 可以给值/修改 但不要带单位
    document.documentElement.scrollTop = 200
})
​
  1. 被卷去的头部或者左侧用那个属性?是否可以读取和修改?

  1. 可以读取,也可以修改(赋值)

页面滚动显示返回顶部按钮
//需求:当页面滚动500像素,就显示返回顶部按钮,否则隐藏, 同时点击按钮,则返回顶部
//①:用到页面滚动事件
//②:检测页面滚动大于等于100像素,则显示按钮
//③:点击按钮,则让页面的scrollTop 重置为 0
<div class="content"></div>
<div class="backtop">
    <img src="./images/close2.png" alt="">
    <a href="javascript:;"></a>
</div>
let btn = document.querySelector('.backtop')
// 1. 页面滚动事件
window.addEventListener('scroll', function () {
    // 2. 页面检测滚动距离
    let num1 = document.documentElement.scrollTop
    // 3. 判断显示隐藏
    // 如果大于200 就显示 小于隐藏
    if (num1 >= 200) {
        btn.style.display = 'block'
    } else {
        btn.style.display = 'none'
    }
})
​
// 4. 点击链接返回顶部
btn.children[1].addEventListener('click', function () {
    document.documentElement.scrollTop = 0
})
​

3. offset家族

  1. 使用场景: 前面案例滚动多少距离,都是我们自己算的,最好是页面 滚动到某个元素,就可以做某些事

  2. 简单说,就是通过js的方式,得到元素在页面中的位置 这样我们可以做,页面滚动到这个位置,就可以返回 顶部的小盒子显示…

获取宽高:
  1. 获取元素的自身宽高、包含元素自身设置的宽高、padding、border, offsetWidth和offsetHeight

// 1. offset家族 宽高 (了解)
let num1 = document.querySelector('.box')
// 盒子大小 = 盒子本身宽高 + padding + border
// 盒子多大 offset就多大
console.log(num1.offsetWidth)
console.log(num1.offsetHeight)
​
获取位置:
  1. 获取元素距离自己定位父级元素的左、上距离

  2. offsetLeft和offsetTop 注意是只读属性

// 2. 位置以带定位的父级 如果没有就以左上角为准
console.log(num1.offsetTop)
console.log(num1.offsetLeft)
​
仿京东固定导航栏案例
//当页面滚动到秒杀模块,导航栏自动滑入,否则滑出
//①:用到页面滚动事件
//②:检测页面滚动大于等于 秒杀模块的位置 则滑入,否则滑出
<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>
let box = document.querySelector('.sk')
let head = document.querySelector('.header')
// 1.页面滚动事件
window.addEventListener('scroll', function () {
// 2.检测页面滚动距离 >= 秒杀模块的offsetTop 则划入
    if (document.documentElement.scrollTop >= box.offsetTop) {
// 3.如果大于则显示 小于则-80px
        head.style.top = '0px'
    } else {
        head.style.top = '-80px'
    }
})
</script>
电梯导航案例
<!--需求:点击可以页面调到指定效果
①:点击当前 小导航,当前添加active,其余移除active
②:得到对应 内容 的 offsetTop值
③:让页面的 scrollTop 走到 对应 内容 的 offsetTop-->
<div class="aside">
    <div class="item active">男装/女装</div>
    <div class="item">儿童服装/游乐园</div>
    <div class="item">电子产品</div>
    <div class="item">电影/美食</div>
</div>
<div class="content">
    <div class="neirong content1">男装/女装</div>
    <div class="neirong content2">儿童服装/游乐园</div>
    <div class="neirong content3">电子产品</div>
    <div class="neirong content4">电影/美食</div>
</div>
<script>
let btn = document.querySelectorAll('.item')
let btn1 = document.querySelectorAll('.neirong')
// 1. 点击谁谁添加类
for (let num1 = 0; num1 < btn.length; num1++) {
    btn[num1].addEventListener('click', function () {
        document.querySelector('.aside .active').classList.remove('active')
        this.classList.add('active')
        // 2. 右侧内容跟随走动
        // 让页面滚动对应offsettop值位置
        document.documentElement.scrollTop = btn1[num1].offsetTop
    })
}
</script>

4. client家族

  1. 获取宽高:获取元素的可见部分宽高(不包含边框,滚动条等), clientWidth和clientHeight

  2. 获取位置: 获取左边框和上边框宽度, clientLeft和clientTop 注意是只读属性

let num1 = document.querySelector('.box')
// 可见区域的宽高 不包含滚动条 边框...
console.log(num1.clientWidth)
console.log(num1.clientHeight)
// 3. client TOP/Left (了解) 就是边框的宽高
console.log(num1.clientTop)
console.log(num1.clientLeft)
​
会在窗口尺寸改变的时候触发事件:resize
// 2. resize事件 当窗口变化时触发的事件
window.addEventListener('resize', function () {
    // 检测屏幕宽度
    console.log(document.documentElement.clientWidth)
    // 检测页面的宽度不同而改变颜色
    let num2 = document.documentElement.clientWidth
    if (num2 >= 1000) {
        document.body.style.backgroundColor = 'skyblue'
    } else if (num2 >= 850) {
        document.body.style.backgroundColor = 'pink'
    } else {
        document.body.style.backgroundColor = 'green'
    }
})
​

5. 三大家族的区别

offset家族

  1. 获取元素自身大小:包括自身设置的宽高、padding、border

  1. 获取元素距离定位父级的左和上距离 只读属性

scroll家族

  1. 获取元素内容的总大小

  1. 获取元素向左向上滚出去看不见的距离 可读写属性

client家族

  1. 获取元素可见区域的大小

  1. 获取元素左、上边框距离 只读属性 

6. 轮播图案例

需求①:小图标鼠标经过事件

需求② :大图片跟随变化

需求③:右侧按钮播放效果

需求④:解决一个BUG

需求⑤:左侧按钮播放效果

需求⑥: 因为左侧按钮和右侧按钮里面有大量相同的操作,可以抽取封装一个函数 common

需求⑦:开启定时器需求

需求⑧: 鼠标经过停止定时器 (清除定时器) 鼠标离开开启定时器 (开启定时器) 

<div class="main">
    <div class="slides">
        <ul>
            <li class="active"><a href="#"><img src="./images/b_01.jpg" alt="第1张图的描述信息"></a></li>
            <li><a href="#"><img src="./images/b_02.jpg" alt="第2张图的描述信息"></a></li>
        </ul>
        <div class="extra">
            <h3>第1张图的描述信息</h3>
            <a class="prev" href="javascript:;"></a>
            <a class="next" href="javascript:;"></a>
        </div>
    </div>
    <div class="indicator">
        <ul>
            <li class="active">
                <img src="images/s_01.jpg">
                <span class="mask"></span>
                <span class="border"></span>
            </li>
            <li>
                <img src="images/s_02.jpg">
                <span class="mask"></span>
                <span class="border"></span>
            </li>
        </ul>
    </div>
</div>
let xl = document.querySelectorAll('.indicator li')
let dl = document.querySelectorAll('.slides ul li')
let text = document.querySelector('.extra h3')
let btn = document.querySelector('.next')
let btn1 = document.querySelector('.prev')
let main = document.querySelector('.main')
for (let num1 = 0; num1 < xl.length; num1++) {
    // 1.鼠标经过小图片变高亮
    xl[num1].addEventListener('mouseenter', function () {
        document.querySelector('.indicator .active').classList.remove('active')
        this.classList.add('active')
    // 2. 鼠标经过当前小图片后大图片变化
    // 利用opacity实现淡入淡出效果
        document.querySelector('.slides .active').classList.remove('active')
        dl[num1].classList.add('active')
    // 3. 鼠标经过图片 文字改变
        text.innerHTML = `第${num1 + 1}张图的描述信息`
​
    // 6. 解决Bug 如果鼠标经过后 再次点击播放会乱序
    // 让index重新赋值为 当前鼠标经过索引号
        index = num1
    })
}
​
// 4. 右侧按钮点击事件
// 全局变化量变量 不断自增 控制器/给左右按钮同时使用
let index = 0
btn.addEventListener('click', function () {
    index++  // 变量点击后自增
​
    // 1. 解决点击最后一张后报错 等于10之后index为0
    if (index == 10) {
        index = 0
    }
    // 2. // 10 10 余 0
    // index = index % 10 
    fn()
})
​
// 5.左侧按钮点击事件
btn1.addEventListener('click', function () {
    index--
    if (index < 0) {
        index = 9
    }
    // 10 + -1 = 9 % 10 余 1
    // index = (10 + index) % xl.length
    fn()
})
​
// 6. 因为左右按钮有大量相同代码 可以封装成函数 然后调用
function fn() {
    // 选出 index 大/小图片 排它思想
    document.querySelector('.indicator .active').classList.remove('active')
    xl[index].classList.add('active')
    document.querySelector('.slides .active').classList.remove('active')
    dl[index].classList.add('active')
    text.innerHTML = `第${index + 1}张图的描述信息`
}
​
// 7. 开启轮播定时器
let timer = setInterval(function () {
// 自动调用右侧按钮点击事件
    btn.click()
}, 800)
​
// 如果不清除 点击哪个就不会停止
// 8.鼠标经过清除定时器
main.addEventListener('mouseenter', function () {
    clearInterval(timer)
})
​
// 9. 鼠标经过开启定时器
main.addEventListener('mouseleave', function () {
// 直接再开启一个定时器 不要重新赋值了
    timer = setInterval(function () {
        btn.click()
    }, 800)
})
​

 

关于浏览器市场份额的那点事儿

以前关于浏览器市场份额总是去找百度——百度统计,最近发现找不着了~ 也许,百度不做这方面的统计了~反正没找着。不过,还好有Statcounter。记录一下……

关于 Statcounter GlobalStats

https://gs.statcounter.com/

Statcounter Global Stats 由Statcounter - 免费的在线访客统计工具提供给您。

数据样本

统计数据基于 Statcounter 收集的汇总数据,该样本每月从超过 150 万个网站的 Statcounter 网络中收集超过 50 亿次网页浏览量。统计数据每天都会更新并提供,但在发布后的 45 天内必须接受质量保证测试和修订。

Markdown笔记

如果你是有一个佛(lan)系(duo)的心,但又很文(zhuang)艺(suan)的程序员,并且你对其他Markdown编辑器的使用效果感觉不是很好的话,就用Typora吧……

整理了一下学习笔记~先这二个吧~有空再写~

1.first day 2.The third day

 

 

中国首届React开发者大会大咖们的演讲~

中国首届React开发者大会于2018年08月18日在广州举办。由w3ctech、前端圈主办。本次大会我们将邀请行业内知名讲师,与大家共聚广州,畅聊React。

kejun

克军
前端布道者、阿里云CSFE前端团队负责人

演讲者:克军
如何把业务逻辑这个故事讲好 – 有限状态机与React开发

开发如同拍电影,组件、框架、工具如同演员和道具,工程师就是导演,其中指导拍摄的是什么呢,演员如何出场,如何演绎喜怒哀乐,场景如何切换等等。对,是剧本。开发中什么是剧本,是PRD还是设计稿,其实都不贴切。开发中的剧本就是一个产品的业务逻辑。如何清晰准确的表达,并成为代码的一部分,或许会成为新一代的开发模式。这就是状态机在前端开发中可以发挥的作用。

Vladimir Grinenko
Yandex JavaScript developer, more than 12 years experience.

vladimir

Vitaly Harisov
Yandex JavaScript developer, more than 12 years experience.

vitaly-yandex

Vitaly Harisov
Yandex JavaScript developer, more than 12 years experience.

演讲者:Vladimir Grinenko && Vitaly Harisov
React组件开发精髓

让我们来看一看如何使 React 组件开发更具有表达性。
你将学会如何不依靠 if 语句来修改组件的行为,就像我们在 CSS 里做的那样。
你将学习到如何:
创建灵活的且拥有不同配置(甚至是不同标签)的组件,它们可以被随机组合成不同的实例(instance)
做低成本的 AB-测试 和实验
将组件转换为跨环境/平台的可复用代码

演讲者:工业聚
Functional programing in React

主要讲解 React 里的函数式编程,包含高阶组件,Functional setState,Render props,以及 Algebraic effects 和 RxJS 在 React 里的应用。
待定
演讲者:蔡斯杰
一种数据契约驱动的 React + Redux 编程方式

React + Redux 的思想是数据驱动和函数式,分享一种在特定场景下,基于数据契约的抽象方式。包括如何制定契约,如何实现 Model,划分和定义组件,如何应对变化,最后达到系统的高复用和灵活性。
待定
演讲者:郭远飞
蚂蚁金融业务的React实践

将根据原技术栈遇到的问题和挑战,以及React优势分析和大家谈谈为什么从Zepto切换到React?
通过解决React资源加载问题、React静态资源离线、引入Preact降级、业务数据状态管理和antd-mobile等方面分享React在业务研发中的最佳实践
除此之外,还将给大家分享目前React在蚂蚁集团业务的现状,以及后续在React层面(如数据化、基于JSX的多渠道部署等)的规划
待定
演讲者:黄琼
从React渲染原理看性能优化

相信很多人都用过 React ,那么大家是否遇到过海量 DOM render 卡顿的问题?
React 16 对渲染机制做了大改动,很大的提升了交互体验,背后的原理又是什么?
实践出真知,本次分享深入挖掘 React 的渲染机制,同时结合实例来解决实践中遇到的性能问题,从而写出高性能的 React 应用。
待定
演讲者:题叶
Virtual DOM 方案几个有意思的探索

Virtual DOM 是 React 核心的功能。基于 Virtual DOM 还能设计一些有意思的方案,这个分享会介绍基于 Virtual DOM 的想法在服务端等场景的一些探索。项目的代码用了 ClojureScript,会有一些来自函数式编程的思考。