Skip to content

CSS通用样式

第三方字体图标优化方案

css
/* Chrome 检测到字体加载过慢,为避免文字长时间不显示,使用了备用字体 */
/* 使用 font-display: swap; 表示:先使用备用字体渲染,等自定义字体加载好了再替换。这样可以避免文字长时间不显示*/

/* 例如: */
@font-face {
  font-family: 'IconFont';
  src: url('http://192.168.31.254:9999/src/fonts/iconfont.woff2?t=1764658108988') format('woff2');
   ......
  font-display: swap; /* 推荐 */
}

文字操作系列

文字换行

scss
{
    // 文职换行,中英文通用.
    white-space: normal;	// 文字能自动换行
    word-break: break-all;	// 防止文字被挤压
    overflow-wrap: break-word; /* 现代标准 */
    word-wrap: break-word;	// 允许英文单词内换行(区别于 break-all):优先在单词间隙换行,仅单词超长时才在词内换行,兼顾中英文排版

    // pre标签可能有点用
    white-space: pre-wrap;       /* 保留空格和换行,同时允许自动换行 */
}

文字不允许换行/超出'...'代替

scss
{
    overflow: hidden;
    text-overflow: ellipsis; // 溢出部分显示省略号(仅在 -webkit-line-clamp 生效时显示)
    -webkit-line-clamp: 2;  // 文字超出两行...
    line-clamp: 2;
    display: -webkit-box;	// 将元素转为弹性盒模型,配合 -webkit-line-clamp 生效
    -webkit-box-orient: vertical;	// 设置弹性盒的排列方向为垂直,让文字按行排布
    word-break: break-word;  // 兼容英文长词
    overflow-wrap: break-word; // 标准语法
}

背景

玻璃效果

scss
{
    /** 对元素背后的背景区域进行模糊处理,并将背景颜色的饱和度提升到 200% **/
    // saturate() 滤镜函数,用来调整颜色的饱和度(鲜艳程度);blur值越大背景越模糊
    backdrop-filter: saturate(200%) blur(10px);
    -webkit-backdrop-filter: saturate(200%) blur(10px); // 兼容webkit内核【ios】

    // 模糊元素自身(比如把一张图片变模糊)
    filter: blur(10px);
    // 模糊元素背后的背景区域(毛玻璃效果的核心
    backdrop-filter: blur(10px);
}

过度效果

transition

scss
{
    /* ========== 过渡属性:指定哪些属性参与过渡 ========== */
    transition-property: all;                    /* 所有属性都参与过渡 */
    transition-property: background-color;       /* 只有背景色参与过渡 */
    transition-property: width, height, opacity; /* 多个属性,逗号分隔 */
    transition-property: none;                   /* 没有任何属性参与过渡 */


    /* ========== 过渡时长:动画持续多久(必填项) ========== */
    transition-duration: 0.2s;    /* 0.2 秒 */
    transition-duration: 300ms;   /* 300 毫秒,和 0.3s 一样 */
    transition-duration: 1s;      /* 1 秒,比较慢的过渡 */


    /* ========== 动画方式(缓动函数):控制速度变化曲线 ========== */
    transition-timing-function: ease;              /* 默认值,先慢→快→慢,最自然 */
    transition-timing-function: linear;            /* 匀速,从头到尾速度不变 */
    transition-timing-function: ease-in;           /* 慢进快出,适合元素"消失" */
    transition-timing-function: ease-out;          /* 快进慢出,适合元素"出现" */
    transition-timing-function: ease-in-out;       /* 慢进慢出,适合来回切换 */
    transition-timing-function: cubic-bezier(0.68, -0.55, 0.27, 1.55); /* 自定义曲线,带回弹效果 */
    transition-timing-function: steps(4, end);     /* 阶梯式,分 4 步跳变,像逐帧动画 */


    /* ========== 延迟时间:动画开始前等多久 ========== */
    transition-delay: 0s;     /* 不延迟,立即开始(默认值) */
    transition-delay: 0.1s;   /* 延迟 0.1 秒再开始 */
    transition-delay: 0.5s;   /* 延迟半秒再开始 */


    /* ========== 简写形式:属性 时长 动画方式 延迟 ========== */
    transition: all 0.2s ease;                              /* 最常用,所有属性 0.2s 自然过渡 */
    transition: background-color 0.3s ease-out;             /* 背景色 0.3s 快进慢出 */
    transition: transform 0.4s ease-in-out;                 /* 变换 0.4s 慢进慢出 */
    transition: opacity 0.3s linear 0.1s;                   /* 透明度 0.3s 匀速,延迟 0.1s */
    transition: width 0.3s ease, opacity 0.5s linear 0.1s;  /* 多个属性各自配置,逗号分隔 */

    /* 多个属性各自独立设置(逗号分隔) */
    transition: 
        background-color 0.2s ease,            /* 背景色 0.2秒 平滑过渡 */
        box-shadow 0.3s ease-out,              /* 阴影 0.3秒 快进慢出 */
        transform 0.4s ease-in-out 0.1s;       /* 变换 0.4秒 慢进慢出 延迟0.1秒 */
}

滚动条

全局自定义滚动条样式

scss
:root{
    --lukes-scrollbar-width: 8px;
}
/* 1. WebKit 浏览器(Chrome/Edge/Safari) */
/* 1. 滚动条整体样式(宽/高) */

::-webkit-scrollbar {
    width: var(--lukes-scrollbar-width);    /* 垂直滚动条宽度 */
    height: var(--lukes-scrollbar-width);   /* 水平滚动条高度 */
}

/* 2. 滚动条轨道(背景、圆角) */
::-webkit-scrollbar-track {
    /* 轨道背景色 */
    background: rgba(0,0,0,0);  
}

/* 3. 滚动条滑块(核心样式) */
::-webkit-scrollbar-thumb {
    /* 滑块默认颜色 */
    background-color: rgba(144, 147, 153, 0.3);  
    cursor: pointer;
    /* 上下左边框保留,营造悬浮感 */
    border-right: 2px solid #1c0e36;
    /* 滑块圆角(避免尖锐) */
    border-radius: calc(var(--lukes-scrollbar-width) / 2);  
}

/* 4. 滑块 hover 状态 */
::-webkit-scrollbar-thumb:hover {
    background-color: rgba(144, 147, 153, 0.5);  /* hover 时加深颜色 */
}

/* 5. 滑块激活(点击拖动)状态 */
::-webkit-scrollbar-thumb:active {
    /* background: #888;     激活时更深颜色 */
}

/* 可选:滚动条交汇处样式 */
::-webkit-scrollbar-corner {
    /* background: #f1f1f1;
    border-radius: 6px; */
}

/* 2. Firefox */
.container {
    /* scrollbar-width: 6px; */
    /* 滑块颜色 + 轨道颜色 */
    /* scrollbar-color: rgba(144, 147, 153, 0.3) rgba(0,0,0,0); */
}

局部容器自定义滚动条样式

scss
/* 1. container-scroll为容器的类名 */
.container-scroll{
    /* 1. WebKit 浏览器(Chrome/Edge/Safari) */
    /* 1. 滚动条整体样式(宽/高) */

    --lukes-container-scroll-width: 6px;

    &::-webkit-scrollbar {
        width: var(--lukes-container-scroll-width);    /* 垂直滚动条宽度 */
        height: var(--lukes-container-scroll-width);   /* 水平滚动条高度 */
    }

    /* 2. 滚动条轨道(背景、圆角) */
    &::-webkit-scrollbar-track {
        /* 轨道背景色 */
        background: transparent;  
    }

    /* 3. 滚动条滑块(核心样式) */
    &::-webkit-scrollbar-thumb {
        /* 滑块默认颜色 */
        background-color: rgba(144, 147, 153, 0.3);  
        cursor: pointer;
        /* 上下左边框保留,营造悬浮感 */
        border-right: 2px solid transparent;
        /* 滑块圆角(避免尖锐) */
        border-radius: calc(var(--lukes-container-scroll-width) / 2);  
    }

    /* 4. 滑块 hover 状态 */
    &::-webkit-scrollbar-thumb:hover {
        background-color: rgba(144, 147, 153, 0.5);  /* hover 时加深颜色 */
    }

    /* 5. 滑块激活(点击拖动)状态 */
    &::-webkit-scrollbar-thumb:active {
        /* background: #888;     激活时更深颜色 */
    }

    /* 可选:滚动条交汇处样式 */
    &::-webkit-scrollbar-corner {
        /* background: #f1f1f1;
        border-radius: 6px; */
    }
}

/* 在屏幕宽度小于等于 768px 时应用的样式 */
@media screen and (max-width: 768px) {
    .container-scroll{
        --lukes-container-scroll-width: 3px;
    }
}

局部容器保存滚动功能隐藏滚动条

scss
/** --------------------- 自定义容器隐藏滚动条 --------------------- **/
.container-scroll-none{
    // 只y轴滚动
    overflow-y: scroll;
    /* 容器级别的隐藏(兼容多浏览器) */
    -ms-overflow-style: none;  /* IE/Edge */
    scrollbar-width: none;     /* Firefox */

    &::-webkit-scrollbar {
        display: none; /* Chrome/Edge/Safari 容器滚动条隐藏 */
    }
}

内部变化不影响外部

scss
// 优化容器
.contain-container{
  // 性能优化:内部变化不影响外部 (主要处理【x轴滚】动条超出,顶部导航采用【粘性定位】不能使用【overflow-x: hidden】来隐藏x轴滚动条,所以用contain解决)
   /* 等同于告诉浏览器:
     1. 这个元素内部怎么布局都不会影响外面
     2. 这个元素只在自己的框里画东西,不会"污染"外部
  */
   //layout: 隔离元素的内部布局,使其与页面其余部分互不影响【使用 contain: layout 后,浏览器只需检查该元素内部。这意味着你可以放心地在这个元素内部增删节点或改变布局,而不会引发页面其他区域的重新计算。】
   //paint: 将元素的绘制严格限制在其边界内,防止内容溢出。【如果该元素位于屏幕可视区域之外,浏览器会直接跳过对其子元素的绘制,从而节省渲染资源,加快其他可见内容的渲染速度】
  contain: layout paint;
  min-height: 100vh;
}

/* dvh兼容则使用下面的样式 */
@supports (height: 100dvh) {
  // 优化容器
  .contain-container{
    min-height: 100dvh;
  }
}

解决ios点击【按钮、输入框...】高亮、抖动问题

scss
{
    /** ============== 解决ios点击时,抖动问题 ================ */
    /* 允许浏览器优化触摸事件,避免滑动被阻塞 */
    touch-action: manipulation;
    /* 禁用 Safari 原生的触摸高亮 */
    -webkit-tap-highlight-color: transparent;
    /** ============== 解决ios点击时,抖动问题 ================ */
}

ios系列问题

scss
{
    /* 禁止缩放/滚动,但部分场景下地址栏仍可被边缘手势触发
    * none: 禁止所有默认触摸行为,所有触摸事件交给 JS
    * pan-y: 允许垂直滚动
    * pan-x: 允许水平滚动
    */
    touch-action: none;


    /* 防止iOS “滚动链”穿透防止用户在弹窗、侧边栏或局部滚动区域内滚动到底部时,意外带动整个页面滚动;
    * contain:防止滚动穿透到body,但不禁止回弹效果。
    * none:完全禁止
    */
    overscroll-behavior: contain;

    /* 彻底禁用垂直方向的过滚动反馈和滚动链 */
    overscroll-behavior-y: none; 

    /* 启用 iOS 惯性滚动 */
    -webkit-overflow-scrolling: touch;
}

使用媒体查询@media

scss
/** ==============  基础用法  ================ */
/* 当屏幕宽度大于等于 768px 时生效(大屏设备) */
@media (min-width: 768px) {
  .container { display: flex; }
}

/* 当屏幕宽度小于等于 600px 时生效(小屏设备) */
@media (max-width: 600px) {
  body { background-color: lightblue; }
}


/** ==============  针对不同的媒体类型  ================ */
/* 专门针对打印机的样式 */
@media print {
  body { color: black; background: white; }
}

/* 专门针对屏幕阅读器的样式 */
@media speech {
  /* 语音朗读相关样式 */
}


/** ==============  组合多个条件(逻辑运算符) ================ */
/* 【and】屏幕宽度在 400px 到 700px 之间,且处于横屏状态 */
@media screen and (min-width: 400px) and (max-width: 700px) and (orientation: landscape) {
  .box { background-color: red; }
}

/* 【逗号 / or】屏幕处于竖屏,或者宽度小于 3rem */
@media (orientation: portrait), (max-width: 3rem) {
  .box { background-color: blue; }
}

/* 【not】取反:排除不支持悬停操作的设备(如触摸屏) */
@media not screen and (hover: hover) {
  /* 针对触摸设备的特殊样式 */
}


/** ==============  针对设备特定属性  ================ */
/* 针对视网膜(高分辨率)屏幕 */
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  .icon { background-image: url('icon@2x.png'); }
}


/** ==============  进阶写法:Media Queries Level 4 新语法  ================ */
/* 传统写法 */
@media (min-width: 400px) and (max-width: 700px) { ... }

/* Level 4 更清晰的写法 */
@media (400px <= width <= 700px) { ... }

HTML 标签中直接使用

html
<!-- 只有当屏幕宽度大于 900px 时,才会应用这个外部样式表 -->
<link rel="stylesheet" media="screen and (min-width: 900px)" href="widescreen.css">

移动/电脑端【是否支持触摸】元素样式兼容性处理

TIP

@media (any-hover: hover) 这是一个媒体查询,用来检测设备是否支持原生的悬停能力(如桌面端的鼠标)。

any-hover: hover:表示设备有支持悬停的输入方式(如鼠标)。

any-hover: none:表示设备没有支持悬停的输入方式(如手机触摸屏)。

input:hover { cursor: pointer; }

只有在满足上面的媒体查询条件时,这段样式才会生效。

当鼠标悬停在 <input> 元素上时,鼠标指针会变成手型(pointer),提示用户这是一个可交互的元素。

***** 例如:*****

scss
// 备有支持悬停的输入方式(不是触摸屏)
@media (any-hover: hover) { }
// 设备不支持悬停的输入方式(是触摸屏)
@media (any-hover: none){ }

检测css属性是否支持【降级处理方案】

scss
/** ============== 浏览器是否支持某个特定的 CSS 属性或属性值 ================ */

@supports (属性名: 属性值) {
  /* 只有当浏览器支持该属性值时,这里的 CSS 规则才会生效 */
}

/* 同时支持两个特性 【支持逻辑运算符(and / or / not)】*/
@supports (display: grid) and (gap: 10px) {
  /* 只有当浏览器支持该属性值时,这里的 CSS 规则才会生效 */
}

Copyright © 2026 Luke