• 《CSS揭秘》读书笔记(P1-P50)


    一、CSS编码技巧

    尽量减少代码重复

    当某些值相互依赖时,应该把 它们的相互关系用代码表达出来。

    font-size: 20px
    line-height: 1.5 /* 20*1.5 = 30px */
    

    字号不要用绝对值,用相对单位便于维护。

    font-size: 125% /* 假设父级的字号是 16px */
    line-height: 1.5
    

    补充:

    em是相对单位,假设父级字号大小是16px,那么1em=16px。以此类推,1.5em=1.5*16=24rem

    rem是相对单位,假设html的字号大小是50px,那么1rem=50px。以此类推,0.2rem=0.2*50=10px(rem是移动端最常用的单位)

    vw、vh是相对单位,假设当前设备视口的宽度是1900px,视口高度是800px,那么1vh=1900/100=19px,1vw=800/100=8px。假设想获得一半的视口高度,用50vh即可。

    代码缩写和代码维护不可兼得

    border- 10px 10px 10px 0;
    
    /* 为了便于维护,上面一条代码最好写为: */
    border- 10px; 
    border-left- 0;
    

    响应式设计

    利用媒体查询可以修补不同设备分辨率不一致而导致的问题,但是每个媒体查询都会增加成本。
    避免不必要的媒体查询:

    • 使用百分比长度来取代固定长度。如果实在做不到这一点,也应该尝试使用与视口相关的单位(vw、vh、vmin 和 vmax),它们的值解析为视口宽度或高度的百分比。
    • 当你需要在较大分辨率下得到固定宽度时,使用 max-width 而不是 width,因为它可以适应较小的分辨率,而无需使用媒体查询。
    • 不要忘记为替换元素(比如 img、object、video、iframe 等)设置一个 max-width,值为 100%。
    • 假如背景图片需要完整地铺满一个容器,不管容器的尺寸如何变化, background-size: cover 这个属性都可以做到。但是,我们也要时刻牢记——带宽并不是无限的,因此在移动网页中通过CSS把一张大图缩小显示往往是不太明智的。
    • 当图片(或其他元素)以行列式进行布局时,让视口的宽度来决定列的数量。弹性盒布局(即 Flexbox)或者 display: inline-block 加上常规的文本折行行为,都可以实现这一点。
    • 在使用多列文本时,指定 column-width(列宽)而不是指定 column-count(列数),这样它就可以在较小的屏幕上自动显示为单列布局。

    思路:尽最大努力实现弹性可伸缩的布局,并在媒体查询的各个断点区间内指定相应的尺寸。

    “结果我们发现,想让网页在一堆不同的设备上合理展示,只需要在 最终产品上添加一点 CSS 媒体查询就可以了。这件事情之所以这么简单, 关键在于我们的布局原本就是弹性可伸缩的。因此,优化网页在小屏幕上 的表现,其实只意味着把一些外边距收拢到最小程度,然后把因为屏幕太 窄而无法显示成双列的侧栏调整为单列布局而已。”
    ——在 Iterations 中实践响应式设计(http://signalvnoise.com/posts/ 2661-experimenting-with-responsive-design-in-iterations)

    合理的简写

    background: url(tr.png) no-repeat top right / 2em 2em,
                url(br.png) no-repeat bottom right / 2em 2em,
                url(bl.png) no-repeat bottom left / 2em 2em;
    

    简写:

    background: url(tr.png) top right,
                url(br.png) bottom right,
                url(bl.png) bottom left; 
    background-size: 2em 2em; 
    background-repeat: no-repeat;
    

    注意:上面的斜杠(/)是为了区分 background-position 和 background-size。

    预处理器

    stylus、sass、less都是css的预处理器,为css提供变量、mixin、函数、规则嵌套、颜色处理等等功能。
    在大型项目中让代码更加灵活。
    但也存在一些问题:

    • CSS 的文件体积和复杂度可能会失控。编译之后,原生的css非常繁杂。
    • 调试难度增加。好在越来越多的调试工具开始支持 SourceMap。SourceMap是一种非常酷的新技术, 正是为了解决这个痛点而生的,它会告诉浏览器哪些编译生成的 CSS 代码对应哪些预处理器 CSS 代码,精确到行号。
    • 预处理器在开发过程中引入了一定程度的延时。
    • 新人加入团队需要培训,增加了学习成本。
    • 抽象泄漏法则:“所有重大的抽象机制在某种程度 上都存在泄漏的情况。不可避免会有bug出现。

    不是每个项目都要用预处理器,可以从纯CSS起步,当代码复杂时再使用预处理器的方案。

    二、背景与边框

    半透明框

    写一个半透明边框

    border: 10px solid hsla(0,0%,100%,.5); 
    background: white;
    

    事实上这样并不会奏效,原因是白色背景会始终垫在边框的下面,所以如果边框是透明的,那么下面白色背景就会透上来。
    那么只要控制了背景的绘制区域就能避免上述情况发生。
    解决办法:将background-clip值修改为padding-box。

    border: 10px solid hsla(0,0%,100%,.5); 
    background: white; 
    /* 背景裁切(也就是背景绘制区域):默认是border-box */
    background-clip: padding-box;
    

    补充:

    background-clip:规定背景的绘制区域。
    语法:background-clip: border-box|padding-box|content-box;

    描述
    border-box(默认) 背景被裁剪到边框盒。
    padding-box 背景被裁剪到内边距框。
    content-box 背景被裁剪到内容框。

    多重边框

    box-shadow方案:
    对同一个对象设置盒子阴影来实现多重边框,重复的样式之间用逗号隔开。

    background: yellowgreen; 
    box-shadow: 0 0 0 10px #655,             
                0 0 0 15px deeppink, 
                /* 常规投影 */            
                0 2px 5px 15px rgba(0,0,0,.6);
    

    注意:下一层投影会叠加在上一层投影下面。
    补充:

    CSS box-shadow 属性用于在元素的框架上添加阴影效果。
    你可以在同一个元素上设置多个阴影效果,并用逗号将他们分隔开。
    该属性可设置的值包括阴影的X轴偏移量、Y轴偏移量、模糊半径、扩散半径和颜色。
    box-shadow方案的注意事项:

    • 投影不是真正的边框,它不属于真正的盒子,但是可以通过内外边距来模拟盒子的效果。
    • 模拟出来的外圈不会响应鼠标事件。

    outline方案:
    描边方法只能实现双层边框的样式(border一层+outline一层)。
    多层还是要用box-shadow。

    background: yellowgreen; 
    border: 10px solid #655; 
    outline: 5px solid deeppink;
    border-radius: 5px;
    

    注意:如果设置了圆角,是不会被outline贴合的。

    三、背景定位

    background-position 的扩展语法方案:

    把背景放在容器的某个位置,比如右下角。

    background-positon: right bottom;
    

    可以指定距离边界的偏移量。例如距离右边界保持100px的偏移量,距离下边界保持50px的偏移量。

    background-positon: right 100px bottom 50px;
    


    注意:默认情况下,background-position 是以 padding box 为基准的,这样边框才不会遮住背景图片。

    background-origin 方案

    四个角的基准是可以改变的,这就用到了background-origin。

    background-origin 规定了指定背景图片background-image 属性的原点位置的背景相对区域。

    描述
    padding-box(默认) 背景图片的摆放以padding区域为参考
    border-box 背景图片的摆放以border区域为参考
    content-box 背景图片的摆放以content区域为参考
    padding: 20px;
    border: 15px solid pink;
    background-position: right bottom;
    background-origin: content-box;
    

    calc() 方案

    calculate计算
    如果想实现背景距离右边100px的偏移量,下边50px的偏移量。
    如果以左上角偏移的思路来考虑,实际上想要实现的是,100%-100px的水平偏移量 100%-50px的垂直偏移量。

    background-position: calc(100% - 100px) calc(100% - 50px);
    

    注意:calc中的符号两边要用空格隔开!

    补充:

    background的缩写形式:
    background: [background-color] [background-image] [background-repeat] [background-attachment] [background-position] / [ background-size] [background-origin] [background-clip];

    所以calc()方案可以写成:

    background: #eee
                url(http://n.sinaimg.cn/sinacn/w1280h719/20180225/c28f-fyrwsqi1723468.jpg)
                no-repeat
                calc(100% - 100px) calc(100% - 50px) / 50% 50%
                padding-box padding-box;
    

    未完待续。。。

  • 相关阅读:
    spring
    google-c-style
    process想停就停,真爽
    mytop
    Java 图片设置圆角(设置边框,旁白)
    当setTimeout遇到闭包
    FreeMarker辅助
    ImageIO.wtrie生成jpg图片质量损失方案:BufferedImage生成jpg图片文件流
    从BufferedImage到InputStream,实现绘图后进行下载(生成二维码图片并下载)
    使用Javascript 实现类
  • 原文地址:https://www.cnblogs.com/buildnewhomeland/p/12972237.html
Copyright © 2020-2023  润新知