CSS3 使用了层叠样式表技术,可以对网页布局、字体、颜色、背景灯效果做出控制。CSS3 作为 CSS 的进阶版,拆分和增加了盒子模型、列表模块、语言模块 、背景边框 、文字特效 、多栏布局等等。CSS3 的改变有很多,增加了文字特效,丰富了下划线样式,加入了圈重点的功能。在边框方面,有了更多的灵活性,可以更加轻松地操控渐变效果和动态效果等等。在文字效果方面,特意增加了投影。CSS3在兼容上做了很大的功夫,并且网络浏览器也还将继续支持 CSS2,因此原来的代码不需要做太多的改变,只会变得更加地轻松。
CSS3 中新增了一些特性例如:
关于 CSS 布局,参见 https://zhuanlan.zhihu.com/p/29070363,https://juejin.cn/post/7073811972361289736
盒模型用于装填内容:分为内容(content)、填充(padding)、边界(margin)、边框(border)四个部分。
div {
box-sizing: border-box/padding-box/content-box;
}
W3C 标准盒模型:
IE 盒模型:
区别:这两种盒子模型最主要的区别就是 width 的包含范围,在标准的盒子模型中,width 指 content 部分的宽度,在 IE 盒子模型中,width 表示 content+padding+border 这三个部分的宽度,故这使得在计算整个盒子的宽度时存在着差异。
在 ie8+ 浏览器中使用哪个盒模型可以由 box-sizing(CSS 新增的属性)控制,默认值为 content-box。如果在 ie6,7,8 中 DOCTYPE 缺失会将盒子模型解释为 IE 盒子模型。若在页面中声明了 DOCTYPE 类型,所有的浏览器都会把盒模型解释为 W3C 盒模型。
box-sizing:content-box;
表示标准的盒子模型box-sizing:border-box;
表示的是 IE 盒子模型box-sizing:padding-box;
这个属性值的宽度包含了左右 padding+width内联盒模型基本概念
幽灵空白节点
“幽灵空白节点”是内联盒模型中非常重要的一个概念,具体指的是:在 HTML5 文档声明中,内联元素的所有解析和渲染表现就如同
每个行框盒子的前面有一个“空白节点”一样。这个“空白节点”永远透明,不占据任何宽度,看不见也无法通过脚本获取,就好像幽灵
一样,但又确确实实地存在,表现如同文本节点一样,因此,我称之为“幽灵空白节点”。
@import
是 css 提供的选择器 | 例子 |
---|---|
id 选择器 | #myid |
类选择器 | .myclassname |
标签选择器 | div,h1,p |
后代选择器 | h1 p |
相邻后代选择器(子)选择器 | ul>li |
兄弟选择器 | li~a |
相邻兄弟选择器 | li+a |
属性选择器 | a[rel=“external”] |
伪类选择器 | a:hover,li:nth-child |
伪元素选择器 | ::before、::after |
通配符选择器 | * |
CSS 的优先级算法
CSS 的优先级是根据样式声明的特殊性值来判断的。选择器的特殊性值分为四个等级,如下:
计算方法:
计算实例:
注意:
CSS 引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句
话中的第一个字母,或者是列表中的第一个元素。
伪类用于当已有的元素处于某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的
元素时,可以通过 :hover 来描述这个元素的状态。
伪元素用于创建一些不在文档树中的元素,并为其添加样式。它们允许我们为元素的某些部分设置样式。比如说,我们可以通过::be
fore 来在一个元素前增加一些文本,并为这些文本添加样式。虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。
有时伪元素使用了两个冒号(::)而不是一个冒号(:),这是 CSS3 的一部分,并尝试区分伪类和伪元素。大多数浏览器都支持这两个值。按照规则应该使用(::)而不是(:),从而区分伪类和伪元素。但是,由于在旧版本的 W3C 规范并未对此进行特别区分,因此目前绝大多数的浏览器都支持使用这两种方式表示伪元素。
单冒号(:)用于 CSS3 伪类,双冒号(::)用于 CSS3 伪元素。(伪元素由双冒号和伪元素名称组成)。双冒号是在当前规范中引入的,用于区分伪类和伪元素。不过浏览器需要同时支持旧的已经存在的伪元素写法,比如 :first-line、:first-letter、:before、:after 等,而新的在 CSS3 中引入的伪元素则不允许再支持旧的单冒号的写法。
::before 和 ::after
a 标签有四种状态:链接访问前、链接访问后、鼠标滑过、激活,分别对应四种伪类 :link
、:visited
、:hover
、:active
;
当链接未访问过时:
当链接访问过时,情况基本同上,只不过需要将 :link 换成 :visited。这个顺序能不能变?可以,但也只有 :link 和 :visited 可以交换位置,因为一个链接要么访问过要么没访问过,不可能同时满足,也就不存在覆盖的问题。
伪类 | 描述 |
---|---|
elem:nth-child(n) | 选中父元素下的第 n 个子元素,并且这个子元素的标签名为 elem,n 可以接受具体的数值,也可以接受函数 |
elem:nth-last-child(n) | 作用同上,不过是从后开始查找 |
elem:last-child | 选中最后一个子元素 |
elem:only-child | 如果 elem 是父元素下唯一的子元素,则选中之 |
elem:nth-of-type(n) | 选中父元素下第 n 个 elem 类型元素,n 可以接受具体的数值,也可以接受函数 |
elem:first-of-type | 选中父元素下第一个 elem 类型元素 |
elem:last-of-type | 选中父元素下最后一个 elem 类型元素 |
elem:only-of-type | 如果父元素下的子元素只有一个 elem 类型元素,则选中该元素 |
elem:empty | 选中不包含子元素和内容的 elem 类型元素 |
elem:target | 选择当前活动的 elem 元素 |
:not(elem) | 选择非 elem 元素的每个元素 |
:enabled | 控制表单控件的禁用状态 |
:disabled | 控制表单控件的禁用状态 |
:checked | 单选框或复选框被选中 |
每个 CSS 属性定义的概述都指出了这个属性是默认继承的,还是默认不继承的。这决定了当你没有为元素的属性指定值时该如何计算
值。当元素的一个继承属性没有指定值时,则取父元素的同属性的计算值。只有文档根元素取该属性的概述中给定的初始值(这里的意思应
该是在该属性本身的定义中的默认值)。
当元素的一个非继承属性(在 Mozillacode 里有时称之为 resetproperty)没有指定值时,则取属性的初始值 initialvalue(该值在该属性的概述里被指定)。
有继承性的属性:
注意:当一个属性不是继承属性时,可以使用 inherit
关键字指定一个属性应从父元素继承
它的值,inherit 关键字用于显式地指定继承性,可用于任何继承性/非继承性属性。
包含块(containingblock)就是元素用来计算和定位的一个框。
因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对 CSS 初始化往往会出现浏览器之间的页面显示差异。不过初始化样式会对 SEO 有一定的影响。
css reset 和 normalize.css 的区别
normalize.css 官网
reset 的目的,是将所有的浏览器的自带样式重置掉,这样更易于保持各浏览器渲染的一致性。
normalize 的理念则是尽量保留浏览器的默认样式,不进行太多的重置,而尽力让这些样式保持一致并尽可能与现代标准相符合。
块格式化上下文(BlockFormattingContext,BFC)是 Web 页面的可视化 CSS 渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。BFC 是一个独立的布局环境,可以理解为一个容器,在这个容器中按照一定规则进行物品摆放,并且不会影响其它环境中的物品。如果一个元素符合触发 BFC 的条件,则 BFC 中的元素布局不受外部影响。
创建 BFC
IFC 指的是行级格式化上下文,它有这样的一些布局规则:
margin 重叠指的是在垂直方向上,两个相邻元素的 margin 发生重叠的情况。一般来说可以分为四种情形:
浮动元素可以左右移动,直到遇到另一个浮动元素或者遇到它外边缘的包含框。浮动框不属于文档流中的普通流,当元素浮动之后,不会影响块级元素的布局,只会影响内联元素布局。此时文档流中的普通流就会表现得该浮动框不存在一样的布局模式。当包含框的高度小于浮动框的时候,此时就会出现“高度塌陷”。
清除浮动是为了清除使用浮动元素产生的影响。浮动的元素,高度会塌陷,而高度的塌陷使我们页面后面的布局不能正常显示。
清除浮动的方式
<div>
<ul style="float:left">
<li>1li>
<li>2li>
<li>3li>
ul>
<div style="clear:both">div>
div>
<style>
.clearfix{
*zoom:1;
}
.clearfix:after{
content:"";
display:block;
clear:both;
}
style>
<div class="clearfix">
<ul style="float:left">
<li>1li>
<li>2li>
<li>3li>
ul>
div>
<div style="float:left">
<ul style="float:left">
<li>1li>
<li>2li>
<li>3li>
ul>
div>
<div style="overflow:hidden">
<ul style="float:left">
<li>1li>
<li>2li>
<li>3li>
ul>
div>
<div style="display:inline-block">
<ul style="float:left">
<li>1li>
<li>2li>
<li>3li>
ul>
div>
<div style="position:fixed">
<ul style="float:left">
<li>1li>
<li>2li>
<li>3li>
ul>
div>
关于 clear
官方对 clear 属性的解释是:“元素盒子的边不能和前面的浮动元素相邻。”,我们对元素设置 clear 属性是为了避免浮动元素对该元素的影响,而不是清除掉浮动。
关于 zoom
清除浮动,触发 hasLayout;zoom 属性是 IE 浏览器的专有属性,它可以设置或检索对象的缩放比例。解决 IE 下比较奇葩的 bug。譬如外边距(margin)的重叠,浮动清除,触发 ie 的 haslayout 属性等。
当设置了 zoom 的值之后,所设置的元素就会就会扩大或者缩小,高度宽度就会重新计算了,这里一旦改变 zoom 值时其实也会发生重新渲染,运用这个原理,也就解决了 IE 下子元素浮动时候父元素不随着自动扩大的问题。
zoom 属性是 IE 浏览器的专有属性,火狐和老版本的 webkit 核心的浏览器都不支持这个属性。
在不同浏览器下的区别:
absolute
生成绝对定位的元素,相对于值不为 static 的第一个父元素的 paddingbox (在计算定位距离的时候,padding 的值也要算进去)进行定位,也可以理解为离自己这一级元素最近的
一级 position 设置为 absolute 或者 relative 的父元素的 paddingbox 的左上角为原点进行定位。
fixed(老 IE 不支持)
生成绝对定位的元素,相对于浏览器窗口进行定位。
relative
生成相对定位的元素,相对于其元素本身所在正常位置进行定位。
static
默认值。没有定位,元素出现在正常的流中(忽略 top,bottom,left,right,z-index 声明)。
inherit
规定从父元素继承 position 属性的值。
sticky
sticky 定位可以表现出 relative 和 fixed 两种定位结合,正常情况下是 relative,但是当 sticky 元素的父元素出现滚动条的时候,sticky 元素距离到设置的位置如(top: 0)时会表现为 fixed,相对于最近的滚动容器的 fixed。
总的来说,可以把它看作是一个类似优先级的机制,“position:absolute” 和 “position:fixed” 优先级最高,有它存在的时候,浮动不起作用,‘display’ 的值也需要调整;其次,元素的 ‘float’ 特性的值不是 “none” 的时候或者它是根元素的时候,调整 ‘display’ 的值;最后,非根元素,并且非浮动元素,并且非绝对定位的元素,‘display’ 特性值同设置值。
浏览器会把 inline(inline-block) 元素间的空白字符(空格、换行、Tab 等)渲染成一个空格。而为了美观。我们通常是一个
解决办法:
何时应当使用 margin:
何时应当时用 padding:
all 属性实际上是所有 CSS 属性的缩写,表示,所有的 CSS 属性都怎样怎样,但是,不包括 unicode-bidi
和 direction
这两个 CSS 属性。支持三个 CSS 通用属性值,initial,inherit,unset。
initial 是初始值的意思,也就是该元素元素都除了 unicode-bidi 和 direction 以外的 CSS 属性都使用属性的默认初始值。
inherit 是继承的意思,也就是该元素除了 unicode-bidi 和 direction 以外的 CSS 属性都继承父元素的属性值。
unset 是取消设置的意思,也就是当前元素浏览器或用户设置的 CSS 忽略,然后如果是具有继承特性的 CSS,如 color,则使用继承值;如果是没有继承特性的 CSS 属性,如 background-color,则使用初始值。
italic 和 oblique 这两个关键字都表示“斜体”的意思。它们的区别在于,italic 是使用当前字体的斜体字体,而 oblique 只是单纯地让文字倾斜。如果当前字体没有对应的斜体字体,则退而求其次,解析为 oblique,也就是单纯形状倾斜。
基线和 x-height
字母 x 的下边缘(线)就是我们的基线。
x-height 指的就是小写字母 x 的高度,术语描述就是基线和等分线(meanline)(也称作中线,midline)之间的距离。在 CSS 世界中,middle 指的是基线往上 1/2x-height 高度。我们可以近似理解为字母 x 交叉点那个位置。
ex 是 CSS 中的一个相对单位,指的是小写字母 x 的高度,没错,就是指 x-height。ex 的价值就在其副业上不受字体和字号影响的内联元素的垂直居中对齐效果。内联元素默认是基线对齐的,而基线就是 x 的底部,而1ex 就是一个 x 的高度。
如果使用数值作为 font-weight 属性值,必须是 100~900 的整百数。因为这里的数值仅仅是外表长得像数值,实际上是一个具有特定含义的关键字,并且这里的数值关键字和字母关键字之间是有对应关系的。
非替换元素以外的 display 计算值为 inline 的内联元素设置 text-indent 值无效,如果计算值 inline-block/inline-table 则会生效
。letter-spacing 可以用来控制字符之间的间距,这里说的“字符”包括英文字母、汉字以及空格等。letter-spacing 具有以下一些特性:
letter-spacing 作用于所有字符,但 word-spacing 仅作用于空格字符。换句话说,word-spacing 的作用就是增加空格的间隙宽度。
white-space 属性声明了如何处理元素内的空白字符,这类空白字符包括 Space(空格)键、Enter(回车)键、Tab(制表符)键产生的空白。因此,white-space 可以决定图文内容是否在一行显示(回车空格是否生效),是否显示大段连续空白(空格是否生效)等。其属性值包括下面这些:
/*单行文本溢出*/
p {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/*多行文本溢出*/
p {
position: relative;
line-height: 1.5em;
/*高度为需要显示的行数*行高,比如这里我们显示两行,则为 3*/
height: 3em;
overflow: hidden;
}
p:after {
content: "...";
position: absolute;
bottom: 0;
right: 0;
background-color: #fff;
}
已弃用: 不再推荐使用该特性
。虽然一些浏览器仍然支持它,但也许已从相关的 web 标准中移除,也许正准备移除或出于兼容性而保留。非继承。
img {
position: absolute;
clip: rect(0px,60px,200px,0px); /* 裁剪一个矩形*/
}
transition 关注的是 CSS property 的变化,property 值和时间的关系是一个三次贝塞尔曲线。
animation 作用于元素本身而不是样式属性,可以使用关键帧的概念,应该说可以实现更自由的动画效果。
绝对定位元素非定位方位的 margin 值“无效”
。通过修改某个属性值呈现的内容就可以被替换的元素就称为“替换元素”。因此,、
替换元素的尺寸从内而外分为 3 类:固有尺寸、HTML 尺寸和 CSS 尺寸。
这 3 层结构的计算规则具体如下
content 属性生成的对象称为“匿名替换元素”。
content 生成的文本无法被屏幕阅读设备读取,也无法被搜索引擎抓取
,因此,千万不要自以为是地把重要的文本信息使用 content 属性生成,因为这对可访问性和 SEO 都很不友好。hasLayout 是 IE 特有的一个属性。很多的 IE 下的 cssbug 都与其息息相关。在 IE 中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。当一个元素的 hasLayout 属性值为 true 时,它负责对自己和可能的子孙元素进行尺寸计算和定位。虽然这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作。
层叠上下文,英文称作 stackingcontext,是 HTML 中的一个三维的概念。如果一个元素含有层叠上下文,我们可以理解为这个元素在 z 轴上就“高人一等”。
层叠上下文元素有如下特性:
层叠上下文的创建:
层叠水平
层叠水平,英文称作 stackinglevel,决定了同一个层叠上下文中元素在 z 轴上的显示顺序。所有的元素都有层叠水平,包括层叠上下文元素,也包括普通元素。然而,对普通元素的层叠水平探讨只局限在当前层叠上下文元素中。
层叠顺序
层叠顺序,英文称作 stackingorder,表示元素发生层叠时有着特定的垂直显示顺序。
层叠准测
浏览器会自动计算页面宽度,但浏览器不计算高度。相当于只是一个 auto,让它内容自动往下堆砌。body 的 width 对应浏览器的宽度,而height 则是通过内容撑起来的。在设置百分比高度时要制定父元素/包含块的具体高度。
高度
。宽度
。当 position 属性为 absolute 时,其宽高百分比参照其最近 position 不为 static 的父元素,如果父元素且所有祖先元素没有进行定位,其宽高百分比将根据浏览器可视宽高进行计算。
将一个页面涉及到的所有图片都包含到一张大图中去,然后利用 CSS 的 background-image,background-repeat,background-position 的组合进行背景定位。利用 CSSSprites 能很好地减少网页的 http 请求,从而很好的提高页面的性能;CSSSprites 能减少图片的字节。
优点:
缺点:
设备像素和设备独立像素的比值
,一般的 pc 屏幕,dpr=1。在 iphone4 时,苹果推出了 retina 屏幕,它的 dpr 为 2。屏幕的缩放会改变 dpr 的值。为方便计算,设计稿为 750px 情况下,平均分成 7.5 份,则每份大小为 100 px,即 font-size 为 100px:
const htmlEl = document.documentElement;
function setRemUnit() {
const htmlWidth = htmlEl.clientWidth;
const htmlFontSize = htmlWidth / 7.5;
htmlEl.style.fontSize = htmlFontSize + "px";
}
setRemUnit();
window.addEventListener("resize", setRemUnit);
这时 1rem = 100px,编写样式时 元素大小= (设计稿元素尺寸大小 / 100) rem。
响应式网站设计是一个网站能够兼容多个终端,而不是为每一个终端做一个特定的版本。基本原理是通过媒体查询
检测不同的设备屏幕尺寸做处理。页面头部必须有 meta 声明的 viewport:
<meta name="viewport" content=" -width,initial-scale=1,maximum-scale=1">
媒体查询是响应式 Web 设计的关键部分,因为它允许你按照视口的尺寸创建不同的布局,不过它也可以用来探测和你的站点运行的环境相关联的其它条件,比如用户是在使用触摸屏还是鼠标。
@media media-type and (media-feature-rule) {
/* CSS rules go here */
}
/* example */
@media screen and (max-width: 600px) {
body {
color: red;
}
}
@media
由以下部分组成:
media-type 主要包含如下类型:
type | 涵义 |
---|---|
all | 所有设备 |
braille | 盲文 |
embossed | 盲文打印 |
handheld | 手持设备 |
文档打印或打印预览模式 | |
projection | 项目演示,比如幻灯 |
screen | 彩色电脑屏幕 |
speech | 演讲 |
tty | 固定字母间距的网格的媒体,比如电传打字机 |
tv | 电视 |
一些复杂的媒体查询
@media screen and (min-width: 400px), screen and (orientation: landscape) {
body {
color: blue;
}
}
表示 body 的文字只会在视口至少为 400 像素宽,且设备横放时变为蓝色。
第一个视口是布局视口,在移动端显示网页时,由于移动端的屏幕尺寸比较小,如果网页使用移动端的屏幕尺寸进行布局的话,那么整
个页面的布局都会显示错乱。所以移动端浏览器提供了一个 layoutviewport 布局视口的概念,使用这个视口来对页面进行布局展示,一般 layoutviewport 的大小为 980px,因此页面布局不会有太大的变化,我们可以通过拖动和缩放来查看到这个页面。
第二个视口指的是视觉视口,visualviewport 指的是移动设备上我们可见的区域的视口大小,一般为屏幕的分辨率的大小。visualviewport 和 layoutviewport 的关系,就像是我们通过窗户看外面的风景,视觉视口就是窗户,而外面的风景就是布局视口中的网页内容。
第三个视口是理想视口,由于 layoutviewport 一般比 visualviewport 要大,所以想要看到整个页面必须通过拖动和缩放才能实现。所以又提出了 idealviewport 的概念,idealviewport 下用户不用缩放和滚动条就能够查看到整个页面,并且页面在不同分辨率下显示的内容大小相同。idealviewport 其实就是通过修改 layoutviewport 的大小,让它等于设备的宽度,这个宽度可以理解为是设备独立像素,因此根据 idealviewport 设计的页面,在不同分辨率的屏幕下,显示应该相同。
因为移动端浏览器默认的 viewport 叫做layoutviewport。在移动端显示时,因为layoutviewport 的宽度大于移动端屏幕的宽度,所以页面会出现滚动条左右移动,fixed 的元素是相对 layoutviewport 来固定位置的,而不是移动端屏幕来固定位置的,所以会出现感觉 fixed 无效的情况。
如果想实现 fixed 相对于屏幕的固定效果,我们需要改变的是 viewport 的大小为 idealviewport,可以如下设置:
<meta name="viewport" content=" -width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0, user-scalable=no"/>
“首选最小宽度”,指的是元素最适合的最小宽度。东亚文字(如中文)最小宽度为每个汉字的宽度。西方文字最小宽度由特定的连续的英文字符单元决定。并不是所有的英文字符都会组成连续单元,一般会终止于空格(普通空格)、短横线、问号以及其他非英文字符等。
如果想让英文字符和中文一样,每一个字符都用最小宽度单元,可以试试使用 CSS 中的 word-break:break-all
。
CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。通俗的说,CSS 预处理器用一种专门的编程语言,进行 Web 页面样式设计,然后再编译成正常的 CSS 文件。
预处理器例如:LESS、Sass、Stylus,用来预编译 Sass 或 lesscsssprite,增强了 css 代码的复用性,还有层级、mixin、变量、循环、函数等,具有很方便的 UI 组件模块化开发能力,极大的提高工作效率。
CSS 后处理器是对 CSS 进行处理,并最终生成 CSS 的预处理器,它属于广义上的 CSS 预处理器。我们很久以前就在用 CSS 后处理器了,最典型的例子是 CSS 压缩工具(如 clean-css)、Autoprefixer 等。
后处理器例如:PostCSS,通常被视为在完成的样式表中根据 CSS 规范处理 CSS,让其更有效。
加载性能:
选择器性能:
渲染性能:
可维护性、健壮性:
当动画低于 30hz 时,肉眼能明显感觉到卡顿,在 60hz 时表现非常平滑,另外,大部分显示器的刷新率也在 60hz,所以需要1秒刷新60次,即最小时间间隔为 1/60 = 0.0166秒。
样式系统从关键选择器开始匹配,然后左移查找规则选择器的祖先元素。只要选择器的子树一直在工作,样式系统就会持续左移,直到和规则匹配,或者是因为不匹配而放弃该规则。如果采用从左至右的方式读取 CSS 规则,那么大多数规则读到最后(最右)才会发现是不匹配的,这样做会费时耗能,最后有很多都是无用的;而如果采取从右向左的方式,那么只要发现最右边选择器不匹配,就可以直接舍弃了,避免了许多无效匹配。
base64 编码是一种图片处理格式,通过特定的算法将图片编码成一长串字符串,在页面上显示的时候,可以用该字符串来代替图片的
url 属性。
使用 base64 的优点是:
使用 base64 的缺点是:
• 在无损压缩的情况下,相同质量的 WebP 图片,文件大小要比 PNG 小 26%;
• 在有损压缩的情况下,具有相同图片精度的 WebP 图片,文件大小要比 JPEG 小 25%~34%;
• WebP 图片格式支持图片透明度,一个无损压缩的 WebP 图片,如果要支持透明度只需要22%的格外文件大小。但是目前只有 Chrome 浏览器和 Opera 浏览器支持 WebP。
var canvas = document.getElementById("canvas");
var dataURL = canvas.toDataURL();
console.log(dataURL);
// "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNby
// blAAAADElEQVQImWNgoBMAAABpAAFEI8ARAAAAAElFTkSuQmCC"
toDataURL(type, encoderOptions)
type
可选,图片格式,默认为 image/png
encoderOptions
可选,在指定图片格式为 image/jpeg 或 image/webp 的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。
chrome 表单自动填充后,input 文本框的背景会变成黄色的,chrome 会默认给自动填充的 input 表单加上 input:-webkit-autofill 私有属性:
input:-webkit-autofill {
background-color:rgb(250,255,189);
background-image:none;
color:rgb(0,0,0);
}
对 chrome 默认定义的 background-color,background-image,color 使用 important 是不能提高其优先级的,但是其他属性可使用。使用足够大的纯色内阴影来覆盖 input 输入框的黄色背景,处理如下:
input:-webkit-autofill , textarea:-webkit-autofill, select:-webkit-autofill {
-webkit-box-shadow: 0 0 0px 1000px white inset;
border: 1px solid #CCC!important;
}
在谷歌下 css 设置字体大小为 12px 及以下时,显示都是一样大小,都是默认 12px。
解决办法:
-webkit-text-size-adjust
的私有 CSS 属性来解决,只要加了 -webkit-text-size-adjust:none;
字体大小就不受限制了。但是 chrome 更新到 27 版本之后就不可以用了。所以高版本 chrome 谷歌浏览器已经不再支持-webkit-text-size-adjust 样式,所以要使用时候慎用。-webkit-transform:scale(0.5);
注意收缩的是整个元素的大小,这时候,如果是内联元素,必须要将内联元素转换成块元素。webkit 内核的私有属性:-webkit-font-smoothing
,用于字体抗锯齿,使用后字体看起来会更清晰舒服。在 MacOS 测试环境下面设置 -webkit-font-smoothing:antialiased;
但是这个属性仅仅是面向 MacOS,其他操作系统设置后无效。
<div style="display: table;width: 500px;height: 200px;">
<div style="display: table-cell;vertical-align: middle;">div>
div>
<div style="display:flex;justify-content: center; align-items:center; width: 500px;height: 200px;">
<div style="width: 100px;height: 100px">div>
div>
<div style="position:relative; width: 500px;height: 200px;">
<div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width: 100px;height: 100px;">div>
div>
<div style="position:relative; width: 500px;height: 200px;">
<div style="position:absolute;top:50%;left:50%;margin-left:-50px;margin-top:-50px;width: 100px;height: 100px;">div>div>
<div style="position:relative; width: 500px;height: 200px;">
<div style="position:absolute;top: 0;left: 0;right: 0;bottom: 0;margin: auto;width: 100px;height: 100px;">div>
div>
<div style="display: flex;width: 500px;height: 200px;">
<div style="margin: auto;width: 100px;height: 100px;">div>
div>
<div style="margin: 50vh auto 0;transform: translateY(-50%);width: 100px;height: 100px;">div>
关于 margin: auto:
Chrome 把 0.5px 四舍五入变成了 1px,而 firefox/safari 能够画出半个像素的边,并且 Chrome 会把小于 0.5px 的当成 0,而 Firefox 会把不小于 0.55px 当成 1px,Safari 是把不小于 0.75px 当成 1px。
div {
height: 1px;
transform: scaleY(0.5); /* 延Y轴缩小1倍 */
transform-origin: 50% 100%; /* 改变元素变形的原点 */
}
div {
height: 1px;
background: linear-gradient(0deg, #fff, #000);
}
div {
height: 1px;
background: none;
box-shadow: 0 0.5px 0 #000;
}
.svg {
background: none;
height: 1px;
background: url("data:image/svg+xml;utf-8,");
}
<meta name="viewport" content=" -width,initial-sacle=0.5">
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content=" -width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>title>
<style type="text/css">
/*.outer { height: 100vh; padding: 100px 0 0; box-sizing: border-box ; }
.A { height: 100px; margin: -100px 0 0; background: #BBE8F2; }
.B { height: 100%; background: #D9C666; }*/
/*.outer { height: 100vh; padding: 100px 0 0; box-sizing: border-box ; position: relative; }
.A { height: 100px; background: #BBE8F2; position: absolute; top: 0 ; left: 0 ; width: 100%; }
.B { height: 100%; background: #D9C666; }*/
.outer { height: 100vh; position: relative; }
.A { height: 100px; background: #BBE8F2; }
.B { background: #D9C666; width: 100%; position: absolute; top: 100px ; left: 0 ; bottom: 0; }
style>
head>
<body>
<div class="outer">
<div class="A">div>
<div class="B">div>
div>
body>
html>
<div class="box">
<div class="sub">
<p>ap>
div>
<div class="sub">
<p>bp>
<p>bp>
div>
<div class="sub">
<p>cp>
<p>cp>
<p>cp>
div>
div>
.box {
width: 600px;
overflow: hidden;
margin: 10px auto;
border: 1px solid #888;
}
.sub {
float: left;
width: 30%;
margin-right: 3%;
border: 1px solid orange;
padding-bottom: 9999px;
margin-bottom: -9999px;
}
带动画的滚动使用 scroll-snap,不过该属性兼容性不好。
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>CSS scroll snaptitle>
<style>
body {
margin: 0;
}
.container {
height: 100vh;
overflow-y: scroll;
/* 在父容器上面使用 scroll-snap-type 属性 */
scroll-snap-type: y mandatory;
}
section {
padding: 112px;
height: calc(100vh - 224px);
color: white;
/* 在需要滚动的容器上使用 scroll-snap-align 属性 */
scroll-snap-align: start;
}
section:nth-of-type(1) {
background-color: #60af15;
}
section:nth-of-type(2) {
background-color: #158baf;
}
section:nth-of-type(3) {
background-color: #af1581;
}
section h3 {
font-size: 48px;
}
section p {
font-size: 20px;
}
style>
head>
<body>
<div class="container">
<section>
<h3>A subtitle lives hereh3>
<p>
A
p>
section>
<section>
<h3>A subtitle lives hereh3>
<p>
B
p>
section>
<section>
<h3>A subtitle lives hereh3>
<p>
C
p>
section>
div>
body>
html>
一个简单版的视差滚动:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>视差滚动title>
<style>
.scene{
position: absolute;
width: 100%;
height: 100%;
}
.scene img{
position: absolute;
display: block;
border:1px solid #ccc;
border-radius: 5px;
box-shadow: 0 0 5px #ccc;
}
#pokemon1{
width: 150px;
top: 200px;
left: 50px;
}
#pokemon2{
width: 300px;
left: 800px;
top: 450px;
}
#pokemon3{
top: 600px;
left: 150px;
}
#pokemon4{
width: 200px;
left: 800px;
top: 400px;
}
#pokemon5{
width: 300px;
left: 500px;
top: 500px;
}
#pokemon6{
top: 1200px;
}
#pokemon7{
width: 150px;
left: 250px;
top: 550px;
}
#pokemon8{
width: 300px;
left: 100px;
top: 900px;
}
#pokemon9{
top: 1400px;
left: 400px;
}
style>
head>
<body>
<div id="scene_back" class="scene">
<img id="pokemon1" src="images/1.jpg">
<img id="pokemon4" src="images/4.jpg">
<img id="pokemon7" src="images/7.jpg">
div>
<div id="scene_center" class="scene">
<img id="pokemon2" src="images/2.jpg">
<img id="pokemon5" src="images/5.jpg">
<img id="pokemon8" src="images/8.jpg">
div>
<div id="scene_front" class="scene">
<img id="pokemon3" src="images/3.jpg">
<img id="pokemon6" src="images/6.jpg">
<img id="pokemon9" src="images/9.jpg">
div>
<script>
var sceneBack = document.getElementById('scene_back'),
sceneCenter = document.getElementById('scene_center'),
sceneFront = document.getElementById('scene_front');
//每个div层的初始top值
var old_top1 = 0,
old_top2 = 200,
old_top3 = 700;
addEvent(window,'scroll',onScroll);
onScroll();
function onScroll(e){
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
// 让每个层的top值变化不一样,从而达到运动速度上的视差效果
sceneBack.style.top = old_top1+scrollTop*.9+'px';
sceneCenter.style.top = old_top2+scrollTop*.7+'px';
sceneFront.style.top = old_top3+scrollTop*.3+'px';
}
//浏览器兼容
function addEvent(eventTarget, eventType, eventHandler) {
if (eventTarget.addEventListener) {
eventTarget.addEventListener(eventType, eventHandler, false);
} else {
if (eventTarget.attachEvent) {
eventType = "on" + eventType;
eventTarget.attachEvent(eventType, eventHandler);
} else {
eventTarget["on" + eventType] = eventHandler;
}
}
}
script>
body>
html>
/*1.第一种方式是利用 vw 来实现*/
.square {
width: 10%;
height: 10vw;
background: tomato;
}
/*2.第二种方式是利用元素的 margin/padding 百分比是相对父元素 width 的性质来实现*/
.square {
width: 20%;
height: 0;
padding-top: 20%;
background: orange;
}
/*3.第三种方式是利用子元素的 margin-top 的值来实现的*/
.square {
width: 30%;
overflow: hidden;
background: yellow;
}
.square::after {
content: "";
display: block;
margin-top: 100%;
}
/*实现原理参考自适应正方形和水平居中方式*/
.box {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
margin: auto;
width: 10%;
height: 0;
padding-top: 20%; /* padding 或者 margin 竖直方向的属性是相对于包含块的宽度 */
background: tomato;
}