深入解析css-学习小结

绪论

盒模型

层叠 优先级 继承

层叠

层叠指规则冲突时,如何选择规则。规则冲突解决顺序:

样式表来源

用户代理样式

用户代理样式:浏览器默认样式

作者样式表:你自己写的css样式

作者样式表会覆盖用户代理样式,因为浏览器先加载用户代理样式,再加载作者样式,所以作者样式会覆盖用户代理样式

例子:

重要声明

在css行末加! important,该行即表示重要声明

总结当前优先级:! important > 作者样式 > 用户代理样式

理解优先级

如果浏览器无法通过来源解决优先顺序,则会检查他们的优先级。浏览器将优先级分为两部分:html行内样式和选择器样式

行内样式

即在元素内手动给属性style赋值,行内样式会覆盖样式表的样式,行内样式没有选择器,因为直接作用于元素。如果样式表的样式带了! important,则行内样式同样带! important的样式声明无法覆盖样式表的样式

选择器优先级

选择器优先级类似操作符优先级 有一定顺序 比如两个类名选择器的优先级高于一个类名选择器 

规则:选择器如果存在多个相同id,则id最多的选择器优先;如果id数量一致,则类名最多的选择器优先;如果id和类名数量都相同,有最多标签名的选择器优先。例如下图,数字越大越优先

其他规则:伪类选择器和属性选择器优先级作用和类选择器作用相同;通用选择器和组合选择器对优先级没有影响

应用:有时候你的样式没有生效,可能是选择器呗更高优先级的选择器覆盖了

优先级标记

可以用linux三位数文件权限理解css选择器优先级,三位数从高到底依次为id选择器数量,类选择器数量,标签选择器数量。计算每个选择器的优先级标记值,值高的优先级越高,越优先

源码顺序

即当样式表来源和选择器优先级都相同时,根据css声明顺序决定哪个样式起作用,也即最后声明的会覆盖

其他经验

不要使用id选择器,因为id选择器优先级过高

尽量不要使用! important ,因为选择器多了,优先级很难搞

继承

如果元素没有设置样式,则会继承父元素的样式

特殊值

inherit

让属性继承父类的属性

initial

让属性使用初始默认值

比如color: initial等于color: black, dispkay: initial等于display:inline, 

简写属性

比如font,background,border,padding等属性

需要注意简写属性会覆盖其他省略的属性

简写顺序

有的属性简写顺序模糊,比如border: 1px solid可以无序 有的比如padding就有顺序

需要注意

padding,margin这类属性,如果属性写满,顺序是上右下左,如果三个属性,左属性为4%3=1,用第二个属性,如果是两个属性,上下用第一个,左右用第二个属性

还有一部分属性顺序不遵从上右下左,比如background-position,box-shadow,text-shadow属性,这些属性后如果根两个属性,则先是左右属性,再是上下属性

相对单位

相对单位好处

灵活

px:像素,1/96英寸

pt:点,印刷术语,1/72英寸

pc:派卡,等于12pt

mm:毫米

cm:厘米

in:英寸

em和rem

em:相对单位,当前元素字号(font-size)大小

好处是当字号大小变化,em单位也会放缩

如果对字号font-size使用em单位,则字号会用父元素的字号绝对值来计算em

浏览器默认字号大小为16px

例如一个选择器font-size:1.2em; padding: 1.2em,则边距目测会比字号大一些,大多少?大1.2em

例子:当多个嵌套元素使用em声明font-size属性时,font-size计算值会不断缩小,或是不断放大

可通过修改选择器解决问题,但办法不够好。em适用于边距这些,不太适用于字体这些属性

rem:是root em的缩写,表示相当于根节点的em,而不是父类的属性

经验:用rem设置字号,用px设置边框,用em设置其他属性

停止像素思维

默认字号可以直接给root根元素font-size属性设置目标值调整字号大小。比如浏览器默认字号16px,你想设置14px,则可以设置 14/16=0.875em

使用@media可以创建响应式,即不同窗口尺寸下会自动使用不同的选择器,在不同选择器里定义自己的样式达到响应式

视口相对单位

vh:视口高度的1%

vw:视口宽度的1%

vmin,vmax:视口宽高中较大/较小的1%

也可以使用相对视口单位定义字号大小

字号定义还可以使用calc函数计算,参数可以是不同相对单位的运算,比如calc(1em + 5px),注意运算符两边必须留空格。一个值得尝试的值是calc(0.5em + 1vw),0.5em定义了最小字号,1vw可以让字号随窗口大小流畅放缩

无单位数值和行高

支持无单位的属性有 line-height, z-index, font-weight。任何属性都可以用无单位的0,因为无论什么单位效果都一样

属性被继承时可以考虑用无单位数值,如下例

自定义属性(css变量)

需要在样式里定义变量,加两个--表示变量,调用时用var括号起来,例如

变量的出现可以让我们每次修改时只改变量,而变量的引用无需修改

var接收第二个参数,意义是当第一个参数未定义时使用第二个参数

如果var算出的结果是一个非法值,则会将该属性的值置为默认值

变量可以在root伪类样式中声明,伪类用冒号开头定义

看一个例子,值得注意的是,在一个样式里重新定义了两个变量,变量会被元素继承,展现不同的效果。注意同名变量的重新定义类似作用域,不会覆盖父作用域的同名变量,仅会覆盖当前作用域的变量

盒模型

元素宽度问题

目标

1.0代码

<html>
<head><style>body {background-color: #eee;font-family: Helvetica, Arial, sans-serif;}header {color: #fff;background-color: #0072b0;border-radius: .5em;}main {display: block;}.main {float: left;width: 70%;background-color: #fff;border-radius: .5em;}.sidebar {float: left;width: 30%;padding: 1.5em;background-color: #fff;border-radius: .5em;}</style>
</head>
<body>
<header>TJH 666</header>
<div class="container"><main class="main"><h2>join me</h2><p> this is a paragraph</p></main><aside class="sidebar"><div class="widget"></div><div class="widget"></div></aside>
</div>
</body>
</html>

效果

缩小宽度,尝试让两个白色缩到一行

.main {float: left;width: 70%;background-color: #fff;border-radius: .5em;}.sidebar {float: left;width: 30%;padding: 1.5em;background-color: #fff;border-radius: .5em;}

没达到预期,是因为一行太窄装不下,虽然宽度加和的100,但还有边距,宽度声明是对应内容,需要结合盒模型看

一种方法

直接缩小某列的宽度,使其缩到一行,不推荐

调整盒模型

如果宽高定义是基于边框,则可以满足需求,可通过修改属性box-sizing修改宽高定义的基准为边框,内边距或内容。取值有content-box,border-box,inherit。content-box仅包含内容,border-box包含内容,边距和边框宽度,试一下

.main {box-sizing: border-box;float: left;width: 70%;background-color: #fff;border-radius: .5em;}.sidebar {box-sizing: border-box;float: left;width: 30%;padding: 1.5em;background-color: #fff;border-radius: .5em;}

发现两个元素合并到了一行显示

全局设置border-box

使用全局元素选择器可以给所有元素设置样式,在样式表开头添加如下选择器(这是比较常用的手段)

*,::before,::after {box-sizing: border-box;}

效果也是一样的,两个元素会缩到一行

注意点,当使用第三方样式时,三方样式可能没使用盒模型,即默认content-box,如果全局设置border-box,则会和三方样式的box-sizing冲突,一种方法是强制继承盒模型,这样第三方元素会继承其顶层容器,可以解决全局组件和三方组件的box-sizing冲突,代码如下

:root {box-sizing: border-box;}*,::before,::after {box-sizing: inherit;}

给列之间加上间隔

两列之间没有间隔紧挨着不太好看,尝试在两列间加上间隔

方案1:给其中一列加上边距,再将该列宽度减小边距的宽度,保持元素总宽度不变

        .sidebar {float: left;width: 29%;margin-left: 1%;padding: 1.5em;background-color: #fff;border-radius: .5em;}

方案1耦合比较大 来一种更好方案

方案2:用calc计算元素宽度,意图更明显

        .sidebar {float: left;width: calc(30% - 2em);margin-left: 2em;padding: 1.5em;background-color: #fff;border-radius: .5em;}

元素高度问题

高度和宽度处理逻辑不同,宽度一般是固定,高度一般无限

目标:将主列和次列高度设为一样,通过两种方式

控制溢出问题

overflow属性可以控制溢出时的策略,overflow属性有如下值:

visible 默认值,即溢出内容仍可见不被遮盖

hidden 溢出的内容不可见

scroll 无论内容是否溢出,都会有滚动条

auto 仅当内容溢出时才有滚动条,没溢出时不出现滚动条

效果

overflow属性也可以单独控制水平或竖直方向溢出效果,可通过执行属性名overflow-x overflow-y实现

百分比高度备选方案

css表格布局

给容器设置display: table,给每一列设置display: display: table-cell

        .container {display: table;width: 100%;}main {display: block;}.main {display: table-cell;float: left;width: 70%;background-color: #fff;border-radius: .5em;}.sidebar {display: table-cell;float: left;width: calc(30% - 2em);margin-left: 2em;padding: 1.5em;background-color: #fff;border-radius: .5em;}

和block元素不同,宽度默认不会一定显示为100%,需要手动设置。上述代码需要再考虑边距,因为边距不会作用于table-cell元素

可以用表格元素的属性border-spacing定义单元格间距,该属性接收两个值,分别为水平间距和垂直间距。该属性还会作用表格边缘,到时元素无法对齐。这个属性需要在容器里定义

负外边距

外边距折叠

容器内元素间距

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410312.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 入门指南:Java IO流 —— 字节流

何为Java流 Java 中的流&#xff08;Stream&#xff09; 是用于在程序中读取或写入数据的抽象概念。流可以从不同的数据源&#xff08;输入流&#xff09;读取数据&#xff0c;也可以将数据写入到不同的目标&#xff08;输出流&#xff09;。流提供了一种统一的方式来处理不同…

2024.8.27 作业

1> 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串>>>";getline(cin,s);int letter0,digit0,blank0,…

华为eNSP:静态路由配置、浮动路由配置

静态路由&#xff1a; 一、拓扑图 二、路由器配置 2.1&#xff1a;配置接口 R1&#xff1a; [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [r1-GigabitEthernet0/0/0]qu [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 10.1.1.1 24 [r1-GigabitEth…

CMake之PUBLIC、PRIVATE、INTERFACE

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面抽象版解释头文件和链接库传递测试代码结构PUBLIC传递PRIVATE传递INTERFACE传递 写在前面 使用CMake必然离不开target_include_dir…

第2章 双向链表

双向链表 概念 对链表而言&#xff0c;双向均可遍历是最方便的&#xff0c;另外首尾相连循环遍历也可大大增加链表操作的便捷性。因 此&#xff0c;双向循环链表&#xff0c;是在实际运用中是最常见的链表形态。 基本操作 与普通的链表完全一致&#xff0c;双向循环链表虽然…

FPGA 如何进入 AI 领域的思考

FPGA在AI领域如何发力&#xff0c;如何抢碗饭吃&#xff1f;大多数提到是硬件加速&#xff0c;在AI工程里&#xff0c;完成数据前处理&#xff08;加速&#xff09;。大家很少提到AI模型的本身的推理过程&#xff0c;让FPGA成为AI模型的推理/算力芯片&#xff0c;这自然是 FPGA…

2535. 解密 [CSP-J 2022]

代码 #include <bits/stdc.h> using namespace std; long long m,n; int check(int x){if(x * (m - x) n) return 0;if(x * (m - x) < n) return 1;if(x * (m - x) > n) return 2; } int main(){int k;cin >> k;while(k--){long long e, d,p0,q0;scanf(&q…

如何抠去PPT图片的背景?推荐这款AI智能抠图软件!

做ppt的过程中&#xff0c;我们会用到各式各样的图片素材&#xff0c;其中有些图片不能完全满足我们的需求&#xff0c;得先对图片进行处理&#xff0c;最常见的是抠图&#xff0c;去除图片原有的背景&#xff0c;得到一张包含透明像素的图片&#xff0c;方便我们排版PPT页面上…

高德企业用车负责人:以AI技术革新出行服务体验

在助力产业数字化转型的大潮中&#xff0c;高德企业用车以其前沿的科技理念和创新服务&#xff0c;正在成为出行领域的领跑者。近日接受采访时&#xff0c;高德地图行业合作业务总经理姜义丹先生分享了AI技术在出行领域应用的思考&#xff0c;以及如何提升企业服务智能化水平&a…

【C/C++】typedef用法

typedef用法讲解&#xff0c;时隔半年&#xff0c;再看typedef。 &#x1f381;typedef可以简化结构体关键字 #include<iostream> using namespace std;struct Person {char name[64];int age; };void test01() {struct Person p { "张三",18 };//不用type…

005、架构_数据节点

​DN组件总览 ​ DN节点包含进程 dbagent进程:主要提供数据节点高可用、数据导入导出、数据备份恢复、事务一致性、运维类功能、集群的扩缩容、卸数等功能;MySQL进程:主要提供数据一致性、分组管理、快同步复制、高低水位等;

卡在恢复模式怎么办?这样操作一键轻松退出iPhone 恢复模式

iOS 18beta版本发布后&#xff0c;已经成功升级到iOS 18beta并享受新功能的小伙伴们真是太幸运了。但是还有一些小伙伴在更新iOS 18beta的过程中遇到了各种问题&#xff0c;比如iPhone卡在恢复模式是常见问题。如果你也遇到此问题&#xff0c;不要着急&#xff0c;接下来我们将…

Graylog日志丢失解决方案

问题描述 目前公司使用的日志方案是Graylog5.0版本&#xff0c;当接入的日志并发多时&#xff0c;就会出现日志丢失的情况。 目前硬件系统centos7.9 内核5.16.13。一台graylog和一台es服务器。 两台机器硬件配置 graylog CPU 36C 内存 150G 系统硬盘 500G &#xff08;固态&…

[论文阅读] mobile aloha实验部分

DP:[1] CHI C, FENG S, DU Y, et al. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion[J]. 2023. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion精读笔记&#xff08;一&#xff09;-CSDN博客 哥伦比亚大学突破性的方法- Diffusio…

Android中apk安装过程源码解析

本文中使用的Android源码基于Android 14 1 三方应用安装apk调用方法 public void installApk() {Intent intent new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);/** 自Android N开始&#xff0c;是通过FileProvider共享相关文件&#xff0…

git提交本地项目到远程仓库

1、查看项目目录&#xff0c;是否存在.git文件夹&#xff08;若存在则删除&#xff09; 2、登录git并新建一个空白项目 3、idea创建本地git仓库&#xff08;选择本地项目&#xff09; 4、添加要提交的项目&#xff08;项目右键&#xff09; 5、提交代码到本地仓库 6、配置远程…

SQLserver中的游标的分类和游标的生命周期

SQLserver中的游标的分类 在 SQL Server 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种数据库对象&#xff0c;用于逐行处理结果集中的数据。游标可以用于复杂的数据处理任务&#xff0c;尤其是那些不能通过简单的 SELECT 语句和 JOIN 操作完成的任务。SQL Server …

48.x86游戏实战-封包抓取进图call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

OpenAI API: How to count tokens before API request

题意&#xff1a;“OpenAI API&#xff1a;如何在 API 请求之前计算令牌数量” 问题背景&#xff1a; I would like to count the tokens of my OpenAI API request in R before sending it (version gpt-3.5-turbo). Since the OpenAI API has rate limits, this seems impor…

OpenLayers3,地图探查功能实现

文章目录 一、前言二、代码实现三、总结 一、前言 图层探查&#xff0c;即对置于地图下方的图层进行一定范围的探查&#xff0c;以便用户查看到不易察觉的地理地况。本文基于OpenLayers3&#xff0c;实现地图探查的功能。 二、代码实现 <!DOCTYPE HTML PUBLIC "-//W…