惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
F
Full Disclosure
A
About on SuperTechFans
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
Know Your Adversary
Know Your Adversary
K
Kaspersky official blog
L
LINUX DO - 热门话题
Recorded Future
Recorded Future
C
Cisco Blogs
M
MIT News - Artificial intelligence
T
Tenable Blog
G
GRAHAM CLULEY
月光博客
月光博客
Recent Announcements
Recent Announcements
V
Visual Studio Blog
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
P
Privacy International News Feed
P
Proofpoint News Feed
I
Intezer
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
O
OpenAI News
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
The Cloudflare Blog
Spread Privacy
Spread Privacy
酷 壳 – CoolShell
酷 壳 – CoolShell
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活 翻译 – CSS Sprites:实用技术还是生厌之物? « 张鑫旭-鑫空间-鑫生活 纯CSS实现易拉罐3D滚动效果 « 张鑫旭-鑫空间-鑫生活 纯CSS实现侧边栏/分栏高度自动相等 « 张鑫旭-鑫空间-鑫生活 CSS+JavaScript实现页面不同布局的切换 « 张鑫旭-鑫空间-鑫生活 JavaScript实现最简单的拖拽效果 « 张鑫旭-鑫空间-鑫生活 自己写的无图片版jQuery zxxbox弹出框插件 « 张鑫旭-鑫空间-鑫生活 中国古代道家思想与网页重构的思考 « 张鑫旭-鑫空间-鑫生活 让所有浏览器支持HTML5 video视频标签 « 张鑫旭-鑫空间-鑫生活 纯CSS实现各类气球泡泡对话框效果 « 张鑫旭-鑫空间-鑫生活 JS HEX十六进制与RGB, HSL颜色的相互转换 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变、高光等文字效果 « 张鑫旭-鑫空间-鑫生活 去除冗余 – 精简您的CSS样式代码 « 张鑫旭-鑫空间-鑫生活 对overflow与zoom”清除浮动”的一些认识 « 张鑫旭-鑫空间-鑫生活 jQuery Pagination Ajax分页插件中文详解 « 张鑫旭-鑫空间-鑫生活 absolute绝对定位的非绝对定位用法 « 张鑫旭-鑫空间-鑫生活 网页布局思想浅议-淘宝新版首页为实例 « 张鑫旭-鑫空间-鑫生活 回流与重绘:CSS性能让JavaScript变慢? « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(二) « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(一) « 张鑫旭-鑫空间-鑫生活 60个极富创造性的震撼的电影海报设计 « 张鑫旭-鑫空间-鑫生活 jQuery Lightbox(balupton版)图片展示插件讲解 « 张鑫旭-鑫空间-鑫生活 博客内嵌flash音乐播放器代码、下载与使用 « 张鑫旭-鑫空间-鑫生活 CSS3 animate实现图片墙3D翻转效果 « 张鑫旭-鑫空间-鑫生活 图片旋转效果的一些研究、jQuery插件及实例 « 张鑫旭-鑫空间-鑫生活 CSS3 border-image详解、应用及jQuery插件 « 张鑫旭-鑫空间-鑫生活 jQuery-两款不同原理的圆角插件讲解 « 张鑫旭-鑫空间-鑫生活 页面可用性之outline轮廓外框的一些研究 « 张鑫旭-鑫空间-鑫生活 CSS3 transition实现超酷图片墙动画效果 « 张鑫旭-鑫空间-鑫生活 HTML CSS列表元素ul,ol,dl的研究与应用 « 张鑫旭-鑫空间-鑫生活 jQuery图片文本滚动切换插件jCarousel中文翻译与详解 « 张鑫旭-鑫空间-鑫生活 酷酷的jQuery鼠标悬停图片放大切换显示效果 « 张鑫旭-鑫空间-鑫生活 IE6下z-index犯癫不起作用bug的初步研究 « 张鑫旭-鑫空间-鑫生活 checkbox复选框的一些深入研究与理解 « 张鑫旭-鑫空间-鑫生活 jQuery之使用slideToggle实现垂直下拉菜单 « 张鑫旭-鑫空间-鑫生活 jQuery-innerfade内部列表自动淡入淡出插件 « 张鑫旭-鑫空间-鑫生活 jQuery-火焰灯效果导航菜单 « 张鑫旭-鑫空间-鑫生活 IE下css bug集合-翻译自haslayout.net « 张鑫旭-鑫空间-鑫生活 翻译-IE7/8@font-face嵌入字体与文字平滑 « 张鑫旭-鑫空间-鑫生活 jQuery-马化腾产品设计与用户体验的一些技术实现 « 张鑫旭-鑫空间-鑫生活 像素的世界及其在web开发制作中的应用 « 张鑫旭-鑫空间-鑫生活 css行高line-height的一些深入理解及应用 « 张鑫旭-鑫空间-鑫生活 CSS实现圆角六色渐变自适应按钮详解 « 张鑫旭-鑫空间-鑫生活 我熟知的三种三栏网页宽度自适应布局方法 « 张鑫旭-鑫空间-鑫生活 jQuery照片图像剪裁插件Jcrop中文翻译详解 « 张鑫旭-鑫空间-鑫生活 Ajax Upload多文件上传插件翻译及中文演示 « 张鑫旭-鑫空间-鑫生活 告别图片—使用字符实现兼容性的圆角尖角效果beta版 « 张鑫旭-鑫空间-鑫生活 大小不固定的图片、多行文字的水平垂直居中 « 张鑫旭-鑫空间-鑫生活 jQuery boxy弹出层对话框插件中文演示及讲解 « 张鑫旭-鑫空间-鑫生活 JavaScript实现新浪微博文字放大显示动画效果 « 张鑫旭-鑫空间-鑫生活 翻译:让网络更快一些——最小化浏览器中的回流(reflow) « 张鑫旭-鑫空间-鑫生活 jQuery之addClasas与removeClass使用实例 « 张鑫旭-鑫空间-鑫生活 关于Google圆角高光高宽自适应按钮及其拓展 « 张鑫旭-鑫空间-鑫生活 JavaScript实现图片幻灯片滚动播放动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery-鼠标经过显示大图并跟随鼠标效果插件 « 张鑫旭-鑫空间-鑫生活 关于gif图片(或png8)杂边锯齿的问题 « 张鑫旭-鑫空间-鑫生活 对html与body的一些研究与理解 « 张鑫旭-鑫空间-鑫生活 鲜为人知的一个解决兼容性问题的利器——小数 « 张鑫旭-鑫空间-鑫生活 搜狐白社会似iphone短信对话框效果的优化 « 张鑫旭-鑫空间-鑫生活 关于文字内容溢出用点点点(…)省略号表示 « 张鑫旭-鑫空间-鑫生活 jquery之append与insertBefore使用实例 « 张鑫旭-鑫空间-鑫生活 jQuery之图片关联伸缩效果 « 张鑫旭-鑫空间-鑫生活 jquery之图片左右切换动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery之replace字符串替换实现不同尺寸图片切换 « 张鑫旭-鑫空间-鑫生活 jQuery-实现图片的放大镜显示效果 « 张鑫旭-鑫空间-鑫生活 jQuery-单击文字或图片内容放大显示效果插件 « 张鑫旭-鑫空间-鑫生活 reflection.js-实现图片投影倒影效果js插件 « 张鑫旭-鑫空间-鑫生活 jQuery-很酷的弹出层效果js插件 « 张鑫旭-鑫空间-鑫生活 复选框单选框与文字对齐问题的研究与解决 « 张鑫旭-鑫空间-鑫生活 css margin的相关属性,问题及应用 « 张鑫旭-鑫空间-鑫生活 IE6下png背景不透明问题的综合拓展 « 张鑫旭-鑫空间-鑫生活
巧借CSS var变量实现任意的CSS自定义语法 « 张鑫旭-鑫空间-鑫生活
张鑫旭,zhangxinxu · 2020-10-11 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=9537
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可以联系授权。

CSS变量的自定义语法技术

CSS自定义属性支持任意类型的属性值,我们可以借助这一特性自定义CSS语法,或者polyfill全新的CSS语法。

本文通过3个案例展示这种用法。

一、CSS变量自定义全新的CSS语法

CSS新世界中的新特性虽然很多,但是仍然有部分需求是无法实现的,例如虽然目前CSS Color Level 4支持超级多的颜色写法(详见我写的这篇文章),但是唯独不支持颜色关键字的半透明效果。

所以,我就会思考这样一个问题,有没有可能自创一个CSS函数语法,实现颜色关键字的半透明设置,例如自创一个keyword()函数:

color: keyword(red, 50%)
color: keyword(red, 0.5)
color: keyword(red / 50%)
color: keyword(red / 0.5)

显然,上面的语法浏览器肯定是无法识别的,图8-7就是Chrome浏览器下语法无效的截图示意。

图8-7 自定义的keyword()函数无效示意

那有没有办法让浏览器认为keyword()函数也是合法的呢?

还真有,那就是使用CSS自定义属性,让CSS自定义属性做为信使让整个语法合法化,例如:

body {
    --keyword: keyword(red, 50%);  /* 合法 */
    color: var(--keyword);
}

此时浏览器会认为上面的color属性语法就是合法的,下图就是Chrome浏览器下语法合法的截图示意。

keyword()函数语法有效示意

接下来要做的事情就简单了,既然语法合法,那我们就可以使用JavaScript获取到哪些元素使用了keyword()函数,此时再转换成浏览器可识别的颜色函数就可以实现我们想要的效果了。

具体实现原理如下所示:

  1. 获取⻚⾯所有的包含keyword()的⾃定义属性,就是把代码中的CSS变成JS中的数组数据,类似这样:
    body {
     --keyword: keyword(red, 50%);
     color: var(--keyword);
    }

    然后变成:

    [
     ['--keyword', 'keyword(red, 50%)]
    ]
  2. 遍历并观察所有DOM,如果设置了对应的⾃定义属性,将keyword()语法转换成浏览器识别的rgba()语法。例如:
    自定义属性的遍历与处理

基于上述原理,我写了个JavaScript代码片段,大家只需要在页面中引入下面这段HTML代码,就可以畅快自如地使用自定义的keyword()函数了。

<script src="./keyword-color.js"></script>

keyword-color.js可以点击或右键这里进行下载:keyword-color.js

下面简单测试下,假设页面中有如下所示的HTML和CSS代码:

<body>
    <p>文字颜色是?</p>
</body>
body {
    --keyword: keyword(blue, 50%);
    color: var(--keyword);
    /* 支持自定义属性嵌套 */
    --aaa: keyword(blue, 0.1);
    --bbb: var(--aaa);
    background-color: var(--bbb);

    font-size: 3rem;
}

结果就有如下图所示的效果,无论是背景色还是文字颜色都表现出了符合预期的半透明效果。

自定义的keyword()函数语法生效示意

//zxx: 如果你看到这段文字,说明你现在访问是体验糟糕的垃圾盗版网站,你可以访问原文获得很好的体验:https://www.zhangxinxu.com/wordpress/?p=9537(作者张鑫旭)

眼见为实,您可以狠狠地点击这里:自定义keyword()语法与效果demo

二、Polyfill案例之offset-path

上面的自定义keyword()函数语法的案例其实使用预处理也可以解决的,类似Sass,Less这种,直接写个编译函数,使用Node.js转换成rgba()函数,也是很香的。

例如:

body {
 --keyword: keyword(red, 50%);
 color: var(--keyword);
}

使用Node.js工具直接转换成:

body {
 color: rgba(255,0,0,.5);
}

但是,有一类CSS语法的自定义预处理工具是搞不定的,那就是一些还没有支持的CSS新语法的Polyfill实现,这是CSS变量作为中间件自定义其他CSS语法技术的王牌应用。

这里先举offset-path属性的例子。

大家应该知道,offset-path⽀持path()函数可以实现元素任意不规则路径的运动效果。

.horse-run {
 offset-path: path("M10,80 q100,120 120,20 q140,-50 160,0");
 animation: move 3s linear infinite;
}
@keyframes move {
 100% { offset-distance: 100%;}
}

就会有一个马儿跑起来的效果。

马儿不停跑gif截图

关于offset-path属性更多内容可以参见这篇文章:“使用CSS offset-path让元素沿着不规则路径运动”。

实际上,offset-path的规范还支持很多其他的CSS函数,例如url()函数:

offset-path: url(#somePathId)

或者基本图形运动函数:

offset-path: circle(50% at 25% 25%);
offset-path: ellipse(50% 40px at top);
offset-path: inset(50% 50% 50% 50%);
offset-path: polygon(30% 0%, 70% 0%, 30% 100%, 0% 70%, 0% 30%);

可惜目前所有浏览器都不支持,如下图所示:

offset-path其他函数都不支持

没关系,我们可以借助CSS变量进行Polyfill。

首先所有函数使用CSS自定义属性表示,如下所示:

--offset-path: url(#somePathId);
--offset-path: circle();
--offset-path: ellipse();
--offset-path: inset();
--offset-path: polygon(30% 0%, 70% 0%, 0% 30%);
offset-path: var(--offset-path);

然后使用JavaScript识别哪些元素应用了这些CSS自定义属性,然后进行语法分析,转换成浏览器支持的path()函数即可。

眼见为实,您可以狠狠地点击这里:offset-path polyfill方法测试demo

各个函数polyfill之后的效果如下GIF所示(点击播放 278K):

路径运动

如何使用?

1. 引入JS,例如:

<script src="./offset-path.js"></script>

offset-path.js可以点击或右键这里进行下载:keyword-color.js

2. 需要使用offset-path其他函数语法的元素新增一个自定义属性is-offset-path,例如:

<img src="horse.png" class="horse-run" is-offset-path title="by zhangxinxu(.com)">

3. 使用CSS自定义属性设置相关的运动路径函数,例如这里使用外部的SVG元素路径:

.horse-run {
 --offset-path: url(#road);
 offset-path: var(--offset-path);
 animation: motion 3s linear infinite;
}

页面中的SVG元素代码如下(其他函数不需要SVG支持):

<svg width="280" height="150" viewBox="0 0 280 150">
 <path id="road" d="M10,80 q100,120 120,20 q140,-50 160,0"/>
</svg>

4. 效果完成。此时,offset-path.js会把url(#road)转换成浏览器可以识别的path()函数,于是就有了对应的运动效果。

源代码截图如下所示:

转换成path()函数示意

补充于2020-12-01

offset-path.js我刚刚在gitee上开源了,方便大家学习和使用:https://gitee.com/zhangxinxu/css-offset-polyfill

也欢迎大家关注我的gitee账号,以后非国际化的项目我都会在gitee开源。

三、attr()函数新语法的支持

这个案例上一篇文章专门讲过。

attr()函数新语法可以让HTML属性变成任意的CSS值,例如可以让HTML属性中的任意属性的颜色值转变成CSS中真实的值进行使用,例如:


button {
    background-color: attr(bgcolor color);
    border-radius: attr(radius px, 4px);
}

理论上会有下图所示的效果。

理论上的按钮效果示意

可以看到attr()函数新语法让HTML和CSS之间的联系更加紧密,这个特性我认为是会带来很多变革与颠覆的,但是没有任何浏览器支持,且估计很长一段时间也不会有浏览器支持。

不要急,借助CSS变量,我们同样可以浏览器能识别我们书写的CSS attr()函数新语法。

例如:

button {
    --attr-bg: attr(bgcolor color);
    background-color: var(--attr-bg);
    --attr-radius: attr(radius px, 4px);
    border-radius: var(--attr-radius);
}

前提就是引入一段代码量很少的JS文件即可。

详细内容请访问这篇文章:“Polyfill吊炸天的CSS attr()新语法”。

这里不再赘述。

四、写在最后的结语

本文介绍的这个技术的核心就是通过让原来浏览器不认识的函数或者语法通过CSS变量的形式调用,从而让浏览器可识别。如果浏览器原本就识别这些语法,功能也完全正常,不受影响。

于是,我们就可以获取到用户对当前元素具体设置的CSS变量值,也就是获取到用户设置的这个不认识的函数或者语法究竟是什么,然后再通过JavaScript把这些新语法转换成浏览器可识别的语法。

上面3个方法的内核都是一样的。

大家遇到类似的需求也可以仿照相关的JS逻辑进行修改。

另外,相关技术是我最近才研究折腾出来的,JS文件可能会有瑕疵,或者bug,欢迎反馈,当然,我也会积极在生成环境使用,看看会不会有什么问题,我也会及时更新。

如果你有其他更好的实现方法,也欢迎交流,不吝赐教。

最后,感谢您的阅读,希望本文的内容可以对您的学习有所帮助。

本文为原创文章,欢迎分享,勿全文转载,如果实在喜欢,可收藏,永不过期,且会及时更新知识点及修正错误,阅读体验也更好。
本文地址:https://www.zhangxinxu.com/wordpress/?p=9537

(本篇完)