龙空技术网

前端系列——CSS方法封装

多才森森影视 157

前言:

而今兄弟们对“css怎么封装”大致比较注意,朋友们都需要剖析一些“css怎么封装”的相关文章。那么小编同时在网摘上汇集了一些关于“css怎么封装””的相关文章,希望兄弟们能喜欢,各位老铁们快快来学习一下吧!

1、封装一个公共方法库

let utils = (function () {

//=>获取元素的样式

let getCss = function (curEle, attr) {

if (typeof window.getComputedStyle === 'undefined') {

return;

}

let val = window.getComputedStyle(curEle, null)[attr],

reg = /^-?\d+(\.\d+)?(px|rem|em|pt)?$/i;

reg.test(val) ? val = parseFloat(val) : null;

return val;

};

//=>设置元素样式

let setCss = function (curEle, attr, value) {

if (attr === 'opacity') {

curEle.style.opacity = value;

curEle.style.filter = `alpha(opacity=${value * 100})`;

return;

}

if (!isNaN(value)) {

let reg = /^(width|height|fontSize|((margin|padding)?(top|left|right|bottom)?))$/i;

reg.test(attr) ? value += 'px' : null;

}

curEle['style'][attr] = value;

};

//=>批量设置元素样式

let setGroupCss = function (curEle, options = {}) {

for (let attr in options) {

if (!options.hasOwnProperty(attr)) break;

setCss(curEle, attr, options[attr]);

}

};

//=>CSS操作汇总

let css = function (...arg) {

let len = arg.length,

fn = getCss;

len >= 3 ? fn = setCss : null;

len === 2 && (arg[1] instanceof Object) ? fn = setGroupCss : null;

return fn(...arg);

};

//=>offset:获取当前元素距离BODY的偏移(左偏移和上偏移)

let offset = function (curEle) {

//1.先获取当前元素本身的左/上偏移

let curLeft = curEle.offsetLeft,

curTop = curEle.offsetTop,

p = curEle.offsetParent;

//2.累加父参照物的边框和偏移(一直向上找,找到BODY为止,每当找到一个父参照物都把它的边框和偏移累加起来,根据元素不一样,具体找几次也不知道)

//TAG-NAME获取当前元素的标签名(大写的)

while (p.tagName !== 'BODY') {//=>当找到的父参照物是BODY结束查找和累加操作

//3.把找到的父参照物的边框和偏移值累加起来

curLeft += p.clientLeft;

curLeft += p.offsetLeft;

curTop += p.clientTop;

curTop += p.offsetTop;

p = p.offsetParent;//=>基于当前找到的父参照物继续向上查找

}

return {

top: curTop,

left: curLeft

};

};

//=>操作浏览器盒子模型属性的

let winHandle = function (attr, value) {

if (typeof value !== 'undefined') {

//=>设置盒子模型属性值:SCROLL-TOP/LEFT

document.documentElement[attr] = value;

document.body[attr] = value;

return;

}

return document.documentElement[attr] || document.body[attr];

};

return {

css, //=>在ES6中直接这样写相当于 css:css

offset,

winHandle

}

})();

2、FOR-IN循环

=>遍历一个对象中的键值对的,有多少组键值对,我们就遍历多少次。

let obj = {name: 'xxx', age: 27, 0: 0, sex: 0, score: 100, 1: 1};

for (let key in obj) {

// console.log(key);//=>KEY存储的是每一次循环获取的属性名

// console.log(obj[key]);//=>每一次循环基于KEY获取属性值

// if(key==='age'){

// break; 也支持BREAK和CONTINUE等关键词

// }

// console.log(key);

}

注意:FOR-IN遍历的时候有自己的顺序:先遍历数字属性名(按照小->大),再遍历字符串属性名(按照书写顺序):

for (let attr in obj) {

console.log(attr);//=>0 1 name age sex score

}

//=>obj.__proto__===Object.prototype : obj是Object这个类的一个实例

//=>大括号中的是OBJ的私有属性,Object.prototype上的是OBJ公有属性

Object.prototype.bbbb = 1000;

for (let key in obj) {

//=>FOR-IN循环只遍历当前对象可枚举(可遍历)的属性

//1.对象的私有属性(自己写的)是可枚举的

//2.浏览器内置的属性一般都是不可枚举的

//3.自己在类的原型上设置的属性也是可枚举的,FOR-IN循环的时候也会被遍历出来(一般情况下我们是不想遍历到原型上的公有属性的)

if (obj.hasOwnProperty(key)) {//=>一般使用FOR-IN在遍历对象的时候,我们加一个私有属性的验证,只有是私有的属性,我们才做操作

console.log(key);

}

}

3、JS盒子模型的其他几个属性

offsetParent:当前盒子的父级参照物

offsetTop / offsetLeft:获取当前盒子距离其父级参照物的偏移量(上偏移/左偏移) 当前盒子的外边框开始~父级参照物的内边框。

“参照物”:同一个平面中,元素的父级参照物和结构没有必然联系,默认他们的父级参照物都是BODY(当前平面最外层的盒子) BODY的父级参照物是NULL。

center.offsetParent //=>BODY

inner.offsetParent //=>BODY

outer.offsetParent //=>BODY

“参照物可以改变”:构建出不同的平面即可(使用zIndex,但是这个属性只对定位有作用),所以改变元素的定位(position:relative/absolute/fixed)可以改变其父级参照物。

// utils.css(outer, {

// position: 'relative' //=>把OUTER脱离原有的平面,独立出一个新的平面,后代元素的父级参照物都会以它为参考

// });

console.log(center.offsetParent);//=>OUTER

console.log(inner.offsetParent);//=>OUTER

console.log(outer.offsetParent);//=>BODY

utils.css(inner, {position: 'absolute'});

console.log(center.offsetParent);//=>INNER

console.log(inner.offsetParent);//=>OUTER

console.log(outer.offsetParent);//=>BODY

console.log(document.body.offsetParent);//=>NULL

scrollTop / scrollLeft:滚动条卷去的宽度或者高度

最小卷去值:0

最大卷去值:真实页面的高度 - 一屏幕的高度 document.documentElement.scrollHeight-document.documentElement.clientHeight

在JS盒子模型13个属性中,只有scrollTop/scrollLeft是“可读写”属性,其余都是“只读”属性。

操作浏览器的盒子模型属性,我们一般都要写两套,用来兼容各种模式下的浏览器。

console.log(utils.winHandle('scrollTop'));

标签: #css怎么封装