美文网首页Web前端之路让前端飞Web 前端开发
一本好书--------《CSS揭秘》读书笔记

一本好书--------《CSS揭秘》读书笔记

作者: hwj3747 | 来源:发表于2017-09-02 15:19 被阅读56次

    作者:hwj3747
    转载请注明

    写在前面

    在开始之前,我要夸一下这本书。这本书真的非常不错,里面记载了各种H5,CSS3的编程技巧,让人觉得耳目一新,与一般的书很不一样。但是,这本书并不是一本初学者入门的书,在看这本书之前,你需要有一点前端开发的基础。个人目前还没看完,先记录一下从里面get到的知识点!

    代码可维护性

    在实践中,代码可维护性的最大要素是尽量减少改动时要编辑的地方。
    举例来说,如果在放大一个按钮时需要在一堆规则中进行10 处修改,那就很可能会漏改其中某处,当你在给别人善后时更是如此。

    举个例子,我们给一个按钮添加如下效果:

    button{
    padding: 6px 16px;
    border: 1px solid #446d88;
    background: #58a linear-gradient(#77a0bb, #58a);
    border-radius: 4px;
    box-shadow: 0 1px 5px gray;
    color: white;
    text-shadow: 0 -1px 1px #335166;
    font-size: 20px;
    line-height: 30px;
    }
    

    这段代码在可维护性方面存在一些问题,。如果我们决定改变字号(可能是为了生成一个更大、更重要的按钮),就得同时调整行高,因为这两个属性都写成了绝对值。更麻烦的是,行高并没有反映出它跟字号的关系,因此我们还得做些算术,算出字号改变之后的行高该是多少。当某些值相互依赖时,应该把它们的相互关系用代码表达出来。
    在这个例子中,行高是字号的1.5 倍,只要设置行高为1.5就行,然后字号改用百分比或em 单位就好多了
    更改之后结果如下:

    button{
    padding: .3em .8em;
    border: 1px solid #446d88;
    background: #58a linear-gradient(#77a0bb, #58a);
    border-radius: .2em;
    box-shadow: 0 .05em .25em gray;
    color: white;
    text-shadow: 0 -.05em .05em #335166;
    font-size: 125%;
    line-height: 1.5;
    }
    

    按照这种方法,我们就可以在一处控制按钮的所有尺寸样式了。
    现在,还有一个问题,假设我们要创建一个红色的取消按钮,或者一个绿色的确定按钮,该怎么做呢?眼下,我们可能需要覆盖四条声明(bordercolor、background、box-shadow 和text-shadow),而且还有另一大难题:要根据按钮的亮面和暗面相对于主色调#58a 变亮和变暗的程度来分别推导出其他颜色各自的亮色和暗色版本。
    解决方法就是,把半透明的黑色或白色叠加在主色调上,即可产生主色调的亮色和暗色变体,这样就能简单地化解这个难题了:

    button{
        padding: .3em .8em;
        border: 1px solid rgba(0,0,0,.1);
        background: #58a linear-gradient(hsla(0,0%,100%,.2),transparent);
        border-radius: .2em;
        box-shadow: 0 .05em .25em rgba(0,0,0,.5);
        color: white;
        text-shadow: 0 -.05em .05em rgba(0,0,0,.5);
        font-size: 125%;
        line-height: 1.5;
    }
    

    现在我们只要覆盖background-color 属性,就可以得到不同颜色版本的按钮了:

    button.cancel {
    background-color: #c00;
    }
    button.ok {
    background-color: #6b0;
    }
    

    半透明边框

    假设我们想给一个容器设置一层白色背景和一道半透明白色边框,body的背景会从它的半透明边框透上来。我们最开始的尝试可能是这样的:

    <div class="border"><div>
    hahahhahahahaah
    </div></div>
    
    .border {
    background: black;
    padding: .8em;
    }
    .border div {
    border: 10px solid hsla(0,0%,100%,.5);
    background: white;
    }
    

    结果可能会令你摸不着头脑。我们的边框去哪儿了啊?而且如果我们连使用半透明颜色都不能实现半透明边框,那我们还有什么办法?!
    尽管看起来并不像那么回事,但我们的边框其实是存在的。默认情况下,背景会延伸到边框所在的区域下层。也就是说白色背景延伸到边框区域,覆盖了边框,我们把子div的背景改成其他颜色,比如blue,我们就能看到一个浅蓝色的边框了,这是蓝色背景与半透明边框叠加后的效果。但是很多时候我们并不希望背景延伸到边框区域,这个时候我们可以通过background-clip 属性来调整上述默认行为所带来的不便。这个属性的初始值是border-box,意味着背景会被元素的border box(边框的外沿框)裁切掉。如果不希望背景侵入边框所在的范围,我们要做的就是把它的值设为padding-box,这样浏览器就会用内边距的外沿来把背景裁切掉。

    .border div {
    border: 10px solid hsla(0,0%,100%,.5);
    background: white;
    background-clip: padding-box;
    }
    

    多重边框

    • box-shadow 方案
      我们大多数人可能已经用过(或滥用过)box-shadow 来生成投影。不太为人所知的是,它还接受第四个参数(称作“扩张半径”),通过指定正值或负值,可以让投影面积加大或者减小。一个正值的扩张半径加上两个为零的偏移量以及为零的模糊值,得到的“投影”其实就像一道实线边框.
    background: yellowgreen;
    box-shadow: 0 0 0 10px #655;
    

    这并没有什么了不起的,因为你完全可以用border 属性来生成完全一样的边框效果。不过box-shadow 的好处在于,它支持逗号分隔语法,我们可以创建任意数量的投影。

    background: yellowgreen;
    box-shadow: 0 0 0 10px #655, 0 0 0 15px deeppink;
    

    唯一需要注意的是,box-shadow 是层层叠加的,第一层投影位于最顶层,依次类推。因此,你需要按此规律调整扩张半径。比如说,在前面的代码中,我们想在外圈再加一道5px 的外框,那就需要指定扩张半径的值为15px(10px+5px)。并且,投影的行为跟边框不完全一致,因为它不会影响布局,而且也不会受到box-sizing 属性的影响。不过,你还是可以通过内边距或外边距(这取决于投影是内嵌和还是外扩的)来额外模拟出边框所需要占据的空间。

    • outline 方案
      在某些情况下,你可能只需要两层边框,那就可以先设置一层常规边框,再加上outline(描边)属性来产生外层的边框。
    background: yellowgreen;
    border: 10px solid #655;
    outline: 5px solid deeppink;
    

    灵活的背景定位

    很多时候,我们想针对容器某个角对背景图片做偏移定位,如右下角。

    • background-position 的扩展语法方案
      CSS3中background-position 属性已经得到扩展,它允许我们指定背景图片距离任意角的偏移量,只要我们在偏移量前面指定关键字。
    div{
    width:600px;
    height:600px;
    background: url(code-pirate.svg) no-repeat #58a;
    background-position: right 20px bottom 10px;
    }
    
    • background-origin 方案
      在给背景图片设置距离某个角的偏移量时,有一种情况极其常见:偏移量与容器的内边距一致。
      每个元素身上都存在三个矩形框(参见图2-14):border box(边框的外沿框)、padding box(内边距的外沿框)和content box(内容区的外沿框)。默认情况下,background-position 是以padding box 为准的,这样边框才不会遮住背景图片。
      在CSS3中我们得到了一个新的属性background-origin,可以用它来改变这种行为。在默认情况下,它的值是(闭着眼睛也猜得到)padding-box。如果把它的值改成content-box(参见下面的代码),我们在background-position 属性中使用的边角关键字将会以内容区的边缘作为基准(也就是说,此时背景
      图片距离边角的偏移量就跟内边距保持一致了):
    div{
    width:600px;
    height:600px;
    padding: 10px;
    background: url("code-pirate.svg") no-repeat #58a
    bottom right; /* 或 100% 100% */
    background-origin: content-box;
    }
    

    条纹背景

    假设我们有一条基本的垂直线性渐变,颜色从#fb3 过渡到#58a

    background: linear-gradient(#fb3 20%, #58a 80%);
    

    现在容器顶部的20% 区域被填充为#fb3 实色,而底部20% 区域被填充为#58a 实色。真正的渐变只出现在容器60% 的高度区域。
    如果我们把两个色标重合在一起,已经没有任何渐变效果了,只有两块实色,各占据了background-image 一半的面积。本质上,我们已经创建了两条巨大的水平条纹。

    background: linear-gradient(#fb3 50%, #58a 50%);
    

    还可以通过background-size 来调整其尺寸,

    background: linear-gradient(#fb3 50%, #58a 50%);
    background-size: 100% 30px;
    

    我们把这两条条纹的高度都缩小到了15px。由于背景在默认情况下是重复平铺的,整个容器其实已经被填满了水平条纹.
    如果要创建垂直条纹,只需要指定渐变的方向即可:

    background: linear-gradient(to right, /* 或 90deg */#fb3 50%, #58a 0);
    background-size: 30px 100%;
    

    斜向条纹:

    background: linear-gradient(45deg,#fb3 25%, #58a 0, #58a 50%,#fb3 0, #fb3 75%, #58a 0);
    background-size: 30px 30px;
    

    或者

    background: repeating-linear-gradient(45deg,#fb3, #fb3 15px, #58a 0, #58a 30px);
    

    repeating-linear-gradient():色标是无限循环重复的,直到填满整个背景。

    未完待续。。。

    相关文章

      网友评论

        本文标题:一本好书--------《CSS揭秘》读书笔记

        本文链接:https://www.haomeiwen.com/subject/ttsarxtx.html