《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;

未完待续。。。

原文地址:https://www.cnblogs.com/buildnewhomeland/p/12972237.html