一․描述一下CSS选择器及其优先级规则
CSS选择器是用于指定CSS样式应应用于哪些HTML元素的模式。通过选择器,我们可以定位到特定的元素或元素组,并为它们应用样式。CSS选择器有多种类型,每种类型都有其特定的用途和语法。
以下是几种常见的CSS选择器:
- 元素选择器:根据HTML元素的名称来选择元素。例如,
p
选择器会选择所有的<p>
元素。 - 类选择器:通过HTML元素的class属性来选择元素。类选择器使用点号(.)作为前缀。例如,
.myClass
会选择所有class为"myClass"的元素。 - ID选择器:通过HTML元素的ID属性来选择元素。ID选择器使用井号(#)作为前缀。例如,
#myID
会选择ID为"myID"的元素。 - 属性选择器:根据元素的属性和属性值来选择元素。例如,
[type="text"]
会选择所有type属性为"text"的元素。 - 伪类选择器:用于选择HTML元素的特定状态。例如,
:hover
选择器会选择鼠标悬停在其上的元素。 - 后代选择器(空格):选择特定元素的后代元素。例如,
div p
会选择所有在<div>
元素内部的<p>
元素。 - 子元素选择器(>):选择特定元素的直接子元素。例如,
div > p
会选择所有作为<div>
元素直接子元素的<p>
元素。 - 相邻兄弟选择器(+):选择紧接在另一元素后的元素,且二者有相同父元素。
- 通用兄弟选择器(~):选择某元素后面的所有兄弟元素,且二者有相同父元素。
关于CSS选择器的优先级规则,它主要基于选择器的特定性和源顺序。以下是基本规则:
- 内联样式(在HTML元素内部使用
style
属性)具有最高的优先级。 - ID选择器的优先级高于类和属性选择器。
- 类选择器、属性选择器和伪类选择器的优先级相同。
- 元素选择器和伪元素选择器的优先级最低。
- 当选择器的特定性相同时,最后出现的规则会覆盖先前的规则(源顺序)。
- 使用
!important
声明可以覆盖任何先前的规则,但应尽量避免使用,因为它会使样式表更难维护和理解。
特定性是通过给每个选择器分配一个权重来计算的,这个权重基于选择器的类型和数量。例如,ID选择器的权重高于类选择器,类选择器的权重高于元素选择器。当比较两个选择器的优先级时,会计算它们的特定性权重,权重更高的选择器将优先应用。
二․解释JavaScript中的闭包是什么,并给出一个例子。
在JavaScript中,闭包(Closure)是一个非常重要的概念。简单来说,闭包就是一个函数能够访问和操作函数外部的词法环境(lexical environment)的能力。这意味着一个函数内部定义的函数(称为内嵌函数)可以访问其父级函数的变量,甚至在父级函数执行完毕后,这些变量依然可以被内嵌函数访问。这是因为闭包可以维持一个到其外部作用域的引用。
下面是一个简单的闭包示例:
javascript复制代码
function outerFunction(outerVariable) { |
|
return function innerFunction(innerVariable) { |
|
console.log('outerVariable:', outerVariable); |
|
console.log('innerVariable:', innerVariable); |
|
} |
|
} |
|
const myInnerFunction = outerFunction('Hello'); |
|
myInnerFunction('World'); // 输出: outerVariable: Hello, innerVariable: World |
在这个例子中,outerFunction
是一个外部函数,它接受一个参数 outerVariable
,并返回一个内部函数 innerFunction
。innerFunction
接受一个参数 innerVariable
,并打印出 outerVariable
和 innerVariable
的值。
当我们调用 outerFunction('Hello')
时,它返回了 innerFunction
,并且这个返回的 innerFunction
仍然可以访问到 outerVariable
(即使 outerFunction
已经执行完毕)。这是因为 innerFunction
形成了一个闭包,它保持了对 outerFunction
的词法环境的引用,包括 outerVariable
。
然后,我们将返回的 innerFunction
赋值给 myInnerFunction
,并调用它,传入参数 'World'
。此时,myInnerFunction
(即 innerFunction
)仍然可以访问到 outerVariable
的值 'Hello'
,并打印出来。这就是闭包的作用。