基础理论
元素的显示与暗藏
依据不同的需要抉择暗藏计划
如果心愿元素不可见,同时不占据空间,辅助设施无法访问,同时不渲染,应用script标签暗藏
<script type="text/html"> <img src="./img/55.png" /></script>
获取数据的办法应用 document.querySelector('script').innerHTML
如果心愿元素不可见,同时不占据空间,辅助设施无法访问,但资源有加载,DOM可拜访,则能够间接应用display:none暗藏
.dn{ display:none;}
如果心愿元素不可见,同时不占据空间,辅助设施无法访问,但显隐的时候能够有transition淡入淡出成果
.hidden { position: absolute; visibility: hidden;}
如果心愿元素不可见,不能点击,辅助设施无法访问,但占据空间保留则能够应用visibility:hidden
暗藏
.vh { visibility: hidden;}
如果心愿元素不可见,不能点击,不占据空间,但键盘可拜访,则能够应用clip裁剪暗藏
.clip { position: absolute; clip: rect(0 0 0 0);}
案例:1.请帖生成封面。2.键盘应用快捷键但不显示按钮(应用 accesskey
)
如果心愿元素不可见,不能点击,但占据空间,且键盘可拜访,则能够应用relative暗藏。如果条件容许,也就是上一层层叠上下文之间设置了背景色,则能够应用更敌对的z-index负值暗藏
.out { position: relative; left:-999em;}.lower { position: relative; z-index: -1;}
如果心愿元素不可见,但能够点击,而且不占据空间,则能够应用透明度
.opacity { position: absolute; opacity: 0;}
如果心愿元素不可见,但地位保留,仍然能够点能够选,则间接让透明度为0
.opacity{ opacity: 0;}
如果心愿元素在显示时有一个 transition
动画,能够应用 max-height
进行暗藏
.hidden { max-height: 0; overflow: hidden;}
display与元素的显隐
根底理解:无奈点击,无奈应用屏幕阅读器等辅助设施拜访,占据空间隐没
深层理解:img标签上或父元素设置 display:none
都会加载资源。然而 background-image
申请的资源在该标签上或父元素设置 display:none
都不会加载资源(safari和chrome验证),在计数中设置了display:none的元素不被计入。会对 IntersectionObserver
造成影响
visibility与元素的显隐
根底理解:无奈点击,无奈应用屏幕阅读器等辅助设施拜访,占据空间不隐没
深层理解:visibility
具备继承性,父级设置 visibility:hidden
后子级能够设置 visibility:visible
显示子元素。设置了 visibility:hidden
的元素会加载img资源也会加载 background-image
资源。同时也会被纳入计数。visibility
属性被纳入 transition
的范畴内,因而可利用该属性展现元素从暗藏到显示的过渡成果。然而该属性不会对 IntersectionObserver
造成影响,也就是说如果弹窗是从暗藏到显示应用了该属性的话,对它进行埋点是有效的。
文本的换行
word-break
当行尾放不下一个单词时,决定单词外部该怎么摆放(决定一直行单词的长度)
nomal:默认值,默认的换行规定(CJK文本断行,英文单词一直行,空格断行)
break-all:对于non-CJK(中日韩)文本,可在任意中央断行
keep-all:CJK文本一直行,non-CJK文本表现形式如同nomal
word-wrap
是用来阐明当一个不能被离开的字符串太长而不能填充其包裹盒时,为避免其溢出,浏览器是否容许这样的单词断词(没有换行点的单词在句尾放不下时,决定单词是否断词)
nomal:默认值,行只能在失常的单词断点处中断。(例如两个单词之间的空格)。
break-word:示意如果行内没有多余的中央包容该单词到结尾,则那些失常的不能被宰割的单词会被强制宰割换行。
white-space
如何解决元素中的空白
nomal:默认值,间断的空白符被合并,换行符被当做空白符解决
nowrap:间断的空白符被合并,文本内的换行符有效(
无效)
pre:间断的空白符会被保留,在遇到换行符或者
元素时才会换行
pre-wrap:间断的空白符会被保留,在遇到换行符或者
元素,或者为了填充行框盒子(line-box)时才会换行
pre-line:间断的空白符会被合并,在遇到换行符或者
元素,或者为了填充行框盒子(line-box)时才会换行
line-break
中文标点的换行规定,比方。是避首标点,《是避尾标点,通过此属性管制CJK文本标点的换行规定
auto:应用默认的换行规定。
loose: 应用限制性最小的换行规定分隔文本。通常用于短行,如在报纸上。
normal:应用最一般的换行规定。
strict: 应用最严格的换行规定。
anywhere:任意地位都能够作为换行点,包含任意的标点。
<wbr>
这是html元素,宽度不够,在我这里换行;宽度足够,还是一行显示
实现原理
wbr::after{ content: '\00200B'}
光标属性cursor
https://developer.mozilla.org...
flex子项最终尺寸计算规定
一个flex子项的最终尺寸是根底尺寸(或内容尺寸),弹性增长或膨胀,最大最小尺寸独特作用的后果
最终尺寸计算的优先级是:
最大最小尺寸限度 > 弹性增长或膨胀 > 根底尺寸
- 根底尺寸有
flex-basis
属性或width
属性,以及box-sizing
盒模型独特决定 - 内容尺寸指最大内容宽度,当没有设置根底尺寸时会顶替根底尺寸的角色
- 弹性增长指的是
flex-grow
属性,弹性膨胀指的是flex-shrink
属性 - 最大尺寸次要受
max-width
属性显示;最小尺寸受最小内容宽度,width
属性和min-width
属性独特影响
flex容器:
flex-wrap:nowrap;
flex-direction:row;
justify-content:flex-start;
align-items:stretch;为默认值flex: 0 1 auto 这是flex子项的默认值,代表flex-grow:0,flex-shrink:1,flex-basis: auto
最小尺寸计算规定
- 如果
min-width
属性值不是auto
,则元素的最小尺寸就是就是min-width
的属性值,此时width
属性无奈影响最小尺寸,哪怕width
的属性值大于min-width
的属性值。 - 比拟
width
的属性的计算值和最小内容宽度的大小,较小的值就是元素的最小尺寸。 - 如果
width
的属性值和min-width
的属性值均为auto
,则元素的最小尺寸就是最小内容宽度。 - 如果flex子项设置了
overflow:hidden
,且最小尺寸是由是否最小内容宽度决定的,则最小尺寸有效。
根底尺寸计算规定
- 如果
flex-basis
属性和width
属性同时设置了具体的数值,width
属性值会被疏忽,优先应用flex-basis
作为根底尺寸。 - 如果
flex-basis
的属性值是初始值auto
,则会应用width
属性设置的长度值作为根底尺寸。 - 如果
flex-basis
和width
的属性值都是auto
,则会应用flex子项的最大内容宽度作为根底尺寸
弹性增长或膨胀何时作用
- 如果容器尺寸足够并且子元素的属性值蕴含
flex-grow
不为0则启用弹性增长规定 - 容器尺寸足够:在容器
flex-wrap:wrap
状态下,n个子元素的根底尺寸相加宽度少于容器宽度,n+1个子元素的根底尺寸相加大于容器,且这n个子元素中具备flex-grow
不为0的元素,则这n个子元素具备弹性增长的条件。在容器flex-wrap:nowrap
状态下,所有子元素根底尺寸相加宽度少于容器宽度。 - 如果容器尺寸有余并且子元素的属性值蕴含
flex-shrink
不为0则启用弹性膨胀规定 - 容器尺寸有余:在容器
flex-wrap:wrap
状态下,子元素的根底尺寸大于容器宽度,且子元素的flow-shrink
不为0,则这个子元素具备弹性膨胀条件。在容器flex-wrap:nowrap
状态下,所有子元素的根底宽度少于容器宽度,且至多有一个子元素的flex-shrink
不为0,则flex-shrink
不为0的子元素具备弹性膨胀条件。 - 弹性增长,增长的局部是可调配空间,计算规定是容器宽度-元素根底尺寸
- 弹性膨胀,膨胀的局部是有
flex-shrink
不为0元素的宽度,最多能够膨胀至元素最小尺寸。
最终尺寸计算规定-总结
- 如果没有弹性膨胀或增长,则元素在最大尺寸和最小尺寸范畴内应用根底尺寸
- 如果元素可能弹性增长或膨胀,在容器宽度足够的状况下应用弹性增长规定,在容器宽度有余的状况下应用弹性膨胀规定,同一行只可能利用一种规定
选择器
选择器优先值计算
选择器 | 计算值 | 计算细则 |
---|---|---|
* {} | 0 | 1个0级统配选择器,优先级数值为0 |
dialog {} | 1 | 1个1级标签选择器,优先级数值为1 |
ui > li {} | 2 | 2个1级标签选择器,1个0级选择器,优先级数值为2 |
li > ol + ol {} | 3 | 3个1级标签选择器,2个0级选择器,优先级数值为3 |
.foo {} | 10 | 1个2级类名选择器,优先级数值为10 |
a:not([rel=nofollow]) {} | 11 | 1个2级属性选择器,1个1级标签选择器,1个0级否定伪类,优先级数值为11 |
a:hover {} | 11 | 1个1级标签选择器,1个2级伪类,优先级数值为11 |
ol li.foo {} | 12 | 2个1级标签选择器,1个2级类名选择器,优先级数值为12 |
li.foo.bar {} | 21 | 1个1级标签选择器,2个2级类名选择器,优先级数值为21 |
#foo {} | 100 | 1个3级ID选择器,优先级数值为100 |
#foo .bar p {} | 111 | 1个3级ID选择器,1个2级类名选择器,1个1级标签选择器,优先级数值为111 |
雷同计算值下遵循青出于蓝准则,前面的优先级更高
命名灵感
从HTML标签寻找灵感
.cs-module-header {}.cs-module-body {}.cs-module-aside {}.cs-module-main {}.cs-module-nav {}.cs-module-section {}.cs-module-content {}.cs-module-summary {}.cs-module-detail {} // 详情.cd-module-option {}.cs-module-img {}.cs-module-footer {}.cs-module-ui {}.cs-module-li {} // 列表子项.cs-module-a {} // 链接.cs-module-g {} // 组.cs-module-desc {} // 形容.cs-module-x {} // 容器盒子
从HTML特定属性值中寻找灵感
.cs-radio {}.cs-checkbox {}.cs-range {}.cs-tspan-email {}.cs-tspan-number {}.cs-tspan-color {}.cs-tspan-tel {}.cs-tspan-date {}.cs-tspan-url {}.cs-tspan-time {}.cs-tspan-file {}
从无障碍拜访的role属性值中寻找灵感
.cs-grid {}.cs-grid-cell {}.cs-log {}.cs-menu {}.cs-menu-bar {}.cs-menu-item {}.cs-region {} // 不能被其余role形容,然而很重要的局部.cs-banner {} // 横幅广告.cs-slider {}.cs-tab {}.cs-tab-list {}.cs-tab-pannel {}.cs-tooltip {}.cs-tree {}
从CSS伪类和HTML布尔属性中寻找灵感
.active {}.disabled {}.selected {}.checked {}.invalid {} // 出错状态
体验优化
图片加载失败体验优化
<img src="xxx.png" alt="图片封面" onerror="this.classList.add('error');">img.error { display: inline-block; transform: scale(1); content: ''; color: transparent;}/* 替换图片 */img.error::before { content: ''; position: absolute; left: 0; top: 0; width: 100%; height: 100%; background: #f5f5f5 url(break.svg) no-repeat center / 50% 50%;}/* alt 提醒 */img.error::after { content: attr(alt); position: absolute; left: 0; bottom: 0; width: 100%; line-height: 2; background-color: rgba(0,0,0,.5); color: white; font-size: 12px; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;}
点击体验优化
挪动端按钮可点击范畴放大
.mobi-btn { border: 8px solid transparent;}
键盘体验优化
可拜访性-焦点管制
tabindex = "-1"
元素能够被鼠标或JS focus但不能被键盘focus
tabindex = "0"
最初一个被focus的元素
tabindex >= "1"
越小优先级越高
若进入网页没有点击则依照1,2,...,0
若点击则定位到点击的主体,按下tab寻找到第一个有focus的元素,再次按下依据该元素的tabindex寻找下一个焦点
:focus-visible
让咱们晓得元素的聚焦行为是键盘触发还是鼠标触发
// 鼠标触发:focus:not(:focus-visible) {}// 键盘触发:focus:focus-visible {}
以后取得焦点的元素
document.activeElement
检测文档是否获取了焦点
document.hasFocus()
滚动体验优化
overscroll-behavior
overscroll-behavior: [ contain | none | auto ]{1,2}
当只有一个值时代表程度垂直方向都是该值,有两个值时第一个代表程度方向第二个代表垂直方向
auto:滚动到边缘后持续滚动内部的可滚动容器
contain:默认的滚动溢出行为只会体现在以后元素的外部,不会对相邻的滚动区域进行滚动。
none:相邻的滚动区域不会产生滚动,并且会阻止默认的滚动溢出行为。
scroll-behavior
在可滚动的容器上应用,罕用于达到顶部
auto:默认值
smooth:平滑滚动,与 ant-design
的 scrollToFirstError
搭配成果佳
overflow-anchor
auto: 默认值,该行为会调整地位以最大水平的缩小内容偏移(例如上方图片的忽然加载会无感知)
none:退出浏览器滚动锚定行为
暗藏滚动条,同时元素可滚动
.scroll-none { scrollbar-width: none;}// chrome 公有办法.scroll-none::-webkit-scrollbar { width:0; height:0;}
跳转体验优化
PC端跳转同一个地址不创立新的tab页
<a href="https://www.baidu.com" target="bd">点击进入百度</a>
target雷同时会指向同一个tab页
输出体验优化
cater-color属性扭转插入光标色彩
cater-color: red
挪动端唤起数字键盘
验证码:<input inputmode="numeric">
拉伸行为体验优化
rezize
none: 默认值,没有拉伸成果,能够用来种植 textarea
元素默认的拉伸行为
both:既能够程度方向拉伸,也能够垂直方向拉伸
horizontal:仅能够程度方向上拉伸
vertical:仅能够垂直方向上拉伸
失效条件
块级元素且 overflow
的属性值不是 visible
限度拉伸范畴
应用 max-width,max-height,min-width,min-height
属性
抉择行为体验优化
user-select
text:默认值,文字和图片能够被选中
none:禁止图文被选中
all:被低估的一个属性值,设置了该属性的图文内容都会被选中
::selection
被选中时伪类,全局设置时可设置品牌色彩为背景,适合色彩为字体色彩
::selection { color: hunlijiColor; background: hunlijuBackgroundColor;}
刷新体验优化
刷新时滚动条回到顶部
if (history.scrollRestoration) { history.scrollRestoration = 'manual';}
打印行为体验优化
管制打印款式的媒体查问
@media print { header{ display:none; }}
是否进行准确打印
color-adjust
economy:默认值,可能会将背景不打印
exact:准确打印
table{ -webkit-print-color-adjust: exact; color-adjust: exact;}
使该元素另起一页打印
break-before:page
性能优化
will-change
will-change
的作用有两个,一个是创立合成层,一个在真正的行为触发之前通知浏览器:“我要变动了,你要做好筹备”
如何正确的应用
will-change
不应该被设置在默认状态中且须要及时销毁,现实中的利用场景应该是 hover
状态下
// good.will-change-parent:hover .will-change{ will-change:transform;}.will-change { transition: transform 0.3s;}.will-change:hover { transform: scale(1.5)}// bad.will-change { transition: transform 0.3s;}.will-change:hover{ will-change: transform; transform: scale(1.5);}
如果点击按钮,某个元素执行动画,先执行的是 mousedown
事件,之后执行的是 click
事件
dom.onmousedown = function() { target.style.willChange = 'transform'}dom.onclick = function() { // target元素执行动画}target.onanimationend = function() { // 动画完结,用回调函数移除will-change属性 this.style.willChange = 'auto'}
创立合成层
无奈复制加载中的内容
- 合成层的位图会交由
GPU
合成,比CPU
解决要快得多 - 当须要
repaint
时,只须要repaint
自身,不会影响其余层 - 元素晋升为合成层后,
transform
和opacity
不会触发repaint
,如果不是合成层则依旧会触发repaint
防止隐式创立合成层及优化
合成层比拟占用内存,如果一个合成层的宽高为100px 100px,则合成层占用内存的计算形式为100100*3 = 30000Byte = 30KB
当元素交叠,处在下方的元素成为了合成层,上方的元素隐式变成了合成层
- 能够将必须合成层的层级晋升至较高层级,则其余交叠层级没有该层级高就不会隐式创立合成层
- 动画应用
transform
实现,一方面如果不波及到translateZ
则不会创立合成层,一方面生成层叠上下文不会影响到别的层叠上下文渲染 - 通过缩小宽高再进行
scale
放大的形式能够无效缩小合成层应用的内存
SEO
H1标签一个页面只能用一个
同一网页通过多个网址拜访指定标准网址
<link rel="canonical" href="http://www.hunliji.com/merchant/detail_1378">
关键词
<meta data-hid="keywords" name="keywords" content="关键词1,关键词2">
详细描述
<meta data-hid="description" name="description" content="形容内容,字数在0-200字为佳">
不须要抓取的链接nofollow
<a href="www.baidu.com" rel="nofollow">
指定为内部链接external
<a href="www.baidu.com" rel="external nofollow">
指定页面图标
<link rel="icon" type="image/png" href="/path/to/icons/favicon-16x16.png" sizes="16x16"><link rel="icon" type="image/png" href="/path/to/icons/favicon-32x32.png" sizes="32x32">
很少用的属性
将中文简体转换为繁体
苹方字体无效,老老实实做i18n吧哈哈
font-variant-east-asian: traditional;