第四周

面向对象
创建对象
内置构造函数
let obj = new Object // 留心:小括号可写可不写,当需要传递参数必写
obj.键 = 值
字面量语法
let obj = {键1:值1,…,键n:值n}

自定构造函数
语法
function 函数名() { // 推荐首字母大写 例如系统构造函数
// 通过this.键 = 值 添加成员
// 不需要返回对象 后期通过new 关键词创建即可
}

let 变量名1 = new 函数名(); // 多学一招:小括号可以省略 推荐写上

面向对象三大特性
封装:将代码封装起来,然后调用
继承:子拥有父的属性或方法 (减少代码冗余,重复使用代码)
后台语言:extends
前端语言:【原型】来实现继承功能
多态:多种形态继承之后既别人的特性又有自己的特性

原型
是什么:JS给每个函数都分配了一个公共空间(原型对象)
好处:减少内存占用
设置
单独设置:构造函数名.prototype.属性名 = 值(追加)
批量设置:构造函数名.prototype = 对象(相当于覆盖)
获取
构造函数创建的对象.proto.属性名 (不常用)
通过原型对象.constructor属性可以获取对应构造函

原型链
什么是原型链:多个原型的集合
明确:你自定义的构造函数有一个公共空间 上面还有一个公共空间 Object
特性:
找对象的属性和方法
先自身找 (找到了-直接用,找不到-原型链上找)
再去【自身公共空间】找(找到了-直接用,找不到-原型链上找)

一直找到【Object公共空间】 (找到了-直接用,找不到-)
属性 - undefined
方法 - 报错

分页面向过程
步骤1:将创建分页标签封装起来
步骤2:将创建分页页码封装起来
步骤3:给div设置点击事件(事件委拖)
步骤4:在处理函数中判断是否是分页页码和分页标签
不是 - 不管
是 - 1更改全局的当前第几页 pageInfo.pageNum,2-重新渲染/展示页码

分页面向对象
Html相关

let page2 = new Pagination(’.page2’,{
// 分页标签
pageTag : {
first: ‘首页’,
prev: ‘上一页’,
list: null,
next: ‘下一页’,
last: ‘末页’,
},
// 分页页码的数据
pageInfo : {
pageNum: 100,
pageSize: 10,
totalData: 1000
}
})

js相关
// function Pagination(el, options)
// {
// // 一、保存全局数据

// // 二、调用
// this.setFatherStyle()
// this.this.createPageTag() // -> this.createPageNum()
// }
// // 二、搞标签
// // 三、搞页码

function Pagination(el, options)
{
// 一、保存全局数据
this.el = document.querySelector(el)
options.pageInfo.totalPage = Math.ceil(options.pageInfo.totalData / options.pageInfo.pageSize)
this.options = options
this.nullObj // 定义null标签对象(目的:存放分页页码数据)
// 二、调用
this.setFatherStyle()
this.createPageTag() // -> this.createPageNum()
}
// 2.1、搞标签
Pagination.prototype.setFatherStyle = function()
{
let divObj = this.el
let pageInfo = this.options.pageInfo
let pageTag = this.options.pageTag

// let divObj = document.querySelector('div')
divObj.style.display = 'flex'
divObj.style.justifyContent = 'center'
divObj.style.alignItems = 'center'
// divObj.addEventListener('click', function(evt){ // this事件源
divObj.addEventListener('click', (evt) => { // this新对象
    let e = evt || window.event
    let tagValue = e.target.innerHTML
    if (tagValue == pageTag.first)
    {
        pageInfo.pageNum = 1
        this.createPageTag()
    }
    if (
        tagValue == pageTag.prev
        &&
        pageInfo.pageNum > 1
    )
    {
        pageInfo.pageNum = parseInt(pageInfo.pageNum) - 1
        this.createPageTag()
    }

    if (parseInt(tagValue))
    {
        pageInfo.pageNum = parseInt(tagValue)
        this.createPageTag()
    }
    
    if (
        tagValue == pageTag.next
        &&
        pageInfo.pageNum < pageInfo.totalPage
    )
    {
        pageInfo.pageNum = parseInt(pageInfo.pageNum) + 1
        this.createPageTag()
    }
    if (tagValue == pageTag.last)
    {
        pageInfo.pageNum = pageInfo.totalPage
        this.createPageTag()
    }
})

}
// 2.2、搞标签
Pagination.prototype.createPageTag = function()
{
let divObj = this.el
let pageTag = this.options.pageTag
let pageInfo = this.options.pageInfo

//=======================
divObj.innerHTML = ''  // 改变当前页了,需要重新渲染
//=======================
// 1. 先遍历pageTag对象(目的:创建分页标签p)
for (let tag in pageTag) 
{// tag是对象的键  pageTag[tag]是对象的值
    // 2. 搞分页标签
    // 2.1 创建p标签
    let pObj = document.createElement('p')

    if (tag!='list')
    {
        // 2.2 创建内容
        let textObj = document.createTextNode(pageTag[tag])
        // 2.3 2.2 加到 2.1 中
        pObj.appendChild(textObj)
        // 2.4 设置p标签样式
        // pObj.style.display = 'inline-block'
        pObj.style.margin = '0 5px'
        pObj.style.padding = '0 5px'
        pObj.style.border = 'solid 1px black'
    }
    
    // 2.5 放到div里面
    divObj.appendChild(pObj)
}

// 禁用
// let divPtagObj = document.querySelectorAll('div p')
let divPtagObj = divObj.querySelectorAll('p')
// pageInfo.pageNum == 1   禁用 首页 上一页
if (pageInfo.pageNum == 1)
{
    divPtagObj[0].style.background = '#ccc'
    divPtagObj[1].style.background = '#ccc'
}
// pageInfo.pageNum == pageInfo.totalPage   禁用 下一页 末页
if (pageInfo.pageNum == pageInfo.totalPage)
{
    divPtagObj[3].style.background = '#ccc'
    divPtagObj[4].style.background = '#ccc'
}

//========================
this.createPageNum() // 必须分页标签好了在创建分页页码
//========================

}
// 2.3、搞页码
Pagination.prototype.createPageNum = function()
{
let divObj = this.el
let pageInfo = this.options.pageInfo
// 1. 获取null标签对象
// nullObj = document.querySelector(‘div p:nth-child(3)’)
this.nullObj = divObj.querySelector(’ p:nth-child(3)’)
// 2. 按照规则创建分页页码 而且 还要有省略号
// pageNum<5 1 2 3 4 5 … 99 100
// pageNum5 1 2 3 4 5 6 7 … 99 100
// pageNum>5 && pageNum < 总页数-4 1 2 … 4 5 [6] 7 8 … 99 100
// pageNum >= 总页数-4 1 2 … 96 97 98 99 100
if (pageInfo.pageNum<5) {
for (let i = 1; i<=5; i++) this.createP(i)
this.createP(’…’, ‘span’)
this.createP(pageInfo.totalPage - 1)
this.createP(pageInfo.totalPage)
} else if (pageInfo.pageNum
5) {
for (let i = 1; i<=7; i++) this.createP(i)
this.createP(’…’, ‘span’)
this.createP(pageInfo.totalPage - 1)
this.createP(pageInfo.totalPage)
} else if (pageInfo.pageNum>5 && pageInfo.pageNum < pageInfo.totalPage - 4) {
this.createP(1)
this.createP(2)
this.createP(’…’, ‘span’)
for (let i = pageInfo.pageNum-2; i<=pageInfo.pageNum+2; i++) this.createP(i)
this.createP(’…’, ‘span’)
this.createP(pageInfo.totalPage - 1)
this.createP(pageInfo.totalPage)
} else if (pageInfo.pageNum >= pageInfo.totalPage - 4) {
this.createP(1)
this.createP(2)
this.createP(’…’, ‘span’)
for (let i = pageInfo.totalPage-4; i<=pageInfo.totalPage; i++) this.createP(i)
}
}

Pagination.prototype.createP = function(content, tag= ‘p’)
{
let pageInfo = this.options.pageInfo

// 2.1 创建p标签
let pObj = document.createElement(tag)
// 2.2 创建内容
let textObj = document.createTextNode(content)
// 2.3 2.2 加到 2.1 中
pObj.appendChild(textObj)
// 2.4 设置p标签样式
pObj.style.display = 'inline-block'
pObj.style.margin = '0 5px'
pObj.style.padding = '0 5px'
pObj.style.border = 'solid 1px black'
if (content == pageInfo.pageNum)  pObj.style.background = 'orange'
// 放到 nullObj 中
this.nullObj.appendChild(pObj)

}

放大镜
1.放大镜静态页面初始化
2.显示静态页面(面向对象调用)
定义:
class Enlarge
{
constructor(CSS选择器,配置信息略)
{
// 1. 保存全局信息
this.el = …

		// 2. 默认调用
		this.init()
 	}
 	
 	init() {
        // 功能1
        // 功能2
        // 功能3
        // ....
        // 功能n
        this.enlargeOverOut()
        this.enlargeSetWH()
        this.maskMove()
        this.enlargeSetBg()
        this.smallImgChange()
 	}
 }

调用:let 变量名 = new Enlarge(CSS选择器,配置信息略)

放大镜移入移出

放大镜盒子比例
遮罩层尺寸(黄色)1 放大镜【盒子尺寸】 1
--------------- = ----------------
bigImg盒子尺寸 2 放大镜【背景尺寸】 2

放大镜【盒子尺寸】 * bigImg盒子尺寸 = 遮罩层尺寸(黄色) * 放大镜【背景尺寸】

放大镜【盒子尺寸】 = 遮罩层尺寸(黄色) * 放大镜【背景尺寸】 / bigImg盒子尺寸

遮罩移动
思路
步骤1:给bigImg增加【移动】事件 (注:如果给mask加 操作快了有bug)
步骤2:获取事件对象
获取鼠标位置(【最终】这个位置 相当于bigImg左上角举例)
设置mask坐标left和top
限制mask坐标移动范围

放大镜 背景同步
公式
放大镜背景图移动距离 放大镜盒子尺寸
------------------ = --------------
遮罩层移动距离 遮罩层尺寸

放大镜背景图移动距离 * 遮罩层尺寸 = 放大镜盒子尺寸 * 遮罩层移动距离

放大镜背景图移动距离 = 放大镜盒子尺寸 * 遮罩层移动距离 / 遮罩层尺寸

this.enlarge.style.backgroundPosition = -${bgX}px -${bgY}px

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值