2019 年知识总结-css 篇

maik-jonietz-535261-unsplash-1-1024x683.jpg

​ 19年,学习了不少的css的知识,特别是张鑫旭老师的css世界css选择器世界这两本书真的受益不浅,以致于颠覆了我对css的认知,不由感叹 ,css真的太深了;什么样的状况该用什么方式去处理?那种处理方式合理?怎样才能加快浏览器的渲染性能?都没有确定的答案,这就是css的魅力;除了积累大量的知识外,我的感受想象力也很重要css

在这里整理了一部分,主要是我以为算比较有用的一些知识点跟技巧html

1.user-select: all

user-select 支持哪些属性,点击连接查看git

在网页中,可能会遇到这种状况,用户但愿便于复制网页中的内容,此属性能够做为加强用户体验写在 css里,只须要单击行为便可选中,也能够做用于tablegithub

<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;
}
复制代码

2.scroll-behavior(让滚动更平滑)

当用户手动导航或者 CSSOM scrolling API 触发滚动操做时,css 属性 scroll-behavior 为一个滚动框指定滚动行为,其余任何的滚动,例如那些因为用户行为而产生的滚动,不受这个属性的影响。在根元素中指定这个属性时,它反而适用于视窗。浏览器

支持两个值:函数

auto //当即滚动,默认值布局

smooth //平滑滚动性能

上面是 MDN 上对scroll-behavior的定义,简单解释一下;手动导航:很容易想到的是锚点跳转学习

CSSOM:例如scrollXscrollTopscrollLeftDom 属性发生改变的时候也会受到影响flex

兼容性:通常,能够做为一个增长用户体验写到须要平滑滚动的容器上,对于不支持的浏览器也不影响

...{scroll-behavior:smooth;}
复制代码

3.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;
}
复制代码

4.伪类选择器

先区分一下伪类跟伪元素,在 css 规范中,伪元素使用的是两个冒号(::),伪类是一个

4.1 :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;
}
复制代码

4.2 :focus-within

表示一个元素得到焦点或该元素的后代元素得到焦点。换句话说,元素自身或者它的某个后代匹配:focus

<div class="content">
  <input type="text" />
</div>
复制代码
.content:focus-within {
  background-color: pink;
}
复制代码

4.3 :valid(实现一个谷歌帐号登陆框的效果)

:valid 选择器在表单元素的值须要根据指定条件验证时设置指定样式,结合required="true"

还有一个相反的选择器 :invalid

1.gif

<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 这个选择器也能够实现这个效果,这个选择器在inputtextarea显示placeholder text 的时候生效

另外一个适用场景:当输入框的字段为非空的时候显示搜索按钮

pointer-eventsnone时,任何事件均可以从该容器穿透过去

4.4 :focus-visible

一个比较新的选择器,目前只有谷歌浏览器支持

当元素匹配:focus伪类而且客户端,也就是浏览器的启发式引擎决定焦点应当可见时,:focus-visible伪类将生效

inputbuttontextarea等元素使用鼠标点击的时候会有焦点轮廓,通常的处理方式是设置outline: none,可是会把键盘访问时出现的焦点轮廓也隐藏掉,会影响网页的无障碍访问

:focus-visible可让咱们知道元素的聚焦行为究竟是鼠标触发仍是键盘触发。因此,若是咱们但愿去除鼠标点击时候的outline轮廓,而保留键盘访问时候的outline轮廓

:focus:not(:focus-visible) {
    outline: 0;
}
复制代码

5.等高布局

5.1 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

5.2 table-cell

它会做为一个表格单元格显示,相似于tdth,表格自己就有等高的特色

兼容性ie8+

回顾一下table-cell,能够说是一个很神奇的属性,为何这么说,它能解决不少布局问题

一、多列文字垂直居中

二、自适应布局

三、元素垂直居中

5.3 flex

默认值就是等高布局,主要的两个属性

一、flex-direction:定义主轴方向,默认值为row

二、align-item:定义侧轴对齐方式,默认值stretch,元素拉伸以适应容器

5.4 grid

网格布局(跟flex有点相似)

6.nofollow

nofollowHTML页面中a标签的属性值。这个标签的意义是告诉搜索引擎"不要追踪此网页上的连接或不要追踪此特定连接",用于网站seo优化

好比在href值为电话号码的时候

<a href="tel:138888888" rel="nofollow">138888888</a>
复制代码

7.一个盒子实现三横杠效果

<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:背景被裁剪到内容框

8.垂直居中之伪元素

<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;
}
复制代码

9.border-radius的8个值

border-radius:10px 10px 10px 10px/10px 10px 10px 10px;
/* x轴 上  右  下  左 / y轴 上 右 下 左
复制代码

有一个很好用的可视化调试网站,border-radius

10.q标签给文本添加先后引号

<q>文字文字文字</q>
复制代码
q{
    quotes: '"' '"'
}
复制代码

浏览器节点实际是添加了::before::after这两个伪元素

q.png

11.外部连接css::seleection为空会致使文本或元素没法选中

.select::selection{}/* 连接导入css */
复制代码
<div class="select">123456</div>
复制代码

应该是css中的一个bug,通常不会出现这种状况,注意一下就好

12. marginpadding百分比

marginpadding设置百分比时,其值是相对于最近的块级父元素的百分比,为何呢,在css权威指南中的解释:若是是相对于父元素的高度,其高度计算会致使死循环,子元素的高度有可能会改变父元素的高度

具体用处

让盒子的高度等于宽度,并跟随宽度变化

.container{
    background-color: pink;
    width: 100%;
    padding-top: 100%;
}
复制代码

一点猜测:

元素的高度百分比是相对于父元素的height的,那么高度为何不会出现死循环,尝试了一下,在父元素高度不固定的状况下,就是其值为auto的时候,子元素的百分比就不起所用了,高度为0,设置min-height的时候也没用

13.css的另外一个函数calc()

定义:calc() 函数用于动态计算长度值

用法:运算符先后都须要保留一个空格;任何长度值均可以使用calc()函数进行计算;calc()函数支持 "+", "-", "*", "/" 运算;calc()函数使用标准的数学运算优先级规则

兼容性很好,支持ie8+,主流浏览器基本都支持

应用比较灵活,列举几个比较经常使用到的地方

一、自适应布局,好比左边固定右边自适应

二、在不依靠box-sizing的状况下,设置元素的margin,达到盒子自适应宽度的做用

三、垂直或者水平居中

。。。等等等

14.clip-path

建立一个只有元素的部分区域能够显示的剪切区域,区域内的部分显示,区域外的隐藏

语法就不详细介绍了

有一个网站能够制造不少好看的图形,clip-path

15.自定义变量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);
}
复制代码

16.利用伪元素扩大可点击区域

<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;
}
复制代码

17.一个很友好的效果

2.gif

<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;
}
复制代码

18.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后面添加足够多的占位标签

19.经过object-fit控制图片的显示方式

contain

缩放以保持原比例

cover

保持原比例的同时,填满容器,会出现被剪裁的状况

fill

不保持原比例,填满容器,会被拉伸

none

保持其原有的尺寸

scale-down

内容的尺寸与 nonecontain 中的一个相同,取决于它们两个之间谁获得的对象尺寸会更小一些

20. css中的四个角度单位

一、deg

度,一圈是360度

二、grad

梯度,一圈是400梯度

三、rad

弧度,一圈是2π弧度

四、turn

一圈

换算公式

90deg = 100grad = 0.25turn ≈ 1.570796326794897rad

相关文章
相关标签/搜索