脚本化CSS

我们刚讲过如何获取和设置行内样式的值,但是我们开发不会所有样式都写在行内,同时js没法获取内嵌样式表和外部样式表中的值.

事实上DOM提供了可靠的API,得到计算后的样式。

1. 获取计算样式表

只读,不可写

获取的值是计算后的绝对值,不是相对值

window.getComputedStyle(ele,null).attr IE8以上

ele.currentStyle IE8及其以下

例子:

window.getComputedStyle(ele).attr
// 当然window是可以省略的
getComputedStyle(ele).attr

好用的东西,一定不兼容。所以IE6、7、8不兼容

附加在元素身上的currentStyle属性,它表现和style点语法一样,使用驼峰式访问

例子

oDiv.currentStyle.width

之前讲过,点操作符必须符合标识符的规范,所以使用点操作符获取有连字符的属性要写成驼峰式

getComputedStyle(oDiv).backgroundColor;
oDiv.currentStyle.backgroundColor;

中括号操作符,因为中括号内写字符串,所以不用遵循标识符规范,就可以保留连字符的写法

getComputedStyle(oDiv)['background-color'];
oDiv.currentStyle['background-color'];

颜色值在高级浏览器中是rgb()格式,低级浏览器中就是原样输出。

示例:

封装getStyle(dom,attr)兼容性

实际上,老司机都不这么做。我们不关心你的版本是什么,我只关心你的能力。

function getStyle(ele,attr){
if(window.getComputedStyle){
return getComputedStyle(ele)[attr];
}else{
return ele.currentStyle[attr];
}
} function getStyle(dom,attr){
if(dom.currentStyle){ // IE8 及其一下
return dom.currentStyle[attr]
}else{
return getComputedStyle(dom,null)[attr]
}
}

现在我们要在一个轮子,就是封装一个函数,这个函数接收两个参数,第一个是对象,第二个是属性名。

getStyle(obj,”padding-left”);
getStyle(obj,”paddingLeft”);

这个函数返回的是这个属性值的计算后的样式。更牛逼的是,我们无论用户输入的是驼峰还是非驼峰,都让这个函数鲁棒。

2. 操作元素样式

我们知道前面学过了如果设置样式通过行内style来设置元素样式,

那么我们就可以通过获取计算样式值,然后修改

var oBox = document.getElementById('box');
var wid = parseInt(getStyle(oBox,'width'));
oBox.onclick = function(){
wid += 20;
console.log(wid);
oBox.style.width = wid + 'px';
}

3. 快捷位置和尺寸

DOM已经提供给我们计算后的样式,但是还觉得不方便,所以DOM又提供给我们一些API:

获取元素的显示尺寸(数字类型的值)

ele.offsetWidth width+左右padding+左右border

ele.offsetHeight height+上下padding+上下border

ele.offsetLeft 水平距离 (常用)

ele.offsetTop 竖直距离 (常用)

ele.clientWidth width+左右padding (常用)

ele.clientHeight height+上下padding (常用)

dom.clientLeft 上边框的width (可不记)

dom.clientTop 左边框的width (可不记)

3.1. offsetWidth和offsetHeight

全线兼容,是自己的属性,和别的盒子无关。

一个盒子的offsetWidth值就是自己的 width+左右padding+左右border的宽度(说白就是盒子的大小)

总结一下,全线兼容。

3.2. offsetLeft属性和offsetTop

这两个属性的兼容性非常差,不要着急,我们慢慢来看。

IE9、IE9+、Chrome等高级浏览器:

一个元素的offsetLeft值,就是这个元素左边框外,到自己的offsetParent对象的左边框内的距离

每一个元素,天生都有一个属性,叫做offsetParent

就是自己祖先元素中,离自己最近的已经定位的元素,如果自己的祖先元素中,没有任何盒子进行了定位,那么offsetParent对象就是body。

op.offsetParent;  // 查找离自己最近的定位父级

无论这个盒子自己是否定位,自己的offsetParent就是按照上述方法寻找。

IE6、IE7:

IE6、7的offsetParent对象是谁,和高级浏览器有非常大的不同。

情形1:自己如果没有定位属性,那么自己的offsetParent对象就是自己的祖先元素中离自己最近的有width或者有height的元素:

<div class="box1">
<div class="box2"> → 你好,我有宽度 , offsetParent
<div class="box3"> → 你好,我没有宽高
<p></p> → 你好,我没有定位
</div>
</div>
</div>

情形2:自己如果有定位属性

那么自己的offsetParent就是自己祖先元素中离自己最近的有定位的元素。

<div class="box1">
<div class="box2">
<div class="box3"> → 你好,我没有宽高,有定位 , offsetParent
<p></p> → 你好,我没有定位
</div>
</div>
</div>

数值就是自己的左外边框到offsetParent对象的左内边框的值。

IE8:

IE8的offsetParent是谁呢?和高级浏览器一致:

无论自己是否定位,自己的offsetParent就是自己祖先元素中,离自己最近的已经定位的元素。

这一点,没有任何兼容问题!

兼容性解决办法,不是能力检测,也不是版本检测,而是善用这个属性,要确保属性的使用条件:

这样的话,所有浏览器的值都是一样的,offsetLeft、offsetTop值是number类型的,可以直接参与运算,不需要parseInt()

3.3. clientWidth和clientHeight

clientWidth就是自己的width+padding的值。 也就是说,比offsetWidth少了border。

如果盒子没有高度,用文字撑的,IE6 clientHeight是0,其他浏览器都是数值

以上6个属性要铭记于心,就offsetLeft、offsetTop比较闹腾,但是合理使用,也没兼容问题了

3.4. clientLeft和clientTop

这两个属性没有太大的意义就是上边框和左边看的宽度而已

4. 获取元素的有定位属性的父级

ele.offsetParent

如果没有定位父节点,则返回body

封装getElementPosition函数,获取元素相对于文档的坐标

function getElePos(dom){  // 获取元素相对于文档的坐标
var x = dom.offsetLeft;
var y = dom.offsetTop;
var parent = dom.offsetParent;
while(parent !== null){
x += parent.offsetLeft;
y += parent.offsetTop;
parent = parent.offsetParent;
}
return {
x: x,
y: y
}
}

5. 获取元素的滚动值

5.1 获取滚动元素的宽高

当元素实际内容超过设置的内容时

dom.scrollWidth ==> 元素实际内容的width

dom.scrollHeight ==> 元素实际内容的height

5.2 获取元素的滚动距离(数字类型的值)

dom.scrollLeft 滚动的水平距离

dom.scrollTop 滚动的竖直距离

5.3 滚动距离的兼容写法

  • 获取滚动条的滚动距离 IE8以上

window.pageXOffset 页面滚动的水平距离

window.pageYOffset 页面滚动的竖直距离

  • 获取滚动条的滚动距离 IE8及其以下

document.documentElement.scrollLeft IE7,8

document.documentElement.scrollTop IE7,8

document.body.scrollLeft

document.body.scrollTop

在IE8以上兼容性比较混乱,在使用时两个值相加,因为这两对值不能同时存在

封装getScrollOffset兼容性函数

function getScrollOffset(){
if(window.pageYOffset){
return {
x: window.pageXOffset,
y: window.pageYOffset
}
}else{
return {
x: document.documentElement.scrollLeft + document.body.scrollLeft,
y: document.documentElement.scrollTop + document.body.scrollTop;
}
}
}

6. 获取浏览器窗口的尺寸

IE8以上

window.innerWidth 窗口的宽度(包含滚动条)

window.innerHeight 窗口的高度(包含滚动条)

IE8及其以下

document.documentElement.clientWidth 标准模式下
document.documentElement.clientHeight (在Chrome,Firefox,IE7,IE8不包含滚动条,在IE8以上包含滚动条) document.body.clientWidth 怪异模式下
document.body.clientWidth

检测浏览器是不是在怪异模式下

dowument.compatMode === 'BackCompat'

封装getViewportOffset兼容性函数

function getViewportOffset(){
if(window.innerWidth){
return {
x: window.innerWidth,
y: window.innerHeight
}
}else{
if( document.compatMode === 'BackCompat'){
return {
x: document.body.clientWidth,
y: document.body.clientHeight
}
}else{
return {
x: document.documentElement.clientWidth,
y: document.documentElement.clientHeight
}
}
}
}

7. 设置滚动条的滚动距离

浏览器页面滚动

window.scrollTo(x,y) 让滚动条滚动到指定位置

window.scrollBy(x,y) 让滚动条滚动指定距离

页面元素滚动

ele.scrollTo(x,y)

ele.scrollBy(x,y)

js脚本化css的更多相关文章

  1. 深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法

    × 目录 [1]动态样式 [2]CSS类[3]setAttribute()[4]CSSRule对象添加[5]空样式覆盖[6]CSSRule对象删除 前面的话 我们可以通过计算样式来读取伪元素的样式信息 ...

  2. 深入理解脚本化CSS系列第四篇——脚本化样式表

    × 目录 [1]CSSStyleSheet [2]CSSRule 前面的话 关于脚本化CSS,查询样式时,查询的是计算样式:设置单个样式时,设置的是行间样式:设置多个样式时,设置的是CSS类名.脚本化 ...

  3. 深入理解脚本化CSS系列第三篇——脚本化CSS类

    前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...

  4. 深入理解脚本化CSS系列第一篇——脚本化行内样式

    × 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样 ...

  5. JavaScript权威指南--脚本化CSS

    知识要点 客户端javascript程序员对CSS感兴趣的是因为样式可以通过脚本编程.脚本化css启用了一系列有趣的视觉效果.例如:可以创建动画让文档从右侧“滑入”.创造这些效果的javascript ...

  6. 浅谈脚本化css(二)

    查询计算样式 window上面有一个方法叫做getComputedStyle可以来获取元素的计算样式,也就是css样式.   window.getComputedStyle(ele. null); J ...

  7. 关于脚本化css

    ---恢复内容开始--- 想把自己认为的最重要的,最有用的几块写上,以后会边学边总结完善. 1.首先我们通过JavaScript可以获取到我们想要获取的元素的样式.而这个样式并非单独的哪一个部分的规则 ...

  8. 脚本化CSS(通过JS来间接操作CSS)

    (一)通过.style.形式,获取的是行间样式,可读可写 1.行间样式语法 1 <div style="width:100px;border:5px solid red;height: ...

  9. 浅谈脚本化css(一)

    读写css属性 每一个dom元素都有一个属性style,dom.style里面存放的这个元素的行间样式,我们可以通过这个属性来读写元素的行间样式. 注意: 1.我们碰到float这样的关键字属性的时候 ...

  10. 深入理解脚本化CSS系列第二篇——查询计算样式

    × 目录 [1]getComputedStyle [2]注意事项 [3]currentStyle[4]IE 前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade ...

随机推荐

  1. 几个函数的使用例子:更新VBRK-XBLNR,IB01设备BOM创建,LI11N输入库存盘点

    最近用到一些函数,网上的相关资料不多,这里记录一下. 本文链接:https://www.cnblogs.com/hhelibeb/p/17012303.html 1,使用 RV_INVOICE_HEA ...

  2. SpringBoot3.1.5对应新版本SpringCloud开发(2)-Eureka的负载均衡

    Eureka的负载均衡 负载均衡原理 负载均衡流程 老版本流程介绍 当order-servic发起的请求进入Ribbon后会被LoadBalancerInterceptor负载均衡拦截器拦截,拦截器获 ...

  3. WEB服务与NGINX(11)-NGINX状态页

    nginx状态页 nginx的状态页功能用于输出nginx的基本状态信息,基于ngx_http_stub_status_module模块实现. 默认情况下不生成此模块,应使用--with-http_s ...

  4. 密码学—DES加密的IP置换Python程序

    文章目录 IP初始置换与逆置换 编程想法 转二进制过程中的提取一些数据 64为一组 IP置换 IP逆置换 DES发明人 美国IBM公司W. Tuchman 和 C. Meyer1971-1972年研制 ...

  5. 鸿蒙HarmonyOS实战-Stage模型(UIAbility组件)

    一.UIAbility组件 1.概述 HarmonyOS中的Stage模型是一种基于UIAbility组件的应用程序架构.UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一.它 ...

  6. 4G EPS 中的各种唯一标识

    目录 文章目录 目录 电信运营商的唯一标识:PLMN.MCC 与 MNC 移动用户的唯一标识:IMSI.MSIN 与 MSISDN/MDN 移动用户的唯一临时标识:TMSI.GUTI 与 GUMMEI ...

  7. 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2022):基于异构图GCN和GAT的DTI预测

    (2022.4.16)Briefings-DTI-HETA:基于异构图GCN和GAT的DTI预测 目录 (2022.4.16)Briefings-DTI-HETA:基于异构图GCN和GAT的DTI预测 ...

  8. linux下vim的使用以及高效率的技巧

    目录 一.关于vim编辑器 二.vim编辑器的模式 三.一般模式下的基础操作 四.V模式(列模式)的基础操作 五.命令模式下的基础操作 六.自定义vim环境 七.vim同时打开多个文件 八.比较两个文 ...

  9. 彻底搞懂JavaScript原型和原型链

    基于原型编程 在面向对象的编程语言中,类和对象的关系是铸模和铸件的关系,对象总是从类创建而来,比如Java中,必须先创建类再基于类实例化对象. 而在基于原型编程的思想中,类并不是必须的,对象都是通过克 ...

  10. Vue cli之传递数据

    1.父组件的数据传递给子组件 // 父组件 <Menu title="来自Home的数据" :clickNum="num"></Menu> ...