前两篇文章《CSS基础入门》、《CSS合模型与布局》介绍了CSS基础和理论。但是CSS知识点总的来说比较杂乱,这边记录CSS比较零碎相对高级一些的知识点以及一些常见问题。
clamp(MIN, VAL, MAX)
选择最佳值attr
返回当前元素的属性值
a:after {content: " (" attr(title) ")";}
rgb()
rgba()
hsl()
hsla()
calc
允许计算CSS属性值 ios10不支持f
height: 90%; height: calc(100%-50px)
counter()
计数器
counter-reset
counter-increment
使用max()
min()
var()
用于插入自定义属性值
p{--color:red;}
.text{ background-color: var(--color)}
linear-gradient()
repeating-linear-gradient()
radial-gradient()
repeating-radial-gradient()
conic-gradient()
repeating-conic-gradient()
repeat()
minmax()
目前技术的展随着web浏览器的升级,CSS变量的应用越来越普遍了,不考虑IE11的话,可以大胆的用了
css:root{
--color1: blue;
}
.box {
background-color: var(--color1);
}
:root
包裹css变量后, 就可以在任何元素对应的样式中使用css变量了var()
函数读取变量
var(--foo, #7F583F);
var(--font-stack, "Roboto", "Helvetica");
var(--padding, 10px 15px 20px);
calc()
函数将他们连接css/* 如果变量是字符串可以拼接*/
:root {
--bar: 'hello';
--foo: var(--bar)' world';
}
.box:after {
content: '--foo : 'var(--foo);
}
/* 如果变量是数值,必须使用`calc()`函数将他们连接 */
.foo {
--gap: 20;
margin-left: calc(var(--gap) * 1px);
}
html<style>
:root { --color: blue; }
div { --color: green; }
#alert { --color: red; }
* { color: var(--color); }
</style>
<p>blue</p>
<div>green</div>
<div id="alert">red</div>
html/* 主题色切换示例代码 */
<style>
:root {
--color: white;
--bg: black;
}
p{
color: var(--color);
background-color: var(--bg);
}
</style>
<span onclick="setTheme(1)">
<input name="theme" type="radio" id="checkbox1" value="1">
<label for="checkbox1">白天</label>
</span>
<span onclick="setTheme(2)">
<input name="theme" type="radio" id="checkbox2" value="2">
<label for="checkbox2">黑夜</label>
</span>
<p>白天color is white, bg is black</p>
<p>黑夜color is black, bg is white</p>
<script>
function setTheme(type) {
const style = document.documentElement.style
if(type === 1) {
style.setProperty('--color', 'white');
style.setProperty('--bg', 'black');
} else {
style.setProperty('--color', 'black');
style.setProperty('--bg', 'white');
}
}
</script>
cssbody {
--primary: #7F583F;
--secondary: #F7EFD2;
}
a {
color: var(--primary);
text-decoration-color: var(--secondary);
}
@media screen and (min-width: 768px) {
body {
--primary: #F7EFD2;
--secondary: #7F583F;
}
}
js// 获取刘海高度示例
// css
.root {
--safetop: env(safe-area-inset-top);
}
const top = getComputedStyle(document.documentElement).getPropertyValue('--safetop');
// 存储js数据
document.documentElement.style.setProperty('--obj', JSON.stringify({a:1}))
CSS Houdini
就是传说中的JS IN CSS
工作流程
传统开发流程中开发者只能介入DOM和 CSSOM这两个环节,有了Houdini可以作用域整个渲染流程,如下图 注意: 灰色内容是还在实现中的标准,目前暂时无法使用。
本段落主要参考资料
CSS Parsing API 还没有被写入规范,下面所说内容随时都会有变化,但是它的基本思想不会变。
允许开发者自由扩展CSS词法分析器,引入新的结构,比如新的媒体规则、新的伪类、嵌套、@extends、@apply等等。
CSS Properties and Values API的出现进一步推动了自定义属性,它还允许自定义的属性添加类型,大大增强了自定义属性的能力
jswindow.CSS.registerProperty({
name: "--bg-color",
syntax: "<color>",
inherits: false,
initialValue: "#ffffff",
});
你可以把 CSS Typed OM 视为 CSSOM 2.0,它的目的在于解决目前模型的一些问题,并实现 CSS Parsing API 和 CSS 属性与值 API 相关的特性。
提升性能是 Typed OM 的另一重任。将现在 CSSOM 的字符串值转成有意义的 JS 表达式可以有效的提升性能。
js// index.html
CSS.paintWorklet.addModule('paint-grid.js');
// paint-grid.js
registerPaint('transparent-grid', class {
// ...
}}
案例实现主体切换,附加动画效果
css<script>
window.CSS.registerProperty({
name: "--bg-color",
syntax: "<color>",
inherits: false,
initialValue: "#ffffff",
});
window.CSS.registerProperty({
name: "--my-color",
syntax: "<color>",
inherits: false,
initialValue: "#000000",
});
setTimeout(() => {
document.body.setAttribute('class', "night-theme");
}, 2000);
</script>
<style>
body {
--bg-color: #fff;
--my-color: #000;
background-color: var(--bg-color);
color: var(--my-color);
transition: --bg-color 2s linear, --my-color 2s linear;
}
body.night-theme {
--bg-color: #000;
--my-color: #fff;
}
</style>
<div>
2s后发生将变成黑夜模式
</div>
核心代码
html<script>
if (window.CSS) {
window.CSS.registerProperty({
name: "--unit",
syntax: "<number>",
inherits: false,
initialValue: 10,
});
CSS.paintWorklet.addModule('paint-grid.js');
}
</script>
<style>
.box {
--unit: 8;
background: paint(transparent-grid);
}
</style>
<div class="box"></div>
jsregisterPaint('transparent-grid', class {
static get inputProperties() { return ['--unit']; }
paint(context, size, properties) {
// 两个格子颜色
const color1 = '#fff';
const color2 = '#eee';
// 格子尺寸
const units = properties.get('--unit')?.value || 20;
// 横轴竖轴循环遍历下
for (let x = 0; x < size.width; x += units) {
for (let y = 0; y < size.height; y += units) {
context.fillStyle = (x + y) % (units * 2) === 0 ? color1 : color2;
context.fillRect(x, y, units, units);
}
}
}
});
@support
检测css@supports (padding: revert) {
/* todo something */
}
/* css变量兼容性检测 */
@supports ( (--a: 0)) {
/* supported */
}
@supports ( not (--a: 0)) {
/* not supported */
}
jsconst isSupported = window.CSS?.supports?.('--a', 0);
if (isSupported) {
/* supported */
} else {
/* not supported */
}
jsdocument.head.style.filter = 'blur(5px)';
result = window.getComputedStyle(document.head).filter == 'blur(5px)';
overflow-scrolling:touch
调用Safari原生滚动来支持弹性滚动,增加页面滚动的流畅度autofocus
自动聚焦
autofocus
属性)cssinput[type="search"] {
-webkit-appearance: none;
}
js// https://blog.csdn.net/weixin_44777146/article/details/108219654
var agent = navigator.userAgent.toLowerCase();
var iLastTouch = null;
if (agent.indexOf('iphone') >= 0 || agent.indexOf('ipad') >= 0) {
document.body.addEventListener('touchend', function (event) {
let a = new Date().getTime();
iLastTouch = iLastTouch || a + 1;
let c = a - iLastTouch;
if (c < 500 && c > 0) {
event.preventDefault();
return false;
}
iLastTouch = a;
}, false);
};
- `-webkit-overflow-scrolling: touch;`
transform: translate3d(0, 0, 0);
或 translateZ(0)
pointer-events
禁用事件触发
pointer-events:none
禁用事件触发(默认事件、冒泡事件、鼠标事件、键盘事件等),相当于<button>
的disabledcssimg::after{
/* 生成 alt 信息 */
content: attr(alt);
/* 尺寸和定位 */
postion:absolute; bottom: 0;
width:100%;
background-color:rgba(0,0,0,.5);
transform: translateY(100%);
transition: transform .2s;
}
img:hover::after{
transform: translateY(0);
}
CSS隐藏元素的几种方式及区别
display:none
visibility:hidden
opacity:0
CSS颜色体系有哪些值?
content属性的特点
打点loading效果
cssdot {
display: inline-block;
height: 1em;
line-height: 1;
text-align: left;
vertical-align: -.25em;
overflow: hidden;
}
dot::before {
display: block;
content: '...\A..\A.';
white-space: pre-wrap;
animation: dot 3s infinite step-start both;
}
@keyframes dot {
33% { transform: translateY(-2em); }
66% { transform: translateY(-1em); }
}
/* HTML*/
/* 正在加载中<dot>...</dot> */
这里介绍一些优先级不是很高的CSS知识点 (https://juejin.cn/post/6941206439624966152)
使用object-fit规定图像尺寸
本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!