标签 css 下的文章

你好,我是 Silvana,一名前端开发。

这里记录我写过的代码、做过的项目,以及一些真实想法。

最近捣鼓了个有意思的小效果 —— 纯 CSS 实现的 3D 等距立方体,鼠标在页面上移动时,立方体还能跟着转动,视觉上既有层次感又不复杂。先放个效果动图直观感受下👇

一、先搭 HTML 骨架:简单到只有一个 “盒子”

整个效果的 HTML 结构特别直观,核心就是一个承载 3D 效果的box容器,里面嵌套了立方体的四个侧面,每个侧面放对应的文字内容就行。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <!-- 适配移动端,保证小屏也能正常显示 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>CSS创意等距设计</title>
  <!-- 引入样式文件 -->
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <!-- 3D立方体的外层容器,所有3D变换都基于这个盒子 -->
  <div id="box">
    <!-- 立方体的侧面容器,包裹四个不同角度的侧面 -->
    <div>
      <!-- 第一个侧面:旋转0度,对应立方体正面 -->
      <span>
        <div class="container">
          <div class="side">
            <h2>CSS</h2>
            <h3>Isometric</h3>
            <h4>Design</h4>
          </div>
        </div>
      </span>
      <!-- 第二个侧面:旋转90度,对应立方体右侧面 -->
      <span>
        <div class="container">
          <div class="side">
            <h2>CSS</h2>
            <h3>Isometric</h3>
            <h4>Design</h4>
          </div>
        </div>
      </span>
      <!-- 第三个侧面:旋转180度,对应立方体背面 -->
      <span>
        <div class="container">
          <div class="side">
            <h2>CSS</h2>
            <h3>Isometric</h3>
            <h4>Design</h4>
          </div>
        </div>
      </span>
      <!-- 第四个侧面:旋转270度,对应立方体左侧面 -->
      <span>
        <div class="container">
          <div class="side">
            <h2>CSS</h2>
            <h3>Isometric</h3>
            <h4>Design</h4>
          </div>
        </div>
      </span>
    </div>
  </div>
  <!-- 鼠标交互的JS代码 -->
  <script>
  </script>
</body>
</html>

二、CSS 样式:调对 3D 变换才有质感

这个效果的核心全在 CSS 里,尤其是transform-style: preserve-3d(保留 3D 空间)、rotateX/rotateY(3D 旋转)和translate3d(3D 位移),我把关键样式拆出来,每一步都标了注释,一看就懂。

/* 全局重置:清除默认边距,盒模型设为border-box(宽高包含边框/内边距) */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
/* 页面主体:居中显示,背景色设为浅蓝,最小高度占满屏幕 */
body{
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background: #80c7ff;
}
/* 3D立方体外层容器:开启3D空间,设置宽高 */
#box {
  position: relative;
  width: 260px;
  height: 340px;
  transform-style: preserve-3d; /* 关键:保留子元素的3D变换效果 */
}
/* 立方体的“顶面”:通过rotateX旋转90度,模拟3D顶面,加模糊增加层次感 */
#box::before{
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 260px;
  height: 260px;
  background: #fff;
  transform: rotateX(90deg) translateZ(130px); /* 旋转+位移,定位到立方体顶部 */
  filter: blur(4px); /* 轻微模糊,模拟光影效果 */
}
/* 立方体的“底面阴影”:同理旋转,加半透明黑色模拟阴影 */
#box::after{
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 260px;
  height: 260px;
  background: rgba(0,0,0,0.15);
  transform: rotateX(90deg) translateZ(-260px); /* 位移到立方体底部,模拟阴影 */
}
/* 立方体侧面的父容器:继承3D空间属性 */
#box div {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
}
/* 每个侧面的基础样式:居中显示内容,继承3D空间 */
#box div span {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
  display: flex;
  justify-content: center;
  align-items: center;
}
/* 第一个侧面:旋转0度,作为立方体正面 */
#box div span:nth-child(1){
  transform: rotateY(0deg) translate3d(0,0,130px); /* 沿Y轴旋转0度,向Z轴位移130px(立方体边长的一半) */
  background: #f1f1f1;
}
/* 第二个侧面:旋转90度,作为立方体右侧面 */
#box div span:nth-child(2){
  transform: rotateY(90deg) translate3d(0,0,130px);
  background: #f8f8f8;
}
/* 第三个侧面:旋转180度,作为立方体背面 */
#box div span:nth-child(3){
  transform: rotateY(180deg) translate3d(0,0,130px);
  background: #ededed;
}
/* 第四个侧面:旋转270度,作为立方体左侧面 */
#box div span:nth-child(4){
  transform: rotateY(270deg) translate3d(0,0,130px);
  background: #f7f7f7;
}
/* 文字容器:居中对齐 */
#box div span .container {
  text-align: center;
}
#box div span .container .side{
  display: flex;
  justify-content: center;
  align-items: center;
}
/* 文字样式:垂直排版(writing-mode: vertical-lr),增强3D立方体的视觉效果 */
#box div span .container .side h2{
  font-size: 5em;
  writing-mode: vertical-lr; /* 文字垂直排列 */
  text-orientation: upright; /* 文字直立显示 */
  font-weight: 700;
  line-height: 1.2em;
  color: #0e2f56;
}
#box div span .container .side h3{
  font-size: 2.7em;
  text-transform: uppercase; /* 字母大写 */
  writing-mode: vertical-lr;
  color: #fff;
  letter-spacing: .12em;
  background: #0e2f56;
  padding-top: 20px;
  padding-bottom: 10px;
  font-weight: 300;
}
#box div span .container .side h4{
  font-size: 2.2em;
  writing-mode: vertical-lr;
  text-orientation: upright;
  text-transform: uppercase;
  line-height: 2em;
  color: #0e2f56;
}

三、几行 JS 搞定:鼠标交互效果

交互逻辑就监听鼠标移动事件,获取鼠标的 X 轴坐标,动态修改立方体的rotateY值,再固定rotateX为 - 30 度,让立方体保持等距视角,鼠标一动就有反馈,手感刚好。

// 获取3D立方体的DOM元素
var box = document.getElementById("box");
// 监听全局鼠标移动事件
window.onmousemove = function(e) {
  // e.clientX:鼠标相对于浏览器可视区的X坐标
  // rotateX(-30deg):固定立方体的上下角度,保持等距视觉
  // rotateY(${e.clientX}deg):让立方体跟着鼠标X轴旋转
  box.style.transform = `rotateX(-30deg) rotateY(${e.clientX}deg)`
}
写着写着就到了结尾,祝您今晚有个好梦(代码少报错一点)。

本文由mdnice多平台发布

1、CSS 滤镜反转颜色

/* 代码实现全网站暗黑模式 */
@media (prefers-color-scheme: dark) {
    html {
        background-color: #fff !important;
        color: #000 !important;
    }

    html {
        /* 反转180度颜色 */
        filter: invert(1) hue-rotate(180deg) !important;
    }

    /* 图片、视频等元素不需要处理,可继续添加可以不用处理的元素 */
    img,
    video,
    iframe {
        /* 再反转180度变成原来颜色 */
        filter: invert(1) hue-rotate(180deg) !important;
    }
}

2、JS 库添加蒙板

<script src="https://cdnjs.cloudflare.com/ajax/libs/Darkmode.js/1.5.7/darkmode-js.min.js"></script>
<script>
    // 监听系统暗黑模式变化
    let darkmode = new Darkmode()
    window
        .matchMedia('(prefers-color-scheme: dark)')
        .addEventListener('change', (event) => {
            if (event.matches) {
                // 切换暗黑模式
                if (!darkmode.isActivated()) {
                    darkmode.toggle()
                }
            } else {
                // 切换亮色模式
                if (darkmode.isActivated()) {
                    darkmode.toggle()
                }
            }
        })
</script>

3、CSS 伪类:not() 选择器

/* 代码实现全网站暗黑模式 */
@media (prefers-color-scheme: dark) {
    /* 排除的 a 和 code 元素 */
    html *:not(a, code *) {
        background-color: #000000 !important;
        color: #ffffff !important;
    }

    /* a元素单独设置颜色 */
    a {
        color: #4caf50 !important;
    }
}

4、CSS media 媒体查询

HTML <link> media 属性定义和用法

media 属性规定目标资源针对什么媒体/设备进行了优化。

media 属性指定了被链接文档将显示在什么设备上。

该属性主要与 CSS 样式表一起使用,为不同的媒体类型指定不同的样式。

media 属性可以接受多个值。

<!-- 只在亮色模式下生效 -->
<link
    rel="stylesheet"
    media="(prefers-color-scheme: light)"
    href="/assets/css/light.css"
/>

<!-- 只在暗黑模式下生效 -->
<link
    rel="stylesheet"
    media="(prefers-color-scheme: dark)"
    href="/assets/css/dark.css"
/>

在上篇文章,我们学会了现代 CSS 颜色的基础用法。

本篇我们进入更高级的领域:如何像设计师一样操纵颜色

CSS 现在能做的事情,甚至比设计软件还要强大!

1. 操纵颜色

1.1. 基础回顾

先复习一下上篇文章的内容:

:root {
  --primary: #ff0000;
}

.primary-bg-50-opacity {
  /* h s l 不是字母,是变量! */
  background: hsl(from var(--primary) h s l / 0.5);
}

注意: h s l 这三个字母其实是变量,分别存储了色相(hue)、饱和度(saturation)、亮度(lightness)的值。

我们可以替换这些变量,比如给绿色(#00ff00)加点蓝:

/* 基础绿色没有蓝色成分 */
.green-with-a-touch-of-blue {
  /* 在蓝色通道加 25 */
  color: rgb(from #00ff00 r g calc(b + 25));
}

这就像调色板,在基础的绿色中,添加点“蓝色颜料”。

1.2. 实用技巧

掌握了基础用法,我们就可以讲些实际开发中会用到的场景了。

  1. 创建互补色(色轮对面的颜色):
:root {
  --color-primary: #2563eb; /* 蓝色 */

  /* 色相加 180 度,跳到对面 */
  --color-secondary: hsl(from var(--color-primary) calc(h + 180) s l);
}
  1. 创建三色组合:
:root {
  --color-primary: #2563eb;

  /* 色轮上均匀分布 120 度 */
  --color-secondary: hsl(from var(--color-primary) calc(h + 120) s l);
  --color-tertiary: hsl(from var(--color-primary) calc(h - 120) s l);
}

就像时钟:12 点是主色,4 点和 8 点是配色,完美对称!

使用效果如下:

<!-- 这是一张图片,ocr 内容为:CHANGE THE PRIMARY COLOR: -->

  1. 相对调整
:root {
  --color-primary-base: #2563eb;

  /* 比基础色亮 25% */
  --color-primary-lighter: hsl(from var(--color-primary-base) h s calc(l + 25));

  /* 比基础色暗 25% */
  --color-primary-darker: hsl(from var(--color-primary-base) h s calc(l - 25));
}

使用这种方法,不管基础色是多亮,都会相对地变亮或变暗。

这就像调空调,“比现在低 5 度”比“设定到 20 度”更灵活。

使用效果如下:

<!-- 这是一张图片,ocr 内容为:CHANGE THE PRIMARY COLOR: -->

2. 暗黑模式的层次感

现在我们能相对调整颜色了,可是究竟有什么用呢?

让我给你举个具体的使用场景。

在浅色主题中,我们可以根据阴影来区分层次:

<!-- 这是一张图片,ocr 内容为:LEVEL 1 LEVEL 2 LEVEL 3 -->

但在深色背景下,阴影的效果并不明显。

因此在深色主题中,我们希望每个层次的颜色略微变浅。

借助上篇讲过的 light-dark()和相对颜色调整,我们便可以实现:

:root {
  --surface-base-light: hsl(240 67% 97%);
  --surface-base-dark: hsl(252 21% 9%);
}

/* 第一层:基础层 */
.surface-1 {
  background: light-dark(var(--surface-base-light), var(--surface-base-dark));
}

/* 第二层:稍微亮一点 */
.surface-2 {
  background: light-dark(var(--surface-base-light), hsl(from var(--surface-base-dark) h s calc(l + 4)));
}

/* 第三层:再亮一点 */
.surface-3 {
  background: light-dark(var(--surface-base-light), hsl(from var(--surface-base-dark) h s calc(l + 8)));
}

想象一下深海:越接近水面,光线越充足。暗色模式的层次就是这个原理。

使用效果如下:

<!-- 这是一张图片,ocr 内容为:LEVEL 1 LEVEL 1 LEVEL 2 LEVEL 2 LEVEL LEVEL 3 -->

3. 完整配色方案

设计师创建配色方案时,不只是简单地调整亮度,还会同时微调色相和饱和度,比如

  • 变亮时:饱和度增加,色相向冷色调偏移
  • 变暗时:饱和度降低

这便可以通过 CSS 来实现:

:root {
  --primary-base: hsl(221 83% 50%);

  /* 400: 亮度60%,色相-3度,饱和度+5% */
  --primary-400: hsl(from var(--primary-base) calc(h - 3) calc(s + 5) 60%);

  /* 300: 亮度70%,色相-6度,饱和度+10% */
  --primary-300: hsl(from var(--primary-base) calc(h - 6) calc(s + 10) 70%);

  /* 以此类推... */
}

为什么要这么麻烦呢?

因为只调亮度会让浅色看起来“失去活力”。

就像拍照:自动模式能拍,但手动调整曝光、对比度、色温会更漂亮。

为了让你更直观地看到变化

<!-- 这是一张图片,ocr 内容为:PRIMARY COLOR SCALE SYSTEMS PERCEPTUAL SCALE(ADJUSTS HUE & SATURATION) 200 700 900 600 1000 100 400 800 500 300 FLAT SCALE(ONLY LIGHTNESS CHANGES) 600 500 400 300 100 700 1000 900 800 200 -->

第一排是都调整的版本,第二排是未调整色相和饱和度的版本。

最明显的区别在于 100、200 和 300 这几个色块,当仅调整亮度值时,颜色看起来失去了一些鲜艳度。

4. OKLCH 更科学的配色方式

4.1. 问题:HSL

HSL 虽然很棒,但在使用时,你会发现一些问题,让我们看个例子:

.green-bg {
  /* 饱和度 100%,亮度 50% */
  background: hsl(100 100% 50%);
  color: white;
}

.blue-bg {
  /* 同样饱和度 100%,亮度 50% */
  background: hsl(220 100% 50%);
  color: white;
}

你会发现,色和蓝色的饱和度、亮度虽然完全一样,但视觉效果完全不同:

<!-- 这是一张图片,ocr 内容为:BLUE GREEN -->

明显蓝色背景上的文字清晰易读,对比度超过 5,而绿色背景上的文字却很难看清,对比度仅略高于 1。

之所以会这样,是因为 HSL 的“亮度”不符合人眼感知。

人眼对绿色比蓝色更敏感,所以同样的“50%亮度”,绿色看起来更亮。

4.2. 解决:OKLCH

而这就是 oklch() 的优势。

OKLCH 是基于感知亮度设计的:

.consistent-green {
  background: oklch(0.54 0.23 261);
}

.consistent-blue {
  background: oklch(0.54 0.23 146);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为:BLUE GREEN -->

现在不管什么颜色,亮度值相同,人眼看起来的亮度就相同!

4.3. 讲解:OKLCH 的三个参数

在 LCH 颜色模型中:

第一个值是亮度(Lightness),取值范围为 0 到 1。它的计算方式与 HSL 略有不同,因为它基于感知亮度,但概念相同,即 0 是黑色,1 是白色。

第二个值是色度(Chroma),类似于饱和度,0 是灰色,越大越鲜艳,但最大值不固定,取决于亮度和色相(这是 OKLCH 最麻烦的地方)

第三个值是色相(Hue),和 HSL 一样是色轮,0 到 360 度,区别是 0 度是洋红色(HSL 里 0 度是红色)

OKLCH 的尴尬之处就在于色度(Chroma)的最大值会变:

/* 某些色相+亮度组合,0.4 已经是极限 */
.max-chroma-1 {
  background: oklch(0.6 0.4 120);
}

/* 但另一些组合,0.4 可能太高或太低 */
.max-chroma-2 {
  background: oklch(0.8 0.4 200); /* 可能超出范围 */
}

就像不同口味的饮料,有的最浓是“3 勺糖”,有的最浓是“5 勺糖”,没有统一标准。

4.4. 实用技巧:结合相对颜色

虽然直接写 OKLCH 值很麻烦,但我们可以用 HSL 定义基础色,然后用 OKLCH 保持一致性:

.toast {
  --base-color: hsl(225, 87%, 56%); /* 用熟悉的 HSL 定义 */
}

[data-toast="info"] {
  /* 只改变色相,保持亮度和色度 */
  --toast-color: oklch(from var(--base-color) l c 275);
}

[data-toast="warning"] {
  --toast-color: oklch(from var(--base-color) l c 80);
}

[data-toast="error"] {
  --toast-color: oklch(from var(--base-color) l c 35);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为:USING OKLCH SOME GENERAL INFO TOAST THIS MIGHT END BADLY OH NO, SOMETHING HAS GONE WRONG! USING HSL SOME GENERAL INFO TOAST THIS MIGHT END BADLY OH NO,SOMETHING HAS GONE WRONG! -->

这样做的好处在于:不同颜色的提示框,边框对比度、整体饱和度感觉都很一致。

5. 混合颜色

有的时候,我们可能需要混合两种颜色:

.purple {
  /* 红色和蓝色各占 50% */
  color: color-mix(in srgb, red, blue);
}

就像调颜料:红色颜料加蓝色颜料,得到紫色。

目前必须定义一个颜色空间,所以必须写 in srgbin oklab 等,未来会默认用 oklab

不同颜色空间混出来的结果不一样:

<!-- 这是一张图片,ocr 内容为:SRGB OKLCH OKLAB XYZ XYZ -->

一般推荐:

  1. 先试 oklab
  2. 再试 oklch
  3. 不满意就换其他的

5.1. 控制混合比例

默认情况下,使用该功能时 color-mix(),每种颜色将使用 50% 的强度。

当然,我们也可以控制特定颜色的具体强度。

/* 90% 红色 + 10% 蓝色 */
.red-with-a-touch-of-blue {
  background: color-mix(in oklab, red 90%, blue);
}

/* 或者反过来写 */
.or-like-this {
  background: color-mix(in oklab, red, blue 10%);
}

5.2. 创建半透明色

有两种方法可以获得透明的值:

方法一:让总量小于 100%

/* 60% + 20% = 80%,所以透明度是 80% */
.semi-opaque {
  background: color-mix(in oklab, red 60%, blue 20%);
}

方法二:混入 transparent

/* 30% 的不透明红色 */
.thirty-percent-opacity-red {
  background: color-mix(in oklch, red 30%, transparent);
}

不过如果只是想降低透明度,还是用相对颜色更直接:

.better-way {
  background: rgb(from red r g b / 0.3);
}

5.3. 小技巧:分段渐变

/* 不用手动算中间的每个颜色,color-mix 帮你搞定 */
.banded-gradient {
  background: linear-gradient(to right, red, color-mix(in oklch, red 75%, blue), color-mix(in oklch, red 50%, blue), color-mix(in oklch, red 25%, blue), blue);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为: -->

6. 未来更简单

重复写这些代码很烦?

CSS 自定义函数快来了:

/* 定义函数 */
@function --lower-opacity(--color, --opacity) {
  result: oklch(from var(--color) l c h / var(--opacity));
}

/* 使用函数 */
.lower-opacity-primary {
  background: --lower-opacity(var(--primary), 0.5);
}

或者定义整套色阶函数:

@function --shade-100(--color) returns <color> {
  result: hsl(from var(--color) calc(h - 12) calc(s + 15) 95%);
}

@function --shade-200(--color) returns <color> {
  result: hsl(from var(--color) calc(h - 10) calc(s + 12) 85%);
}
/* 以此类推... */

.call-to-action {
  background: --shade-200(var(--accent));
}

.hero {
  background: --shade-800(var(--primary));
  color: --shade-100(var(--primary));
}

一次定义,到处使用,完美!

7. 总结

最后总结下本篇文章的重点:

  1. 用 calc() 操纵颜色 - 数学生成配色方案
  2. OKLCH - 基于人眼感知的颜色系统,不同色相亮度一致
  3. color-mix() - 像调颜料一样混合颜色

在实际使用时:

  • 简单需求:相对颜色 + HSL
  • 需要视觉一致性:OKLCH
  • 需要混合颜色:color-mix()
  • 暗黑模式层次:light-dark() + 相对颜色

本篇整理自《A pragmatic guide to modern CSS colours - part two》,希望能帮助到你。

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

这是一个使用 HTML + CSS + JavaScript 实现的 QQ2006 像素级复刻项目,重现了 80/90 后网友的青春记忆——那个伴随我们成长的经典 QQ 界面!

从登录框的珊瑚蓝渐变,到主面板的好友头像,再到聊天窗口的功能图标,所有素材全部从原版 QQ2006 安装包提取,力求还原最原始的体验

预览图

演示地址: https://lab.ur1.fun/QQ2006/

开源地址: https://github.com/mengkunsoft/QQ2006

🎯 为什么做这个?

20 年前的 QQ2006 ,是很多 80/90 后的数字故乡。那时我们还说着“GG/MM”,攒钱买 Q 秀,为太阳等级熬夜挂机……这个项目不只是 UI 复刻,更是一次怀旧疗愈。

好吧,其实纯为了怀旧&好玩,要说有什么用,还真没什么用……

本项目代码全是业余时间手搓,没有用到 AI ,断断续续做了两周。

🌟 未来计划

  • 增加更多交互逻辑,实现基础聊天功能模拟
  • 复刻更多子功能界面,如菜单面板、视频聊天界面等

⚠️ 注意事项

  • 仅供学习交流,请勿用于商业用途
  • 尊重版权,所有素材均来自原版 QQ2006 安装包,版权归腾讯公司所有

🤝 贡献指南

如果你对这个项目感兴趣,想一起打造更完整的 QQ2006 复刻版,欢迎提交 PR 或 Issue 。让我们一起为这段数字记忆添砖加瓦!

📜 开源许可

你可以自由地分享和修改代码,但请保留出处。


让我们一同重温那段青涩时光,用代码致敬经典!

TL;DR 结论成品

油猴脚本下载地址:https://greasyfork.org/zh-CN/scripts/553438-%E6%B7%BB%E5%8A%A0%E7%9B%98%E5%8F%A4%E4%B9%8B%E7%99%BD

Chrome 140 + 浏览器,安装即可享受任意网页开启高性能盘古之白排版


什么是盘古之白?

就是在中文和英文 / 数字之间自动加半个空格,强迫症福音,为了让排版更好看,阅读体验更好

以前的做法

我以前使用过浏览器插件 為什麼你們就是不能加個空格呢? ,但是他在网页中有很多字符的情况下,性能很差,而且他是真的会显式的加入一个空格在中间,导致效果也不算好

现在的新方案

Chrome 内核 140 + 的浏览器已经支持 text-autospace: normal 这个 css 属性了,可以直接让浏览器原生处理排版,一步到位,而且这个样式确实加的是半个空格的空间,并且不存在显式插入的空格,完美

其他支持的浏览器版本如下:

结尾再放一次油猴脚本下载地址,免得佬友还得滚动上去下载
https://greasyfork.org/zh-CN/scripts/553438-%E6%B7%BB%E5%8A%A0%E7%9B%98%E5%8F%A4%E4%B9%8B%E7%99%BD


📌 转载信息
转载时间:
2026/1/6 18:43:35

我们日常在画图形需要圆角时,经常使用 border-radius 来搞定,这样确实很方便,毕竟可以直接通知八个方向的角度。但是对于一些特殊需求或者是一些不规则的 border 而言,慢慢调整确实有些麻烦。今天就再给大家介绍一个新东西 corner-shape.

1. corner-shape 概念

corner-shape 属于 CSS 背景与边框模块 Level 4 中的新特性,用来扩展原本只会画圆角的 border-radius 。 以前只能做圆圆的角,现在可以在同一块盒子上做出内凹、斜切甚至介于圆和方之间的

它是一个全新的属性,用来控制圆角区域的形状,配合 border-radius 可以非常方便地做出十字形、六边形、凹角卡片、对话气泡等复杂图形。

对有边框的盒子,简单理解为:

  • border-radius:控制圆角半径,即弧线的大小
  • corner-shape:控制弧线的形状,是圆、斜切、凹口还是其他形状
可以简单理解为:border-radius 决定角有多大,corner-shape 决定角长成什么样。

2. 语法

.box {
  border: 4px solid #333;
  border-radius: 20px;
  corner-shape: round;
}

基本语法很简单,与 border-radius 搭配即可。

巧妇难为无米之炊

必须要先有 border-radius,否则没有圆角区域可以改变形状。

3. 可选值关键字

在上述示例中,我们使用了 corner-shape: round,这里使用了 round 作为值。

其实 corner-shape 的可选值有多个,例如 roundscoopbevelnotchsquaresquircle。下面做一些简单说明:

  • round:默认圆角,和现在习惯的圆角一样。​
  • scoop:角被挖掉一块形成凹进去的四分之一椭圆。​
  • bevel:斜切角。​
  • notch:生成内凹的缺口角。​
  • square:强制角保持直角,等于取消圆角,即使 border-radius 不是 0。
  • squircle:介于正方形和圆之间的平滑形状,可以理解为有点圆的方块。​

4. 单独设置角的形状

我们可以像 border-radius 一样,自由的为每个角设置不一样的形状来完成更为复杂的需求,而不是全都一个样式。

我们主要有两种写法,一种是简写,一种是单独的方向控制。

4.1 简写

和许多的属性一样,corner-shape 也可以简写来同时控制多个方向,最少一个值,最多可以设置四个值。

  • 一个值:四个角一致。
  • 两个值:第一个为左上和右下,第二个为右上和左下。
  • 三个值:第一个为左上,第二个为右上和左下,第三个为右下。
  • 四个值:第一个为左上,第二个为右上,第三个为右下,第四个为左下。

4.2 单独方向控制

border-radius 一样, corner-shape 也有有 “方向版” 属性,如:corner-top-left-shapecorner-top-right-shapecorner-bottom-right-shapecorner-bottom-left-shape

看名字就知道它们所代表的方向,这里就不细说了。

.card {
  border-radius: 40px;
  corner-top-right-shape: scoop;
}

5. 特殊的 superellipse()

除了使用上述列举的关键字外,还可以使用数学函数 superellipse(K) 来精细控制角的曲率。

可以把 superellipse(K) 理解为:​

  • K 越接近 1:越接近普通圆角(圆形)。​
  • K 越大:形状越接近方形,但角还是平滑的,而不是死直角。​
  • K 为 0:就是斜切角,类似 bevel。​
  • K 小于 0:变成内凹形状,类似星形或凹角,不同的负值凹陷程度不同。​
.box1 {
  border-radius: 40px;
  corner-shape: superellipse(1);   /* 接近圆角 */
}

.box2 {
  border-radius: 40px;
  corner-shape: superellipse(4);   /* 更像正方形 */
}

.box3 {
  border-radius: 40px;
  corner-shape: superellipse(0);   /* 斜切角 */
}

.box4 {
  border-radius: 40px;
  corner-shape: superellipse(-1.5); /* 内凹的角 */
}

其效果如下所示

一些关键词值其实可以看作 superellipse(K) 的别名:例如普通圆角 round 类似于 superellipse(1) ,而 square 对应极大 K 值。

6. 兼容性

目前 corner-shape 仍然是非常新的属性,主要在新版 Chromium 内核浏览器里(如较新版本 Chrome)率先实现。 在较旧或不支持的浏览器里,这个属性会被忽略,最终表现就是普通的 border-radius 圆角。

【2026 新年第一课】有趣的 corner-shape12

为了保证兼容性:

  • 应当先写好正常的 border-radius 样式作为基础效果。
  • 再加上 corner-shape,支持的浏览器会增强显示,不支持的仍然是普通圆角。

7. codepen 预览


今天的分享就到这里了,后面我会增加几期实战效果,希望佬们喜欢

最后,元旦快乐!٩(‘ω’)و


点赞助力大鹅不摆烂

【2026 新年第一课】有趣的 corner-shape14


📌 转载信息
原作者:
Clarke.L
转载时间:
2026/1/1 15:38:15

  工欲善其事必先利其器,这是一个关于十大黑客最佳操作平台的综合文章。

  在本文中,包括公德黑客运用的10个绝佳操作平台。每一个都是免费的,基于于Linux位,并且与许多黑客工具一起打包。

  10.

  |IMG

  是一个渗透检测的发行版的Linux从全球受到了最流行的免费的操作平台无法为黑客,的2017黑客入侵工具包,和周遭的工作GNOME经典图形桌面状态。

  该为大概3GB的镜象DVDISO画质,是基于的发行及自起动运行光碟,其传统在于一套用于网路渗透检测的实用软件虽然它与非常相像,但并不完全相似。采用了GNOME桌面。

  致力于必须执行渗透检测操作的安全学者视频培训脚本,的工作框架大部份包括了五分类软件,这些工具早已在菜单包括五个类别归纳整理。

  下载

  9.

  2017黑客入侵工具包

  |IMG

  是一个基于的开放源码渗透检测Linux发行版,它借助存档进行升级。它包含300多个渗透检测软件,另外还包含进行广泛操作所需的基本管理硬件。

  下载

  8.HAWKLINUX

  截图|IMG:

  HawkLinux被视为常识解决方案有限公司(PvtLtd.)生产的最非凡黑客技术,最有效和全面的基于的渗入测试Linux分散技术。专用于700多种适于渗透检测仪的软件,以及300多种适于多功用安全的器材和蓄意软件调查。

  HawkLinux是为白围巾黑客和渗入测试者设计的基于(Linux)的Linux发行版操作平台。Hawk可以适于网络安全和会计或者数字取证。它还包括多种软件,适合于联通安全和无线网路安全检测。

  下载HAWKLINUX

  7.ARCHLINUX

  ArchLinuxIMG:

  ArchLinux绝对是免费和开放源代码软件,并支持社区参加。

  ArchLinux是通用x86/64GNU/Linux发行版。Arch采用滚动更新机制,尽大力提供最新的稳固版硬件。初始安装的Arch只是一个基本平台,随后客户可以按照自己的偏好安装必须的硬件并配置成合乎自己梦想的平台.

  下载ArchLinux

  6.(NST)

  NST|iMG

  网络安全软件包(NST)是一个可鼓励的即用(live)CD,基于Core。这个软件包设计用来方便访问最棒的开源网路安全应用,主要运行在x86系统上。开发这个网路安全软件包的主要目的是为网路安全管控人员提供一套完备的开源网路安全软件。

  NST最奇特的地方是可以将大多数x86机器(奔腾2及以上)转化成一台可以适于网络流量预测、入侵测试、网络数据包生成、无线网路监视的虚拟服务器,当然它也可以当作一套复杂的网路/主机扫描器来使用。

  下载

  5.WEB

  武士网络测试|IMG:博客

  Web测试框架从根本上集中在检测Web应用程序的安全性,并牵涉Web评估和误用设备的负载。建立“武士网络测试框架”的功绩来自于Kevin,和Frank。“武士框架”为公德黑客和面试者提供了一个即时Linux条件,该条件预先配置为再次运行成为虚拟机执行Web渗透检测。

  武士Web测试框架结合了众所周知的检测器材,如和ance,和适于映射,w3af和Burp的启迪,以及BeEF和的研发。结构依赖于9.04,是完全开源的,并斩获关于工程的正常升级。

  下载WEB

  4.

  IMG

  是一个基于Unix的工作框架,根据由RedHat公司支持的由支持的组创立的Linux和GNU程序(Linux发行版)。

  包括的程序分散在不同的免费和开放源代码许可证下,并计划变成这种科技的主要优势。是RedHatLinux发行版的附属产品。

  下载

  3.

  IMG

  OS是面向安全的操作平台,它被设计为适于渗透检测、计算机取证、反向工程、攻击、云计算渗透检测、隐私/匿名、密码等场合。该发行基于,其传统在于MATE桌面环境,并由研发。

  操作平台运用Kali存档进行各类捆绑更新并协调新的软件。为PC框架审查员提供一个简略易用的GUI和重量级条件,发挥广泛的法律科学,弱点评估和加密。这个操作平台是十分适于定制化。

  下载操作平台

  2.

  LinuxIMG

  是一个基于的Linux发行版,用于在安全检测中帮助道德黑客和渗入测试员工。操作平台的目标是更迅速,更有效地运行并具备可忽视桌面的状况。的主要优势在于,它自己的特定软件内存在正常的时间间隔内进行升级2017黑客入侵工具包,以维持颜色的稳固和流行。

  分散包括从Web测试和平台调查到拉伸测试,嗅探,安全检测,犯罪现场调查和研发的70多种软件。

  下载

  1.KALILINUX

  KaliLinux|

  最先进的渗入测试平台。KaliLinux也是一个旨在于小软件(称为KaliLinux)应用。

  由Ltd维护和支助。最先由的Mati和Devon通过重写来完成,是她们之前写的适于取证的Linux发行版。

  最流行的kaliLinux软件

  Nmap,-ng,,,框架,Burp套件,John培训脚本,社会项目软件包,,,OWASPZAP

  下载KALILINUX

因为是从wordpress程序转换过来的,之前的文章评论都有类似的头像显示异常,我以为是wp转换的原因,也没怎么管,今天刚好测试了一下评论功能,结果才发现头像被拉的长长的,问了一下主题作者,作者说是CSS的原因,只能自己瞎搞了。

从主题的comment文件里找到下面这行代码:

<a class="ui big circular image avatar">
      <img class="avatar lazyload" data-src="<?php echo imgravatarq($comments->mail); ?>" alt="" width="60" height="60">
    </a>

注意一下,因为主题不同,所以代码不可能一模一样,所以要自己分辨找对,提前备份好。
然后将其替换为:

<span itemprop="image"><?php $number=$comments->mail;
if(preg_match('|^[1-9]\d{4,11}@qq\.com$|i',$number)){
echo '<img src="https://q2.qlogo.cn/headimg_dl? bs='.$number.'&dst_uin='.$number.'&dst_uin='.$number.'&;dst_uin='.$number.'&spec=100&url_enc=0&referer=bu_interface&term_type=PC" width="46px" height="46px" style="border-radius: 50%;float: left;margin-top: 0px;margin-right: 10px;margin-bottom:-2px">'; 
}else{
echo '<img src="https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture" width="46px" height="46px" style="border-radius: 50%;float: left;margin-top: 0px;margin-right: 10px;margin-bottom:-2px">';
}
?>
</span>

这样改完之后,评论留的的如果是QQ邮箱,就显示QQ头像,
如果不是,就使用随机头像。