百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

WEB:讲清楚CSS、Less、Sass、Scss

zhezhongyun 2024-12-01 19:22 45 浏览

CSS作为WEB前端开发技术知识点中重要的一项,在开发WEB应用中举足轻重。如下图所示,相关的辅助生成技术有Less、Sasss、Scss。本文分别介绍下。

CSS简介

CSS(Cascading Style Sheets,层叠样式表)是一种用于描述网页文档的样式和布局的样式表语言。它与 HTML 和 JavaScript 一起构成了现代网页的基础技术栈。CSS 的主要作用是控制网页的外观和格式,包括颜色、字体、间距、布局等。其主要特点如下:

1. 样式与内容分离:CSS 允许将样式与 HTML 内容分离,使得网页的结构和外观可以独立管理。这样可以提高代码的可维护性和可读性。如下面的css代码,可以用来定义html文件中h1和p标签的样式。

/* CSS */
h1 {
    color: blue; /* 属性: 值 */
    font-size: 24px;
}

p {
    margin: 10px; /* 设置段落的外边距 */
    line-height: 1.5; /* 设置行高 */
}

2. 层叠性:CSS 的“层叠”特性意味着多个样式可以应用于同一个元素,浏览器会根据优先级规则决定最终应用的样式。优先级规则包括选择器的特异性、样式的来源(内联、内部或外部样式表)以及样式的顺序。如下分别给出内联、内部、外部样式表的示例:

/*内联样式表:可以直接在html标签内通过style属性给出*/

<h1 style="color: blue;">Hello, World!</h1>

/*内部样式表:可以直接在html中head-style标签内给出*/

<head>

<style>

h1 {

color: blue;

}

</style>

</head>

/*外部样式表:可以直接在html中使用link标签引用*/

<head>

<link rel="stylesheet" href="styles.css">

</head>

3. 响应式设计:CSS 支持媒体查询,使得网页可以根据不同的设备和屏幕尺寸自动调整布局和样式,从而实现响应式设计。如下是一个常用的响应式布局:

/* 默认样式 */
body {
    font-size: 16px;
}

/* 针对屏幕宽度小于 600px 的设备 */
@media (max-width: 600px) {
    body {
        font-size: 14px; /* 在小屏幕上减小字体大小 */
    }
}

/* 针对屏幕宽度大于 600px 的设备 */
@media (min-width: 601px) and (max-width: 1200px) {
    body {
        font-size: 18px; /* 在中等屏幕上增大字体大小 */
    }
}

/* 针对屏幕宽度大于 1200px 的设备 */
@media (min-width: 1201px) {
    body {
        font-size: 20px; /* 在大屏幕上进一步增大字体大小 */
    }
}

4. 丰富的选择器:CSS 提供了多种选择器,可以根据元素的类型、类、ID、属性等选择特定的 HTML 元素进行样式设置。如下是一些示例:

/**通用选择器(*):选择所有元素。*/
   * {
       margin: 0;
       padding: 0;
   }

/**元素选择器:选择特定类型的元素,例如所有的`<p>`元素。*/
   p {
       color: blue;
   }

/**类选择器(.classname):选择具有特定类的元素。*/
   .highlight {
       background-color: yellow;
   }
/**ID选择器(#idname):选择具有特定ID的元素。**/
   #header {
       font-size: 24px;
   }

/**属性选择器:选择具有特定属性的元素。**/
   input[type="text"] {
       border: 1px solid #ccc;
   }
/**后代选择器(ancestor descendant):选择某个元素的所有后代元素。*/
     div p {
       color: red;
   }

/**子选择器(parent > child):选择某个元素的直接子元素。**/
   ul > li {
       list-style-type: none;
   }
/**相邻兄弟选择器(previous + next):选择紧接在某个元素后的兄弟元素。*/
   h1 + p {
       margin-top: 0;
   }
/**一般兄弟选择器(previous ~ siblings):选择某个元素之后的所有兄弟元素。*/
   h1 ~ p {
       color: green;
   }
/**伪类选择器:选择特定状态的元素,例如:hover。*/
    a:hover {
        text-decoration: underline;
    }
/**伪元素选择器:选择元素的特定部分,例如::before和::after。*/
    p::first-line {
        font-weight: bold;
    }

5. 动画与过渡:CSS 允许创建简单的动画和过渡效果,增强用户体验。如下面代码所示

/*CSS过渡(Transitions)的基本语法*/
.selector {
    transition: property duration timing-function delay;
}
/**
	property:要过渡的CSS属性(例如 `background-color`、`width` 等)。
	duration:过渡持续的时间(例如 `0.5s`)。
	timing-function:过渡的速度曲线(例如 `ease`、`linear`、`ease-in`、`ease-out` 等)。
	delay:过渡开始前的延迟时间(可选)。
*/
/*示例:
当鼠标悬停在 `.box` 上时,背景颜色将从蓝色变为红色,并且宽度将从100px变为200px,
整个过程持续0.5秒。
*/

.box {
    width: 100px;
    height: 100px;
    background-color: blue;
    transition: background-color 0.5s ease, width 0.5s ease;
}

.box:hover {
    background-color: red;
    width: 200px;
}
/*CSS动画(Animations)的基本语法:**/
@keyframes animation-name {
    from {
        /* 初始状态 */
    }
    to {
        /* 结束状态 */
    }
}

.selector {
    animation: animation-name duration timing-function delay iteration-count direction;
}
/*
	animation-name:定义的动画名称。
	duration:动画持续的时间(例如 `2s`)。
	timing-function:动画的速度曲线(例如 `ease`、`linear` 等)。
	delay:动画开始前的延迟时间(可选)。
	iteration-count:动画的循环次数(例如 `infinite` 表示无限循环)。
	direction:动画的方向(例如 `normal`、`reverse`、`alternate`)。
*/
/*示例:
`.box` 元素将沿着X轴平滑地移动100px,动画持续2秒,并且在每次完成后反向移动。
*/
@keyframes slide {
    from {
        transform: translateX(0);
    }
    to {
        transform: translateX(100px);
    }
}

.box {
    width: 100px;
    height: 100px;
    background-color: blue;
    animation: slide 2s ease-in-out infinite alternate;
}

Less

Less是一个工具用来生成浏览器可以识别的CSS。提供了变量、函数、嵌套等语法可以帮助更方便的编写样式表。


Less要求先按照其语法写一个.less文件,然后使用less编译器,将less文件编译为.css文件。然后再在页面中应用。下面是一个实例:

/*编辑less文件*/
@primary-color: #4CAF50;
@font-size: 14px;

.button {
    color: @primary-color;
    font-size: @font-size;
}
/*编译成css文件*/
lessc .\test\less\demo.less .\test\less\demo.css 
/*.css文件如下*/
.button {
  color: #4CAF50;
  font-size: 14px;
}

Saas

Sass也是一个用来生成css的工具,除了有less的功能之外,还提供了继承的能力。

Sass一样要求先写一个.sass的文件,然后使用sass编译成css。如下示例:

//  先编辑一个sass文件
/*使用变量*/
$primary-color: #4CAF50
$font-size: 14px

.button
  color: $primary-color
  font-size: $font-size
 
/* 嵌套规则*/
.nav
  ul
    list-style: none
  li
    display: inline-block

    a
      text-decoration: none
      color: $primary-color

/*混入*/
=rounded-corner($radius: 5px)
  border-radius: $radius

.box
  +rounded-corner
  border: 1px solid #ccc

/*继承*/
.button
  padding: 10px 20px
  background-color: $primary-color

.success-button
  @extend .button
  background-color: scale($primary-color, 10%)
  color: adjust($primary-color,30%)

// 然后使用sass编译
sass  .\test\sass\demo.sass .\test\sass\demo.css    
// 得到如下文件
@charset "UTF-8";
/*使用变量*/
.button, .success-button {
  color: #4CAF50;
  font-size: 14px;
}

/* 嵌套规则*/
.nav ul {
  list-style: none;
}
.nav li {
  display: inline-block;
}
.nav li a {
  text-decoration: none;
  color: #4CAF50;
}

/*混入*/
.box {
  border-radius: 5px;
  border: 1px solid #ccc;
}

/*继承*/
.button, .success-button {
  padding: 10px 20px;
  background-color: #4CAF50;
}

.success-button {
  background-color: scale(#4CAF50, 10%);
  color: adjust(#4CAF50, 30%);
}

/*# sourceMappingURL=demo.css.map */

Scss

Scss与Sass本质是一个工具,但是语法不同(作者建议使用scss),Scss兼容css语法。如下示例:

// var.scss
$primary-color: #4CAF50;
$font-size: 14px;

.button {
    color: $primary-color;
    font-size: $font-size;
}
// mixin.scss

// nest.scss
.nav {
    ul {
        list-style: none;
    }
    li {
        display: inline-block;

        a {
            text-decoration: none;
            color: $primary-color;
        }
    }
}
// extend.scss
.button {
    padding: 10px 20px;
    background-color: $primary-color;
}

.success-button {
    @extend .button;
    background-color: darken($primary-color, 10%);
}
// import.scss
@import "var";
@import "mixin";
@import "nest";
@import "extend";

.button {
    @include rounded-corner;
    background-color: $primary-color;
}
// 编译 import.scss
sass  .\test\scss\import.scss .\test\scss\import.css
// 得到import.css
.button, .success-button {
  color: #4CAF50;
  font-size: 14px;
}

.box {
  border-radius: 5px;
  border: 1px solid #ccc;
}

.nav ul {
  list-style: none;
}
.nav li {
  display: inline-block;
}
.nav li a {
  text-decoration: none;
  color: #4CAF50;
}

.button, .success-button {
  padding: 10px 20px;
  background-color: #4CAF50;
}

.success-button {
  background-color: rgb(60.5577689243, 139.4422310757, 63.7450199203);
}

.button, .success-button {
  border-radius: 5px;
  background-color: #4CAF50;
}

// function.scss

@use 'var';
// 定义一个函数
@function lighten-color($color, $amount) {
  @return scale($color, $amount);
}

// 定义主颜色

// 使用函数
.button {
  background-color: var.$primary-color;
  color: lighten-color(var.$primary-color, 20%); // 使用自定义函数
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;

  &:hover {
    background-color: lighten-color(var.$primary-color, 10%); // 在悬停时使用函数
  }
}

sass当前的主要版本是dart实现的1.80.3 compiled with dart2js 3.5.4,其他版本如node.sass已经停止更新。新版本有一些变更,import指令被废弃,对应引入了use和forward指令,用来更好的管理文件模块。forward用来将多个文件合并为一个模板,便于使用者统一使用一个模板引用其他的变量等。下面是use的实例:

// forward.scss
@forward 'var';
@forward 'nest';
@forward 'mixin';
@forward 'extend';
@forward 'function';

//use.scss
@use 'forward';


a{
  @extend .button;
  color: blue;
  background-color: forward.$primary-color;
  @include forward.rounded-corner;
}

div{
  background-color: forward.lighten-color(forward.$primary-color, 10%);
}


总结

除了Saas、Scss、Less之外还有其他辅助生成CSS的工具。大体看Sass、Scss热度最高。

这些辅助工具的工作模式基本都是这样的:

  1. 按照特定的语法编辑一个文件,例如.sass .scss .less
  2. 使用对应的编译器编译此文件,如sass 1.sass 1.css
  3. 将生成的css文件用到web页面上。 <link rel="stylesheet" href="styles.css">

scss更优秀,可考虑直接使用SCSS,其对模块的管理更加方便。而且能直接兼容css语法。

参考资料:

  1. CSS2 https://www.w3.org/TR/CSS22/
  2. CSS3 https://www.w3.org/TR/css-syntax-3/
  3. 教程 https://www.w3schools.com/css/default.asp
  4. Less https://lesscss.org/
  5. Sass/Scss https://sass-lang.com/guide
  6. 教程 https://www.w3schools.com/sass/default.asp

相关推荐

3 分钟!AI 从零开发五子棋全过程曝光,网友:这效率我服了

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8...

一行代码实现display&quot;过渡动画&quot;原理

作者:Peter谭老师转发链接:https://mp.weixin.qq.com/s/XhwPOv62gypzq5MhhP-5vg写本文的起因上篇文章,提到如何让display出现过渡动画,却没有仔...

脑洞:琼恩·雪诺、蝙蝠侠和魔形女的灵魂宠物了解一下

AlekseiVinogradovisaRussianfreelancedigitalartistwhoshareshisskillsandtalentwith120k...

浏览器的渲染机制、重绘、重排

1、什么是重排和重绘网页生成过程:HTML被HTML解析器解析成DOM树css则被css解析器解析成CSSOM树结合DOM树和CSSOM树,生成一棵渲染树(RenderTree)生成布局(flo...

托福写作高频考题写作思路&amp;词汇丨考虫独家

科技话题与媒体话题是托福写作的常考话题很多考生对这两类话题里的专有词汇表达也许很不了解所以今天就跟随考虫托福写作老师刘云龙老师一起来学习在这些话题的写作里你可以使用哪些有用的表达。希望大家有收获!记得...

在优麒麟上使用 Electron 开发桌面应用

使用Web标准来创建桌面GUI,上手快、成本低、跨平台、自适应分辨率,这些都是Electron的优势。作者/来源:优麒麟Electron是由Github开发,用HTML、CSS和...

php手把手教你做网站(三十八)jquery 转轮盘抽奖,开盲盒

抽奖和开盲盒性质一样的都是通过ajax读取后台的随机数据。1、转轮盘本来是想直接绘图实现轮盘,但是没有找到怎么填充文字,只好把轮盘弄成了背景图,通常用于游戏抽道具,商城积分抽奖,公司年末员工抽奖点击抽...

用 CSS 整活!3D 轮播图手把手教学,快乐代码敲出来

兄弟们,今天咱来搞点好玩的——用CSS整一个3D轮播图!咱野生程序员就是要在代码里找乐子,技术和快乐咱都得要!代码是写不完的,但咱能自己敲出快乐来,走起!一、先整个容器,搭个舞台咋先写一个...

实现一个超酷的 3D 立体卡片效 #前端开发

今天我们来实现一个超酷的3D立体卡片效果。正常情况下就是一个普通的图片展示卡片,鼠标悬停的时候图片会跳出卡片,并将影子投射到背景卡片上,在视觉上有一个3D立体感。html主要分成3个部分:容器→背景层...

Vue 3 Teleport与Suspense:解决UI难题的两个&quot;隐藏大招&quot;

模态框的"层级噩梦"与Teleport的救赎"这个模态框怎么又被父容器截断了?"团队协作开发后台系统时,小张第N次遇到这个问题。多层嵌套的组件结构里,弹窗被overfl...

让交互更加生动!有意思的鼠标跟随 3D 旋转动效

今天,群友问了这样一个问题,如下所示的鼠标跟随交互效果,如何实现:简单分析一下,这个交互效果主要有两个核心:借助了CSS3D的能力元素的旋转需要和鼠标的移动相结合本文,就将讲述如何使用纯CSS...

填坑:transform元素导致zindex失效终极方法

今天遇到了使用css3动画的元素层级被放大置顶的问题,ios浏览器上没问题,安卓原生浏览器和安卓微信上有问题。使用了css3动画的元素z-index失效,兄弟元素设置多高的z-index都盖不住解决办...

诡异的层级错乱:一个被transform隐藏的CSS陷阱

周五下午三点十七分,设计部突然发来紧急截图——原本应该悬浮在顶部的导航菜单,此刻正诡异地被下方的轮播图遮挡。我盯着屏幕上错乱的层级关系,手指下意识地敲下z-index:9999,心里清楚这不过是程序...

动画篇--碎片动画

本文授权转载,作者:Sindri的小巢(简书)前言从最开始动笔动画篇的博客,至今已经过去了四个多月。这段时间回头看了看自己之前的动画文章,发现用来讲解动画的例子确实不那么的赏心悦目。于是这段时间总是想...

Nature:大洋转换断层处的拉张构造与两阶段地壳增生

Nature:大洋转换断层处的拉张构造与两阶段地壳增生转换断层是三种基本的板块边界之一,全球总长度超过48000km(Bird,2003),它们的发现为板块构造理论的建立奠定了重要的基础(Wil...