第二天,关于css和js | 青训营笔记

114 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

Css

组成:

选择器、声明(属性:值)、多个声明组成的属于声明块

引入方式

内嵌、外联、内联 推荐外联

css如何工作的?

浏览器 加载html==解析html===创建dom树===加载css===解析css===将样式添加到dom节点===形成渲染树===渲染页面===展示页面

选择器 Selector

找出页面元素,赋予样式。

选择方法

1.按照标签名、类名、id(标签、class、id)

2.按照属性 (某些特征)

/**当一个html被禁用时**/
/**
<input type="text" disabled>
**/
[disabled]{
    ...
}
/**这时就直接作用到他的样式上**/input[type="password"]{ /**只选择某值**/
    ...
}
​
a[href^="#"] /**^:href属性以什么内容开头就使用这个属性**/
a[href$=".jpg"] /**$: href属性以什么结尾就使用这个属性**/

3.按照dom树的位置(父子级、兄弟级)

伪类选择器

点击后,跳转后,划入后等等。(:hover,:focus,:active,:link)

结构伪类

第一个

:first-child

最后一个

:last-child

li:first-child{ /**选中第一个li**/
...
}
li:last-child{/**选中最后一个li**/
    ...
}

某个的标签可以去查文档了,都可以选择。

组合方式
li.text{} /**即是li 还要必须class名字是.text的元素才生效**/
li .text{} /** li的里面classtext的元素生效**/
li>.text{} /**li的子集中 classtext的元素生效**/
li~.text{} /**选择li后边元素中 classtext的元素生效**/
li+.text{} /** 选中li紧跟着后边的.text元素生效**/
选择器组
h1,h2{} /**h1和h2元素同时生效**/
颜色

rgb,hsl,颜色关键字

字体

font-family:字体一,字体二,字体三..,serif;

最后一个属性是字体族:

image-20230114153333120

英文字体尽量写在中文前面,如果字体中没有某个字的字体,会向后读取。

如果非常想要使用某种字体,可以把字体放到服务器 通过url的方式进行加载

font{
    font-family:"Megrim";
    src:url(https://.... .woff2) format("woff2");
}

css权重

/** <article> <h1 class=”title"></h1> </article> **/
​
.title{}
article h1{}

id 权重 100

.伪类 10

标签 1

相同权重就会覆盖


继承

他会继承他父级的样式,如果父级也没有,就再向上继承。

因为有一些值不可以继承,就可以使用 一些其他方法来显示继承

*{ box-sizing:inherit;} /** 让他所有的元素都设置为  box-sizing:inherit 这样他就会自动继承这个元素 **/

当一个元素不可继承,或者没有进行设置值,他就会使用初始值(initial)

background:initial;

css求值过程

首先筛选出符合我这个页面的所有样式

根据元素、类等一系列内容筛选出能用的类,然后相同元素冲突时,根据来源,特性,权重值找出最大的那个 叫层叠值(当层叠值为空时,就用继承或初始值)。

经过上述步骤,一定会拿到一个值,这个值要经过计算或者转换,得到计算值,然后把计算值的相对值转换为绝对值,如果有部分不可用的值进行处理比如 max-width 和 width 冲突时,判断是否满足max-width,产生实际值。

css布局方式

常规流
块级

盒模型

image-20230114163936910

如果容器设置高度的百分比, 必须是容器的父级有指定高度时才生效

margin垂直方向上会合并,取最大值

border-box 是指单个div 所占的 border和padding 都算在宽度中

针对超出部分:overflow

visible : 超出也展示

hidden:溢出隐藏

scroll:超出给滚动条

行级

块级和行级的区别

1.块级不和其他盒子并排摆放 行级和其他行级盒子一起放在一起,形成一行或者多行

2.适用所有的盒模型属性 盒模型中的宽高不适用

表格布局

flexBox

Grid布局

块级排版上下文

某些容器会创建一个BFC

根元素
​
浮动,绝对定位,inline-block
​
Flex子项和Grid子项
​
overflow值不是visible的块盒
​
display:flow-root; 

内部规则

盒子从上到下摆放
垂直margin合并
BFC内盒子的margin不会和外面的合并
BFC不会和浮动元素重叠
行级排版上下文

只包含行级盒子的容器会创建一个IFC,IFC内的排版规则:

    盒子再一行内水平摆放
​
•   一行放不下时,换行显示
​
•   text-align决定一行内盒子的水平对其
​
•   vartical-align 决定一个盒子再行内的垂直对其
​
•   避开浮动元素
Flex box

一种新的排版上下文,它可以控制子集盒子的

    摆放流向  默认是从左到右
​
•   摆放顺序 (主轴 侧轴 
​
•   盒子宽度高度
​
•   水平垂直方向的对齐
​
•   是否允许折行

主轴

image-20230114174823017

侧轴

image-20230114174922010

如果侧轴设置为 stretch 则会把高度拉到相同的值。

image-20230114175202474

flex-grow 是根据比例去分取剩余空间

flex-grow:2 //这个就只占 1/3flex-grow:4 //这个占用 2/3 如果再往后加 就是大家一起分剩余的部分

flex-shrink:根据比例去收缩空间

flex: grow shrink basis;

Grid布局

发现很多布局是二维布局,flex是单一布局的方式,grid布局属于二维的布局

image-20230114175905338

grid-template-columns :行方向上划分

grid-template-rows: 列上划分

image-20230114180111206

<!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>Document</title>
    <style>
        .us{
            display: grid;
            grid-template-columns: 100px 100px 1fr; 
            /* fr代表 剩下的1份 */
            grid-template-rows: 100px 1fr;
            width: 500px;
            height: 500px;
            background: red;
        }
        .us>div{ background: red; border: 1px solid #ccc;}
    </style>
</head>
<body>
    <div class="us">
        <div>1</div>
        <div>2</div>
        <div>3</div>
    </div>
</body>
</html>

标记 grid line 网格线

image-20230114180616244

11 33

grid-row-start:横开始

grid-column-start:纵开始

grid-row-end:横结束

grid-column-end:纵结束位置

grid-area:1/1/3/3

浮动

略,竞争力被 flex 和 grid比下去了。

绝对定位

略..

js

js编写原则

尽量不直接操作style属性,能够通过加类名解决的,尽量加类名解决,如果能用纯css解决,就用纯css解决。(优化代码操作,让团队开发高效。

css搞定切换案例

<!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>Document</title>
    <style>
        .box{ width: 100px; height: 100px; background: red;}
        #males:checked+ .box{ background: pink;}
        #males:checked+ .box .s2{ display: none;}
        #males:checked+ .box .s1{ display: block;}
        #males+ .box .s1{ display: none;}
        #males{ display: none;}
        #male{display: none;}
        
    </style>
</head>
<body>
    
    <input type="radio" id="male" name="on"  checked="false">
    <input type="radio" id="males" name="on" checked="false">
    <div class="box">
        <label for="male" class="s1"></label>
        <label for="males" class="s2"></label>
    </div>
</body>
</html>

尽量避免不必要的js直接操作样式,可以用class表示状态,纯展示类交互寻求0js方案

组件封装

封装的特性:封装性,正确性,拓展性,复用性

实现步骤:结构设计,展现效果,行为设计

重构:插件化,模板化,抽象化。

弄了一下午,照猫画虎写了个差不多的

案例

<!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>Document</title>
        <style>
            .box {
                width: 500px;
                height: 300px;
            }
​
            .box>div {
                height: 300px;
                overflow: hidden;
            }
​
            div>img {
                height: 100%;
            }
​
            .disb {
                display: block;
                animation: as 0.5s;
            }
​
            .disn {
                display: none;
            }
​
            @keyframes as {
                0% {
                    opacity: 0;
                }
​
                100% {
                    opacity: 1;
                }
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="disb">
                <img src="https://img0.baidu.com/it/u=1705694933,4002952892&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=281"
                    alt="">
            </div>
            <div class="disn">
                <img src="https://img2.baidu.com/it/u=1395980100,2999837177&fm=253&fmt=auto&app=120&f=JPEG?w=1200&h=675"
                    alt="">
            </div>
            <div class="disn">
                <img src="https://img0.baidu.com/it/u=3156137851,1307209439&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"
                    alt="">
            </div>
            <div class="disn">
                <img src="https://img0.baidu.com/it/u=1472391233,99561733&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"
                    alt="">
            </div>
        </div>
        <div>
            <div class="ros">
                < 
            </div><div class="ros">
                >
            </div>
        </div><script>
                class Lbt {
                    constructor(dom, time, domArr) {
                        this.index = 0
                        this.dom = dom
                        this.time = time
                        this.domArr = domArr
                        this.setInterval = null
                    }
​
                    //轮播图启动
                    gorun_lb() {
                        for (let i = 0; i < this.dom.length; i++) {
                            this.dom[i].className = "disn"
                        }
                        this.dom[this.index].className = "disb"
                    }
                    //index自增
                    gorun_addIndex() {
                        this.index++
                        this.index = this.index == this.dom.length ? 0 : this.index
                    }
                    //index自减
                    gorun_redIndex() {
                        this.index--
                        this.index = this.index == -1 ? this.dom.length - 1 : this.index
                    }
                    //启动轮播图
                    gorun() {
​
                        this.gorun_addIndex()
                        this.gorun_lb()
​
                    }
​
                    //删除计时器
                    clearInt() {
                        clearInterval(this.setInterval)
                    }
                    //清除计时器并重新赋值计时器
                    go_last() {
                        this.clearInt()
                        this.gorun_redIndex()
                        this.gorun_lb()
                        this.Interval()
                    }
                    //清除计时器并重新赋值计时器
                    go_next() {
                        this.clearInt()
                        this.gorun_addIndex()
                        this.gorun_lb()
                        this.Interval()
                    }
​
                    Interval() {
                        return this.setInterval = setInterval(() => {
                            this.gorun()
                        }, this.time)
                    }
                    render(...args) {
                        if (args.indexOf("lbt") != -1) {
                            this.Interval()
                        }
                        if (args.indexOf("l/r") != -1) {
                            console.log(this.domArr)
                            this.domArr[0].addEventListener("click", this.go_last.bind(this))
                            this.domArr[1].addEventListener("click", this.go_next.bind(this))
                        }
                    }
                }
                let u = document.querySelectorAll(".box>div")
                let ros = document.querySelectorAll(".ros")
                let lbt = new Lbt(u, 1500,ros)
                lbt.render("lbt","l/r")
            </script>
    </body>
</html>