CSS属性简写和选择器的优先级问题

   2015-12-06 0
核心提示:这篇文章主要介绍了CSS属性简写和选择器的优先级问题,是CSS入门学习中的基础知识,需要的朋友可以参考下

几个常用 CSS 属性的简短写法

精简 CSS 代码有很多种方法,但其中最常用的方法可能就是使用属性的简短形式。

具有简短写法的 CSS 属性很多,但是常用的属性无外乎字体、列表、背景、边框、透明等几种,所以在此对这几种属性的简短写法做个归纳,备忘。
font 属性

font 属性涉及到字体、字号、行高等好几个属性,使用简短写法的时候可以节省好多代码量。虽然并非所有属性都要定义,但是一般来说 font-size 和 font-family 是必不可少的,以下是 font 的几个属性与其对应的默认值:

CSS Code复制内容到剪贴板
  1. /* font 各属性与默认值 */  
  2. font-variantnormal;   
  3. line-heightnormal;   
  4. font-family: varies;   
  5. font-weightnormal;   
  6. font-stylenormal;   
  7. font-sizemedium;  

以上 6 个属性可以合并成一行,根据 W3C 规范,各属性前后排列顺序依次为:

CSS Code复制内容到剪贴板
  1. /* 字体各属性前后顺序 */  
  2. font: [font-style] [font-variant] [font-weight] [font-size]/[line-height] [font-family];  

再看以下几个示例:

CSS Code复制内容到剪贴板
  1. font14px Georgia, serif;   
  2. font14px/1.4 Georgia, serif;   
  3. fontitalic lighter 14px/1.4 Georgia, serif;   
  4. fontitalic small-caps lighter 14px/1.4 Georgia, serif;  

可以看到,一行代码就可以代替一段代码,而且看起来还更优雅一些,就是单独查找某个属性的时候有点不太方便,看着眼花。
list 属性

list 有三个属性,这三个属性分别定义:type、image 和 position,它们的属性名和默认值分别如下:

CSS Code复制内容到剪贴板
  1. list-style-typedisc;   
  2. list-style-imagenone;   
  3. list-style-positionoutside;  

list 只有三个属性,并不复杂,但是我们仍然可以将这三个属性合并为在一行中,根据 W3C 规范,写法如下:

CSS Code复制内容到剪贴板
  1. /* list 属性简短写法 */  
  2. list-style: [list-style-type] [list-style-position] [list-style-image];   
  3.   
  4. /* 示例 */  
  5. list-stylenone;   
  6. list-styledisc;   
  7. list-styledisc outside;   
  8. list-styledisc outside url(bg.png);  

一如既往的简单,基本上就是简写了 list 属性的名称,然后按顺序排列一下属性的值即可。
background 属性

很多样式表中都会多次定义 background 属性,每次都要重复其 5 个属性的话,那代码量可会成倍的增加呢。下面是其 5 个属性名及其默认值:

CSS Code复制内容到剪贴板
  1. /* background 的各属性及其默认值 */  
  2. background-attachmentscroll;   
  3. background-colortransparent;   
  4. background-positiontop left;   
  5. background-repeatrepeat;   
  6. background-imagenone;  

根据 W3C 规范,将其 5 个属性合并起来的写法如下:

CSS Code复制内容到剪贴板
  1. /* background 属性简短写法 */  
  2. background: [background-color] [background-image] [background-repeat] [background-attachment] [background-position];   
  3.   
  4. /* 示例 */  
  5. background#777;   
  6. backgroundurl(images/bg.png) 0 0;   
  7. background#777 url(images/bg.png) repeat-x 0 0;   
  8. background#777 url(images/bg.png) repeat-x fixed 0 0;  

对于 background 简短写法而言,不同的标签的使用方法和效果都有一些细微差别,欲知详情者,请至官方文档查看。
border 属性

border 属性更为简单,它 3 个属性以及默认值如下:

CSS Code复制内容到剪贴板
  1. /* border 各属性及其默认值 */  
  2. border-widthnone;   
  3. border-stylenone;   
  4. border-colornone;  

根据 W3C 规范,其简短写法如下:

CSS Code复制内容到剪贴板
  1. /* border 属性简短写法 */  
  2. border: [border-width] [border-style] [border-color];   
  3.   
  4. /* 示例 */  
  5. border1px solid #111;   
  6. border2px dotted #222;   
  7. border3px dashed #333;  

当然也可以为 4 个边框定义不同的样式:

CSS Code复制内容到剪贴板
  1. border-bottom1px solid #777;   
  2. border-right:  2px solid #111;   
  3. border-left:   2px solid #111;   
  4. border-top:    1px solid #777;  


CSS 选择器的优先级问题

CSS 意为层叠样式表。所谓层叠,就是说,可以用多个 CSS 声明来作用于同一元素,例如用一段 CSS 来定义文字的颜色,用另外一段 CSS 来定义文字的大小,最终达到样式叠加的效果。

这种特性一定程度上使 CSS 可以更为方便的定义样式,但同时也带来了一定的复杂性。例如,当多个样式作用于同一个元素,而且还是作用于同一个属性,元素最终会以何种方式来呈现样式呢?

参考下面这个例子:

CSS Code复制内容到剪贴板
  1. p {   
  2.  colorblack;   
  3.  background-colorwhite;   
  4. }   
  5. div.warning p {   
  6.  colorred;   
  7. }   
  8. div#caution p {   
  9.  coloryellow;   
  10. }   
  11. body#home div p {   
  12.  colorwhite;   
  13. }  

此样式表中有 4 组选择器,且最终都指向 p 元素,并且每组样式中都有 color 属性。这样一来,可能的情况就是会有多个颜色属性,被施加于同一个 p 元素。问题来了,浏览器最终会以什么样的方式来渲染 p 的颜色呢?后定义的颜色会覆盖掉先定义的颜色吗?

这里就涉及到一个 CSS 选择器优先级的问题,如果有多个选择器作用于某元素的同一个属性,那么浏览器会去计算其对应选择器的优先级,并最终将优先级最高的那个选择器的样式作用于元素。
如何计算优先级呢?

优先级的计算通常遵循如下规则:

    如果某元素被设置了 style 属性,也就是说被设置了行内样式,那么此行内样式将拥有最高的优先级,任何其它外部样式都不能将其覆盖。如果没有被设置行内样式,那么参照下面的第 2 条规则。
    数一下选择器中 ID 选择器的个数,个数最多的,优先级就最高。如果 ID 选择器个数相同,或者压根儿就没有 ID 选择器,那么参照下面的第 3 条规则。
    数一下类选择器(如 .test)的个数,属性选择器(如 [type="submit"])的个数,还有伪类选择器(如 :hover)的个数,然后将个数加起来,总数最多的,这组选择器的优先级就最高。如果总是一样多,或者都为 0,那么参照下面的第 4 条规则。
    数一下标签选择器(如 p)的个数,另外还有伪元素选择器(如 :first-letter)的个数,加起来,总数最多的,优先级就最高。

如果经过上面的计算,优先级还是一样高,那么遵循后出现的样式覆盖先出现的样式之规则。

现在回过头来看先前的例子,那四组选择器的优先级分别为 0001、0012、0102、0103,之所以把优先级数字化,是因为这样更方便比较。按照自然数法则(事实上它们并非自然数)来比较,1 < 12 < 102 < 103,这样一来,它们的优先级孰高孰低,就一目了然了。

 
标签: css 属性 选择器
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Bootstrap.css 中请求googleapis.com/css?famil
    问题描述: Web中引入bootstrap.css中头部有访问Google服务器的请求 @import url("//fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700");     国内访问不稳定,页面反应慢解决:将请求结果保存下来,放到本地,重新声明请求1.请求http:
    03-16
  • React , TypeScript,  CSS Module , Less , Antd 遇到的坑
    React , TypeScript, CSS Module , Less , Ant
    因为React 本身的脚手架自身在webpack中已经做了对CSS Module 的配置,因最近遇到了很多坑,所以从头整理了一遍 使用版本"react": "^16.13.1","antd": "^4.4.0","typescript": "~3.7.2","webpack": "4.42.0","less": "^3
    03-08
  • react 运行报错 Error: PostCSS plugin postcss-pxtorem requires PostCSS 8.
    react 运行报错 Error: PostCSS plugin postcss
    postcss-pxtorem使用方法:https://www.cnblogs.com/liangziaha/p/13636936.html 这里报错 postcss-pxtorem 需要 8. 我以为要使用postcss-pxtorem 8.以上的版本就去看了一下postcss-pxtorem版本最高才6.0  这里降低  postcss-pxtorem@5.1.1npm i postcs
    03-08
  • React中jquery引用 react 引入css
    React中jquery引用 react 引入css
    在React中引用Jquery比较好玩,获取元素的数据更多1.引入方法举例: 1 import $ from 'jquery'; 23 import { Button } from 'antd'; 45 class testJquery extends React.Component { 67   constructor(props) { 8     super(props); 9 10     this.
    03-08
  • Vue PostCSS的使用介绍
    目录PostCSS使用安装依赖运行使用第三方插件autoprefixer使用第三方插件postcss-preset-env使用第三方插件postcss-pxtorem运行的新方式PostCSSpostcss 一种对css编译的工具,类似babel对js的处理,常见的功能如:1 . 使用下一代css语法2 . 自动补全浏览器前缀
    03-08
  • css实现弹出框 css弹出菜单
    弹出框也是前端里面经常使用的一个应用场景了,最开始想到的是用js实现这个效果,看到codepen上面有用css实现的。其实就是用到了css里面的一个:target选择器+visibility属性。URL 带有后面跟有锚名称 #,指向文档内某个具体的元素。这个被链接的元素就是目标
    03-08
  • jfinal框架页面找不到相关css,js文件404
    在JFinalConfig中添加配置: @Overridepublic void configHandler(Handlers handlers) {handlers.add(new ContextPathHandler());}页面中添加:base href="${CONTEXT_PATH}/"/之前页面找不到资源,把tomcat工程路径去掉了(path=""),这样暂时解决了问题推荐
    03-08
  • 纯CSS3实现的一些酷炫效果 css实现炫酷背景
    纯CSS3实现的一些酷炫效果 css实现炫酷背景
      之前在网上看到一些用纯CSS3实现的酷炫效果,以为实现起来比较困难,于是想看看具体是怎么实现的。一、笑脸猫动画实现效果如下:这个实现起来确实比较麻烦,很多地方需要花时间,有耐心地调整。1.先看下页面结构:bodydiv class="container"!-- 脸 --div
    03-08
  • 移动端CSS底部固定和fixed定位在ios上的bug
    fixed定位在ios上的bugcss三栏布局假设我们页面的 HTML 结构是这样: div class="wrapper"div class="content"!-- 页面主体内容区域 --/divdiv class="footer"!-- 需要做到 Sticky Footer 效果的页脚 --/div/div方法1.:absolute通过绝对定位处理应该是常见的
    03-08
  • css实现图片翻转 css使图片旋转
    !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"html xmlns="http://www.w3.org/1999/xhtml"headmeta http-equiv="Content-Type" content="text/h
    03-08
点击排行