《CSS揭秘》笔记

2020-04-22  本文已影响0人  Yezzle

最近在看《CSS揭秘》一书,还没看完,想把里面比较好的一些分享出来,然后自己也可以一边看一边记边更新

DRY 是 Don’t Repeat Yourself 的首字母缩写,意思是不应该重复你已经做过的事。它是一种 广为流传的编程理念,旨在提升代码某方面的可维护性:在改变某个参数时,做到只改尽量 少的地方,最好是一处

.bg {
    background: -moz-linear-gradient(0deg, yellow, red);
    background: -o-linear-gradient(0deg, yellow, red);
    background: -webkit-linear-gradient(0deg, yellow, red);
    background: linear-gradient(90deg, yellow, red);
}

因为很多浏览器在当时的版本,一些css特性还是实验特性,浏览器为了提前支持实验特性并获得反馈,就在属性值前面加上自己的前缀。这就导致了上面这种意想不到的问题,所以后面新的css特性,要求开发人员需要手动从设置里面开启选项才能体验,然后提供反馈,而这些将不能用在生产环境中,因为你不可能要求用户去手动开启这个设置选项。
最常见的前缀分别是 Firefox 的 -moz-、IE 的 -ms-、Opera 的 -o- 以及 Safari 和 Chrome 的 -webkit-。

h1 { color: gray; } 
 
.textshadow h1 {
    color: transparent;     
    text-shadow: 0 0 .3em gray; 
}
 h1 { color: gray; } 
 
@supports (text-shadow: 0 0 .3em gray) {
    h1 {
        color: transparent;
        text-shadow: 0 0 .3em gray;
    }
}

==慎用@supports== 在上面的例子中,我们想要的文本 投影效果只会在那些支持 text-shadow 且同时支持 @supports 规则的浏览 器中生效。这个范围明显比我们所期望的要窄。

核心思想就是在任意元素的element.style上检查该属性是否存在:

var root = document.documentElement;

if ('textShadow' in root.style) { 
    root.classList.add('textshadow'); 
}  else {    
    root.classList.add('no-textshadow'); 
}

或者如下封装以检测多个属性:

function testProperty(property) { 
    var root = document.documentElement; 
 
    if (property in root.style) {
        root.classList.add(property.toLowerCase());
        return true;
    } 
 
    root.classList.add('no-' + property.toLowerCase());
    return false; 
}

如果我们想要检测某个具体的属性值是否支持,那就需要把它赋给对应 的属性,然后再检查浏览器是不是还保存着这个值。很显然,这个过程会改 变元素的样式,因此我们需要一个隐藏元素

function testValue(id, value, property) { 
    var dummy = document.createElement('p');
    dummy.style[property] = value; 
 
    if (dummy.style[property]) {
        root.classList.add(id);
        return true;
    } 
 
    root.classList.add('no-' + id);
    return false;
}
{
    font-size: 20px;
    line-height: 1.5;
}

但是border-width属性慎重考虑

  1. 利用展开属性合并和合并属性复写,这样可以提高该代码的可维护性:
{
    border: 10px 10px 10px 0;
}
/*拆分为下面的写法虽然增加了代码量,但是提高了可读性和维护性:*/
{
    border: 10px;
    border-left-width:0;
}
  1. 利用颜色关键字currentColor, 他将会被解析为一个颜色值,虽然功能很有限,但它真的是个变量
hr {
   height: .5em;
   background: currentColor;
}

currentColor 本身就是很多 CSS 颜色属性的初始值,比如 border-color 和 outline-color,以及 text-shadow 和 box-shadow 的颜 色值,等等。

  1. 利用inherit关键字继承属性从而不需要重复指定:
input, select, button { font: inherit; }
  1. 使用百分比长度取代固定长度. 如果实在做不到,可以尝试使用与视口相关的单位(vw、vh、vmin 和 vmax),它们的值解析为视口宽度或高度的百分比
  2. 当你需要在较大分辨率下得到固定宽度时,使用 max-width 而不是width,因为它可以适应较小的分辨率,而无需使用媒体查询
ul { --accent-color: purple; }
ol { --accent-color: rebeccapurple; }
li { background: var(--accent-color); }

因为自定义变量有自己的作用域,上面的写法可以做的不同的列表li颜色自动变化。这是预处理器做不到的

{
  border: 10px solid hsla(0,0%,100%,.5); 
  background: white; 
  background-clip: padding-box; /*调整背景区域为padding-box, 默认是border-box(边框的外边缘)*/
}
{
  background: yellowgreen; 
  box-shadow: 0 0 0 10px #655,  0 0 0 15px deeppink,  0 2px 5px 15px rgba(0,0,0,.6);
上一篇下一篇

猜你喜欢

热点阅读