19年,学习了不少的css
的知识,特别是张鑫旭老师的css世界
、css选择器世界
这两本书真的受益不浅,以致于颠覆了我对css
的认知,不由感叹 ,css
真的太深了;什么样的状况该用什么方式去处理?那种处理方式合理?怎样才能加快浏览器的渲染性能?都没有确定的答案,这就是css
的魅力;除了积累大量的知识外,我的感受想象力也很重要css
在这里整理了一部分,主要是我以为算比较有用的一些知识点跟技巧html
user-select: all
user-select
支持哪些属性,点击连接查看git
在网页中,可能会遇到这种状况,用户但愿便于复制网页中的内容,此属性能够做为加强用户体验写在 css
里,只须要单击行为便可选中,也能够做用于table
中github
<table>
<tr>
<td>我有一头小毛驴</td>
<td>历来也不骑</td>
<td>11111</td>
<td>11111</td>
<td>11111</td>
</tr>
</table>
复制代码
table {
border: 1px solid;
width: 400px;
}
td {
border: 1px solid;
user-select: all;
}
复制代码
scroll-behavior
(让滚动更平滑)当用户手动导航或者 CSSOM scrolling API
触发滚动操做时,css
属性 scroll-behavior
为一个滚动框指定滚动行为,其余任何的滚动,例如那些因为用户行为而产生的滚动,不受这个属性的影响。在根元素中指定这个属性时,它反而适用于视窗。浏览器
支持两个值:函数
auto
//当即滚动,默认值布局
smooth
//平滑滚动性能
上面是 MDN
上对scroll-behavior
的定义,简单解释一下;手动导航:很容易想到的是锚点跳转学习
CSSOM
:例如scrollX
、scrollTop
、scrollLeft
等 Dom
属性发生改变的时候也会受到影响flex
兼容性:通常,能够做为一个增长用户体验写到须要平滑滚动的容器上,对于不支持的浏览器也不影响
...{scroll-behavior:smooth;}
复制代码
attr()
函数用法: 经过 css
属性获取 html
标签中的类容,attr
的值只能接受字符串,因此目前主要的用途就是提示类容
<div data-tooltip="你是猪">
你是猪吗?
</div>
复制代码
div {
position: relative;
width: 100px;
}
div:hover::after {
content: attr(data-tooltip);
position: absolute;
width: 200%;
line-height: 30px;
left: 100%;
top: 0;
border: 1px solid;
}
复制代码
先区分一下伪类跟伪元素,在 css
规范中,伪元素使用的是两个冒号(::),伪类是一个
:empty
选择没有子元素的元素,并且该元素也不包含任何文本节点(包括空格);在网页中有时候咱们但愿没有类容就不显示,或者显示其余的样式,以前都是 v-if、条件判断
<p class="text"></p>
<p class="text">此处有文字。。。。。。</p>
复制代码
.text {
font-size: 24px;
border: 1px solid;
margin-top: 20px;
}
.text:empty {
display: none;
}
复制代码
:focus-within
表示一个元素得到焦点或该元素的后代元素得到焦点。换句话说,元素自身或者它的某个后代匹配:focus
<div class="content">
<input type="text" />
</div>
复制代码
.content:focus-within {
background-color: pink;
}
复制代码
:valid
(实现一个谷歌帐号登陆框的效果):valid
选择器在表单元素的值须要根据指定条件验证时设置指定样式,结合required="true"
还有一个相反的选择器 :invalid
<div class="password">
<input type="password" required="true" />
<div class="place">输入您的密码</div>
</div>
复制代码
.password {
border-radius: 4px;
color: #202124;
font-size: 17px;
border: 1px solid #999;
display: inline-block;
padding: 1px;
position: relative;
}
.password input {
width: 200px;
height: 28px;
outline: none;
border: none;
padding: 12px 14px;
}
.password .place {
background-color: #fff;
font-size: 16px;
position: absolute;
left: 8px;
top: 15px;
color: #80868b;
transition: all 0.2s;
pointer-events: none;
}
.password input:focus ~ .place {
top: -10px;
}
.password input:valid ~ .place {
top: -10px;
}
复制代码
除了:valid
,:placeholder-shown
这个选择器也能够实现这个效果,这个选择器在input
或textarea
显示placeholder text
的时候生效
另外一个适用场景:当输入框的字段为非空的时候显示搜索按钮
pointer-events
为none
时,任何事件均可以从该容器穿透过去
:focus-visible
一个比较新的选择器,目前只有谷歌浏览器支持
当元素匹配:focus
伪类而且客户端,也就是浏览器的启发式引擎决定焦点应当可见时,:focus-visible
伪类将生效
在input
、button
、textarea
等元素使用鼠标点击的时候会有焦点轮廓,通常的处理方式是设置outline: none
,可是会把键盘访问时出现的焦点轮廓也隐藏掉,会影响网页的无障碍访问
:focus-visible
可让咱们知道元素的聚焦行为究竟是鼠标触发仍是键盘触发。因此,若是咱们但愿去除鼠标点击时候的outline
轮廓,而保留键盘访问时候的outline
轮廓
:focus:not(:focus-visible) {
outline: 0;
}
复制代码
padding
&margin
<div class="wrap">
<div class="leftbox">leftBoxleftBoxleftBoxleftBoxleftBoxleftBoxleftBoxleftBoxleftBoxleftBoxleftBox</div>
<div class="right-box">很过度很过度很过度很过度很过度</div>
</div>
复制代码
.wrap{
overflow: hidden;
width: 400px;
}
.wrap div{
float: left;
width: 50%;
padding-bottom: 9999px;
margin-bottom: -9999px;
word-wrap: break-word;
}
.left-box{
background-color: pink;
}
.right-box{
background-color: #476EAF;
}
复制代码
知识点:padding-bottom
会改变元素自身的高度,同时外层盒子的高度也会跟着改变;margin-bottom
不会改变元素自身的位置,能够改变外层盒子的高度;父元素须要设置overflow: hidden
table-cell
它会做为一个表格单元格显示,相似于td
、th
,表格自己就有等高的特色
兼容性ie8+
回顾一下table-cell
,能够说是一个很神奇的属性,为何这么说,它能解决不少布局问题
一、多列文字垂直居中
二、自适应布局
三、元素垂直居中
默认值就是等高布局,主要的两个属性
一、flex-direction
:定义主轴方向,默认值为row
二、align-item
:定义侧轴对齐方式,默认值stretch
,元素拉伸以适应容器
grid
网格布局(跟flex有点相似)
nofollow
nofollow
是HTML
页面中a
标签的属性值。这个标签的意义是告诉搜索引擎"不要追踪此网页上的连接或不要追踪此特定连接",用于网站seo
优化
好比在href
值为电话号码的时候
<a href="tel:138888888" rel="nofollow">138888888</a>
复制代码
<div class="lines"></div>
复制代码
.lines{
width: 60px;
height: 10px;
background-color: #000000;
background-clip: content-box;
padding: 10px 0;
border-top: 10px solid;
border-bottom: 10px solid;
}
复制代码
知识点:background-clip
,该属性有三个值,border-box、padding-box、content-box;
border-box:背景被裁剪到边框盒
padding-box:背景被裁剪到内边距框
content-box:背景被裁剪到内容框
<div class="vertical-middle">
<span>你是猪吗</span>
</div>
复制代码
.vertical-middle{
height: 400px;
width: 100%;
border: 1px solid red;
font-size: 40px;
}
.vertical-middle::before{
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
}
.vertical-middle span{
background-color: #0099FF;
font-size: 40px;
}
复制代码
border-radius
的8个值border-radius:10px 10px 10px 10px/10px 10px 10px 10px;
/* x轴 上 右 下 左 / y轴 上 右 下 左
复制代码
有一个很好用的可视化调试网站,border-radius
q
标签给文本添加先后引号<q>文字文字文字</q>
复制代码
q{
quotes: '"' '"'
}
复制代码
浏览器节点实际是添加了::before
和::after
这两个伪元素
css
中::seleection
为空会致使文本或元素没法选中.select::selection{}/* 连接导入css */
复制代码
<div class="select">123456</div>
复制代码
应该是css
中的一个bug
,通常不会出现这种状况,注意一下就好
margin
或padding
百分比当margin
或padding
设置百分比时,其值是相对于最近的块级父元素的百分比,为何呢,在css
权威指南中的解释:若是是相对于父元素的高度,其高度计算会致使死循环,子元素的高度有可能会改变父元素的高度
具体用处
让盒子的高度等于宽度,并跟随宽度变化
.container{
background-color: pink;
width: 100%;
padding-top: 100%;
}
复制代码
一点猜测:
元素的高度百分比是相对于父元素的height
的,那么高度为何不会出现死循环,尝试了一下,在父元素高度不固定的状况下,就是其值为auto
的时候,子元素的百分比就不起所用了,高度为0,设置min-height
的时候也没用
css
的另外一个函数calc()
定义:calc()
函数用于动态计算长度值
用法:运算符先后都须要保留一个空格;任何长度值均可以使用calc()
函数进行计算;calc()
函数支持 "+", "-", "*", "/" 运算;calc()
函数使用标准的数学运算优先级规则
兼容性很好,支持ie8+
,主流浏览器基本都支持
应用比较灵活,列举几个比较经常使用到的地方
一、自适应布局,好比左边固定右边自适应
二、在不依靠box-sizing的状况下,设置元素的margin,达到盒子自适应宽度的做用
三、垂直或者水平居中
。。。等等等
clip-path
建立一个只有元素的部分区域能够显示的剪切区域,区域内的部分显示,区域外的隐藏
语法就不详细介绍了
有一个网站能够制造不少好看的图形,clip-path
var()
基本用法:
element {
ba-color: #fff;
}
复制代码
做用在当前的层级,若没有定义,则从其父元素继承其值
使用:
element {
background-color: var(ba-color);
}
复制代码
主要能解决什么问题?
一、能够减小重复性的css
二、提升可维护性
三、网站换肤功能
......
例子:
a {
--link: hsl(230, 60%, 50%);
--link-visited: hsl(290, 60%, 50%);
--link-hover: hsl(230, 80%, 60%);
--link-active: hsl(350, 60%, 50%);
}
a:link {
color: var(--link);
}
a:visited {
color: var(--link-visited);
}
a:hover {
color: var(--link-hover);
}
a:active {
color: var(--link-active);
}
复制代码
<div class="card">
<h1>title</h1>
<p>蚊子蚊子蚊子蚊子蚊子蚊子蚊子蚊子蚊子蚊子蚊子蚊子蚊子</p>
<a>more</a>
</div>
复制代码
.card{
width: 300px;
height: 400px;
background-color: #000;
color: #fff;
padding: 20px;
position: relative;
}
.card a{
width: 80px;
line-height: 40px;
display: inline-block;
border: 1px solid;
padding: 0 20px;
text-align: center;
cursor: pointer;
}
.card a::after{
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
复制代码
<div class="text">
安东尼18分 甜瓜<a>手刃火箭</a>旧主绝不手软高效迎掌声
1月16日讯 NBA常规赛,开拓者客场117-107打败火箭。
此役,前锋安东尼面对旧主<a>绝不手软</a>,他10投7中,高效贡献18分12篮板。
</div>
复制代码
.text{
width: 300px;
font-size: 20px;
line-height: 30px;
}
.text a{
box-shadow: inset 0 -0.07em 0 #A2A9B6;
transition: all .2s;
cursor: pointer;
}
.text a:hover{
box-shadow: inset 0 -0.8em 0 #A2A9B6;
}
复制代码
text-align: justify
实现两端对齐<div class="textAlign">
<span class="list"></span>
<span class="list"></span>
<span class="list"></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
复制代码
.textAlign{
width: 800px;
height: 200px;
text-align: justify;
background-color: #BBBBBB;
}
.textAlign span{
width: 200px;
display: inline-block;
}
.textAlign .list{
height: 100px;
background-color: #0099FF;
}
复制代码
text-align
对最后一行不会产生效果;因此只有在list后面添加足够多的占位标签
object-fit
控制图片的显示方式contain
缩放以保持原比例
cover
保持原比例的同时,填满容器,会出现被剪裁的状况
fill
不保持原比例,填满容器,会被拉伸
none
保持其原有的尺寸
scale-down
内容的尺寸与 none
或 contain
中的一个相同,取决于它们两个之间谁获得的对象尺寸会更小一些
css
中的四个角度单位一、deg
度,一圈是360度
二、grad
梯度,一圈是400梯度
三、rad
弧度,一圈是2π弧度
四、turn
一圈
换算公式
90deg = 100grad = 0.25turn ≈ 1.570796326794897rad