关于scss:使用scss制作按钮变亮变暗效果

演示失常状态鼠标悬浮状态点击状态演示为第一个区域(红色按钮) front在咱们进行前端开发时,如果用纯CSS实现这种鼠标悬浮时变深,点击变浅很容易(:hover,:focus),然而数量一多,写起来就十分恶心,所以咱们能够用scss来实现这种成果。 scss-codes.all{ //通用属性 width: 60px; height: 60px; margin: 20px; display: inline-block; border-radius: 10px; outline: none; //禁止点击时呈现外边 border: none; //禁止边框}$list: rgb(255, 0, 0),rgb(255, 217, 0),rgb(0, 38, 255),rgb(0, 255, 255); //色彩数组,能够应用HEX,rgb,这里最好不要用rgba@for $i from 1 through 4{ //through后的数字是要创立div的个数 .ml-#{$i}{ //如ml-1,ml-2,ml-3 @extend .all; //继承.all font-size: 10px * $i; background-color: nth($list,$i); //设置默认背景色彩,此处会调用色彩数组中对应的色彩 color: white; transition: all 0.3s; //增加动画成果 $color: nth($list,$i); //将对应色彩创立变量$color,避免出现反复语句 &:hover{ //鼠标悬浮 background: darken($color,20%); //亮度减淡20% } &:active{ //鼠标点击 background: lighten($color,20%); //亮度晋升20% } }}css-codes编译后的后果: ...

June 22, 2023 · 1 min · jiezi

关于scss:scss基础语法的简单使用

1. 变量申明及应用$color: red;.box { color: $color;}2. mixin和include2.1 简略应用$bgColor: red;@mixin bg { background: $bgColor;}.box { @include bg;}编译后果: .box { background: red;}2.2 进阶应用$namespace: 'zz';@mixin B($name){ $aaa: $namespace + '_' + $name; .#{$aaa} { @content; }}@include B(input) { font-size: 12px;}编译后果: .zz_input { font-size: 12px;}3. 列表和循环3.1 for循环$list: red, green, blue;@for $i from 1 through 3 { .status-#{$i} { color: nth($list, $i) }}@for $i from 1 to 4 { .status-#{$i} { color: nth($list, $i) }}注:nth能够获取数组的某个元素;through和to的编译后果统一,要留神是的to走不到最初一个数: ...

March 30, 2023 · 1 min · jiezi

关于scss:CSS-Var-自定义属性中使用-Scss-变量

问题场景sass 版本: 1.52.1 当在 CSS 变量(CSS Variable)的自定义属性中应用 Sass/Scss 变量时 这种写法不会如期工作$primary: #409eff;:root { --fill-color-primary: $primary;}// 编译后 css,变量没有胜利利用 ↓:root { --fill-color-primary: $primary;}解决方案起因是 Sass 的语法扭转了 Breaking Change: CSS Variable Syntax...为了提供与一般CSS的最大兼容性,较新版本的Sass要求在插值中写入自定义属性值中的SassScript表达式...$primary: #409eff;:root { --fill-color-primary: #{$primary};}// 编译后 css:root { --fill-color-primary: #409eff;}扩大浏览sass 插值相似于 ES6 中的模板字符串插值 ${};

June 28, 2022 · 1 min · jiezi

关于scss:scss-文件里的特殊符号-和-include-的用法

Jerry 之前的文章[.scss 文件里的特殊符号 - % 百分号和 $美元符号](),介绍了 scss 文件里两个特殊符号,百分号 % 和美元符号 $ 的用法。 本文介绍另一个特殊符号 @ 的用法。 应用预处理器的长处之一是它们可能解决简单、简短的代码并对其进行简化。 这就是 mixins 派上用场的中央! @mixin border-radius($radius) { -webkit-border-radius: $radius; -moz-border-radius: $radius; -ms-border-radius: $radius; border-radius: $radius;}.box { @include border-radius(10px); }同占位符 % 一样,@mixin 定义的 border-radius 自身也不会呈现在最终的 css 文件中。这是一种非侵入式的定义形式。 box class 应用 @include, 将 border-radius 的内容齐全蕴含进来,有点像编程语言里的宏替换,并且还反对参数替换。 最终生成的 css 内容: .box { -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px;}Spartacus 中的一个例子: %cx-product-facet-navigation { min-width: 0; // hides the filter button in desktop experience @include media-breakpoint-up(lg) { button.dialog-trigger { display: none; } }}这里 media-breakpoint-up 是一个 mixin 的名称,lg 为传入的参数。 ...

January 9, 2022 · 1 min · jiezi

关于scss:postcss后处理器配置autoprefix

postcss后处理器配置autoprefix前言scss为css的预处理器拉,其实就是让css能够应用变量而已,那么postcss就是后处理器拉本文讲的就是他的autoprefix插件能够主动增加浏览器css前缀 装置cnpm i -D sass node-sass postcss-cli autoprefixcnpm i -D postcss postcss-cli autoprefix package.json "scripts": { "build": "node-sass style.scss style.css --output-style expanded && postcss style.css -o style.css" },browserslist "browserslist": [ "last 5 Firefox versions", "Safari >= 6", "ie >= 8", "Edge 16", "> 1%", "last 1 Android versions", "last 1 ChromeAndroid versions", "last 2 Chrome versions", "last 2 Firefox versions", "last 2 iOS versions", "last 2 Edge versions", "last 2 Opera versions" ],postcss.config.jsmodule.exports = { plugins: [ require('autoprefixer') ]}style.scssa{ transition :transform 1s}body { user-select: none}style.cssa { -webkit-transition: -webkit-transform 1s; transition: -webkit-transform 1s; transition: transform 1s; transition: transform 1s, -webkit-transform 1s;}body { -webkit-user-select: none; -ms-user-select: none; user-select: none;}

December 22, 2021 · 1 min · jiezi

关于scss:SCSS-文件里的感叹号用法-给变量设置默认值

如下图所示: $useTabsOnPDP: false !default; https://stackoverflow.com/que... 含意如下: !default 在 Bootstrap Sass 中常常应用。 它相似于反向 !important。 所有 Bootstrap 变量都应用 !default 设置,以容许开发人员进一步自定义疏导程序。 应用 !default sass 只会定义一个尚未设置的变量。 //Example1 Dress color = red$auroras-dress-color: blue;$auroras-dress-color: red;//Example2 Dress color = red$auroras-dress-color: blue !default;$auroras-dress-color: red;//Example3 Dress color = blue$auroras-dress-color: blue;$auroras-dress-color: red !default;那么为什么这很重要? Bootstrap 是一个包。 大多数人不会编辑 Bootstrap 源代码。 永远不要更新疏导程序源。 要自定义疏导程序,您将增加本人的变量文件并应用疏导程序代码编译它,但永远不要接触本机疏导程序包。 Bootstrap sass 的页面在文档中具体介绍了如何自定义和编译它。 据我所知,Twitter Bootstrap 应用 LESS。 另一方面,!default 实际上是 Sass 的一部分,用于提供 Sass 变量 ($var) 默认值,这会使它在给定的上下文中有效,即便在 Sass 中也是如此。 此外,我在 LESS 文档中找不到任何对 !default 的援用,据我所知,它是 Sass 独有的。 你确定你在 Bootstrap 的源代码中找到了这个,而不是在其余中央? 因为诚实说我不记得在 Bootstrap 的样式表中看到过 Sass/SCSS 代码。 ...

October 2, 2021 · 1 min · jiezi

关于scss:SassSCSS-官方英文文档翻译整理SCSS-完整自学中文版教程01Sass基本介绍

Sass 根本介绍[toc] 如果对本文有任何问题,倡议,或者在前端技术体系方面有任何问题,能够增加我的微信: drylint , 我会尽可能为你解答,也会拉你进入前端技术进阶交换群,大家一起提高~Sass 是 CSS 的超集,反对所有 css 语法,并在其根底上扩大。 Sass 反对像 css 一样的大括号语法,文件扩大名为 .scss ,以及另一种应用缩进的语法,文件扩大名为 .sass 。 教程次要采取齐全兼容 css 的 SCSS 语法。 正文(Comments)反对两种正文,别离是: 单行正文 // 正文文字多行正文 /* 正文文字 */单行正文(Single-line comments)编译的时候会间接被疏忽,不会编译到 CSS 中,所以也叫做“隐式正文”(silent comments)。 // 正文内容多行正文(Multi-line comments)编译时会将正文编译到 css 中,所以也叫做“显式正文”(loud comment) // 这一行正文不会呈现在编译的 css 中/* 这一行会呈现在编译的 css 中,除非是在压缩模式下则不会 *//* 正文中还能够蕴含插值: * 1 + 1 = #{1 + 1} *//*! 这行正文即便在压缩模式下也会编译到 css 中 */p /* 多行正文能够写在任何 * 容许空白呈现的中央 */ .sans { font-size: 16px;}编译后的 css: ...

September 17, 2021 · 7 min · jiezi

关于scss:Vuecli中使用scss-的全局变量和-mixin

装置 scssnpm install sass-loader@10.1.1 --save-devnpm install node-sass --sava-dev留神:sass-loader须要指定@10的版本,因为后续的版本在vue-cli脚手架中会呈现一些问题根底应用<style lang="scss" scoped> .xxxx { .xxx-x { ... } }</style>大部分场景下,应用scss能够实现下面的款式嵌套层级关系,置信大家都用过。上面要说下scss的进阶用法。scss 全局变量和mixin。 环境配置想要在vue-cli中全局应用 scss的全局变量和 @mixin款式混入,须要装置插件,而后在 vue.conf.js 中配置npm install style-resources-loader vue-cli-plugin-style-resources-loader --save-devvue.config.js  中配置 module.exports = { pluginOptions: { 'style-resources-loader': { preProcessor: 'scss', patterns: [ // 门路依据具体需要更改 path.resolve(__dirname, 'src/assets/styles/variables.scss'), path.resolve(__dirname, 'src/assets/styles/mixin.scss') ] } }}scss全局变量的应用上述环境配置中配置的 variables.scss 就是全局的变量文件variables.scss  $--color-primary: #468fff;$--color-primary-active: #69a5ff;xxx.vue 文件中间接应用该变量 <style lang="scss" scoped>.main-wrap { background: $--color-primary;}</style>@mixin与@include实现css编程式格调mixin.scss @mixin 函数名($参数名: 默认值) @mixin flex($justify-content: center, $align-center: center, $flex-direction: row){ display: flex; justify-content: $justify-content; align-items: $align-center; flex-direction: $flex-direction;}xxx.vue 中应用应用 @include 进行援用即可 ...

May 2, 2021 · 1 min · jiezi

关于scss:关于-a-标签-hover-状态样式不生效的问题

明天在做页面的时候,须要做一个默认 a 标签文字的色彩,而后当 hover 的时候,a 标签文字的色彩进行一个变动。 举例来说, 默认的款式写的时候,用的是 a:link { color: blue }; 当 hover 的时候,写的款式是 a:hover { color: red }; 起初发现,hover 的时候款式没有失效。 之后去搜网页查找了没有失效的起因,大部分的都是形容的是因为 a 标签的 4 种状态写的程序不对引起的,即 LOVE HATE 准则: a:link a:visited a:hover a:active; 起初校对了一下,我写的程序也是正确的,即:a:link , a:hover 前面把浏览器的 F12 模式的设施调试去掉了,即勾销勾选设施图标: 而后发现 a:hover 款式就失效了。 起初明确为什么 a:hover 的款式不失效了。因为我间接始终在应用浏览器的设施调试模式,应用的是 iPhone 调试模式: 导致 a:hover 没有失效。起初勾销设施调试模式后,当鼠标挪动到 a 标签下面的时候,就能够失常款式变动了。 所以,最初的总结是:应用 a:hover 的时候,或者其余元素应用 hover 的时候,肯定要留神是不是在模仿挪动设施的场景,如果是,那 hover 就不会失效;如果想看 hover 失效的款式,务必勾销挪动设施调试的模式。

April 2, 2021 · 1 min · jiezi

第十三集-从零开始实现一套pc端vue的ui组件库-评分组件-小星星

第十三集: 从零开始实现一套pc端vue的ui组件库( 评分组件 小星星 )1. 本集定位     说起评分的话, 最早看到这种形式是电影网站, 每部电影得到几颗星这种方式, 后来就出现了用户来手动选星星打分的玩法, 这些方式更直观, 更吸引用户参与进去, 这个组件其实还有很多玩法, 比加载动画, 我可以把星星不断的点亮作为一个加载进度的映射, 这个组件很多ui库都把他做的很固定, 比如说自能是5颗星星或者笑脸, 而本次编写这个组件我的原则就是, 星星的数量可以任意的多, 当然也可以任意的少, 最少1颗, 最多无限颗, 是不是很有趣????.     实现思路因为我这边icon组件用的是svg实现的, 最后选择了使用两排一样的icon组件, 重叠在一起, 然后把最上层的宽度变化一下, 就达到了选择区域有颜色的效果了. 2. 需求评审只读模式: 可只做展示.选择模式: 可通过点击设置新的评分.颜色与大小, 要可供用户自己设定.特色: 可设置'星星'的总数量.可设置满分为多少分可更换图形, 绝对不止是'星星'.要兼容多层父级组件的情况以及多层父级并且父级组件滚动偏移的情况可以每次以半颗星为单位进行选取.3. 基础的搭建先上一张正常状态下的效果图vue-cc-ui/src/components/Rate/index.js import Rate from './main/rate.vue'Rate.install = function(Vue) { Vue.component(Rate.name, Rate);};export default Ratevue-cc-ui/src/components/Rate/main/rate.vue <template> <div class='cc-rate' :style="{ cursor: disabled ? 'auto' : 'pointer', // 不让修改的状态也就没必要出现小手了 }"> <i class='cc-rate__box'> <span class='cc-rate__dark'> <cc-icon v-for='item in num' :key='item' :size="`${size}px`" :name='iconType.name' /> </span> <span class='cc-rate__bright' :style="{ width }"> <cc-icon v-for='item in num' :key='item' :size="`${size}px`" :name='iconType.name' /> </span> </i> </div></template>上述的num指的就是 用户定义的星星的数量total就是当星星满分的时候, 相当于多少分 ...

August 18, 2019 · 4 min · jiezi

第十集-从零开始实现一套pc端vue的ui组件库-计数器组件

第十集: 从零开始实现( 计数器组件 ) 本集定位: 听到计数器这个名字很多人是不是一瞬间没有什么印象, 毕竟这个组件用的比较少,就是那种左边一个'-'右边一个'+', 控制某些数量的时候才会用到, 比如我之前做的商城小程序只有'下单'页面的规格弹出框里面才有他的身影, 如果是涉及到处理商品数量很频繁的业务场景应该会很常见吧, 但是不要看这个组件小, 编写它的时候坑还不少, 本次我们就来做一个计数器, 目标就是尽可能小, 尽可能的省性能. 1:需求分析每次+1 -1是常态, 但是如果搞活动, 每次最少为+-2个或三个, 就要兼容一下了,( 举一个实际遇到的坑, 我们之前把用户限制为每次活动, 每个用户只能买2个, 但是没有做好防备, 导致用户可能这次只买一个, 而下次他再次购买的时候会提示每次只能买两个, 但显示他只点击了买一个, 因为他已经买过一个, 为了兼容这个问题, 搞得还要加莫名其妙的补救代码 )中间的显示区应该可输入的, 用户想买1000个不可能让他+1+1+1..., 某些组件采用的是, 平时其为div, 点击之后变为input, 个人感觉完全没必要, 一个元素就够了, 何必搞两个元素, input状态下把他的默认样式去掉就好了.左右两边要有限制, 很多时候会有限购一说, 比如我做的商城, 库存只有10个 或者单个用户最多购买3个, 最少买两个等等限制.小数位数的显示一说... 这个其实我还真遇到过, 有一种需求叫做, 只要涉及数字就必须精确到后两位, 这种需求会导致后台同学对数据库做一定的限制, 从而我们传给后台的数据也就存在限制了.2: 基本结构:先展示一章普通状态的图, 让我们更直观的去完成它, 造型比较别致, 是本套组件的一个特点, 哈哈做的与别人一样会导致思想的禁锢, 自己写代码多尝试新的东西, 但是工作中一定要中规中矩, 以公司条款为准则. vue-cc-ui/src/components/InputNumber/index.js import inputNumber from './main/input-number.vue'inputNumber.install = function(Vue) { Vue.component(inputNumber.name, inputNumber);};export default inputNumbervue-cc-ui/src/components/InputNumber/main/input-number.vue ...

August 8, 2019 · 3 min · jiezi

CSSSassScss

1、描述CSS 指层叠样式表 (Cascading Style Sheets)Sass (Syntactically Awesome StyleSheets), Sass 是一款强化 CSS 的辅助工具,是对 CSS 的扩展,它在 CSS 语法的基础上增加了变量 (variables)、嵌套 (nested rules)、混合 (mixins)、继承(extend)、导入 (inline imports) 等高级功能,这些拓展令 CSS 更加强大与优雅。使用 Sass 以及 Sass 的样式库(如 Compass)有助于更好地组织管理样式文件,以及更高效地开发项目。SCSS (Sassy CSS),SCSS 是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强大功能。也就是说,任何标准的 CSS3 样式表都是具有相同语义的有效的 SCSS 文件。SCSS 需要使用分号和花括号而不是换行和缩进。SCSS 对空白符号不敏感,其实就和css3语法一样。2、css主要知识点: 1、CSS的书写方式 行内式:将CSS代码书写在HTML标签的style属性中。style是一个通用属性,每一个标签里面都拥有这个属性,规则: <标签名 style=”属性:值;属性:值;”></标签名> 嵌入式:将CSS代码嵌入到HTML文件中,嵌入式是通过HTML中的<style>标签将CSS代码嵌入到HTML网页中,规则: <style type=”text/css”> /*书写CSS代码*/ 选择器{属性:值;属性:值;} </style> 外链式:写以.css扩展名的文件,然后在<head></head>标签中使用<link />标签,将css文件链接到html文件中,规则: <标签名 style=”属性:值;属性:值;”></标签名>2、选择器 元素选择器、id选择器、类选择器、 属性选择器(如为带有 title 属性的所有元素设置样式 [title] {somestyles} )、 属性和值选择器(如为带有 title="W3School" 的所有元素设置样式 [title=W3School] {somestyles} )、 派生选择器(通过依据元素在其位置的上下文关系来定义样式),有三种 后代选择器: 空格隔开; 子元素选择器: >隔开,只能选择作为某元素子元素的元素; 相邻兄弟选择器:选择紧接在一元素后的元素,且二者有相同父元素, 如设置紧接 h1 后出现的 p 的字体颜色:h1 + p {color: red;}; 注1:.a,.b该逗号表示存在其中一个类的元素就设置,多元选择; 注1:.a.b没有空格表示同时拥有两个类的元素。 3、盒子模型 所有HTML元素可以看作盒子,CSS盒模型本质上是一个盒子,封装周围的HTML元素, 它包括:margin(外边距)、border(边框)、padding(内边距)、content(内容) 盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。4、定位 Position属性:规定元素的定位类型。即元素脱离文档流的布局,在页面的任意位置显示 absolute: 绝对定位;脱离文档流的布局,遗留下来的空间由后面的元素填充。 定位的起始位置为最近的父元素(postion不为static),否则为Body文档本身。 relative :相对定位;不脱离文档流的布局,只改变自身的位置,在文档流原先的位置遗留空白区域。 定位的起始位置为此元素原先在文档流的位置。 fixed :固定定位;类似于absolute,但不随着滚动条的移动而改变位置。 static :默认值;默认布局. 辅助属性:position属性只是使元素脱离文档流,要想此元素能按照希望的位置显示, 需要使用下面的属性(position:static不支持这些): ①left : 表示向元素的左边插入多少像素,使元素向右移动多少像素。 ②right :表示向元素的右边插入多少像素,使元素向左移动多少像素。 ③top :表示向元素的上方插入多少像素,使元素向下移动多少像素。 ④bottom :表示向元素的下方插入多少像素,使元素向上移动多少像素。 注:上面属性的值可以为负,单位:px 。 5、布局(省略)3、sass4、scss

June 25, 2019 · 1 min · jiezi

翻译逐步替换Sass

本文来自心谭博客·「译文」逐步替换Sass,最新文章请见导航页,欢迎交流✿✿ヽ(°▽°)ノ✿翻译说明这是一篇介绍现代 css 核心特性的文章,并且借助 sass 进行横向对比,充分体现了 css 作为一门设计语言的快速发展以及新特性为我们开发者带来的强大生产力。 第一次尝试翻译技术文,为了让文章更通俗易懂,很多地方结合了文章本意和自己的说话风格。另外,时间有限水平有限,难免有些失误或者翻译不恰当的地方,欢迎指出讨论。 英文原文地址:https://cathydutton.co.uk/posts/why-i-stopped-using-sass/ 正文开始我每年都要重新搭建和设计我的网站,这是一个非常不错的方式去跟进 HTML/CSS 的最新进展、开发模式和网站生成器。在上个月,我发布了新版本:从 Jekyll 和 GithubPages 迁移到 Eleventy 和 Netlify。 一开始,我并没有移除代码中所有的 sass 代码。这本不是我计划中的事情,但随着我不断查看 sass 代码,我一直在思考:它们是否给网站带来了价值,还是仅仅增加了复杂度和依赖性(特指对:scss)?随着这年 css 的发展,曾经让我使用 sass 的原因似乎不那么重要了。 其中一个例子就是我已经移除了媒体查询。当我了解到 CSS 的一些新的特性,那些针对特定屏幕大小的代码(媒体查询)没有必要,因此被移除了。 Sass 解决了什么问题?大概 5、6 年前,我第一次了解到 sass 的时候,我是有些换衣的。随着我搭建越来越多的响应式 web 应用,我才意识到借助 sass 的  functions  和  mixins  可以大大提高代码复用。显而易见的是,随着设备、视图窗口和主题等场景的变化,使用(sass 的)变量让代码迁移的成本更低。 下面是我用 sass 做的事情: 布局变量Typography1) 布局布局一直是 css 中让人困惑的地方。而响应式布局正是我最初决定使用 Sass 去创建 css 布局的重要原因。 使用 sass我一直记得我第一次尝试用 css 创建一个响应式网格布局的时候,那要为每列创建一个对应的类名,然后再用语义化不强的类名(比如  col-span-1  和  col-span-4 )来标记它。 .col-span-3 { float: left; width: 24%; margin-left: 1%;}.col-span-4 { float: left; width: 32.3%; margin-left: 1%;}.col-span-5 { float: left; width: 40.6%; margin-left: 1%;}借助 sass 的  mixin  和变量,能够不再编写像上面那样的类名。并且能够通过改变  $gridColumns  变量,来创造更灵活的布局。 ...

June 19, 2019 · 2 min · jiezi

vuecli生成项目mainjs引入scss时报错

近日,在vue的main.js项目中引入scss文件发现报错 ERROR Failed to compile with 1 errors 17:14:15This relative module was not found: ./assets/style/mixin.scss in ./src/main.js主要原因是新版本的vue-cli已经帮我们把sass-loader配置好了,放在了util.js里面。原来我们需要在webpack.base.config.js中去配置以下这段代码: { test:/\.scss$/, loaders:['style','css','sass'] }现在不需要这样配置。如果这样配置会报错,因为配置重复了。 所以,只需要安装相应的loader,比如使用sass需要安装node-sass、sass-loader。

June 11, 2019 · 1 min · jiezi

vue2-配置scss

1、安装文件 npm install --save-dev sass-loadernpm install --save-dev node-sass2、配置 webpack.base.conf.js找到webpack.base.conf.js文件的module模块下面的rules添加以下代码 ...{ test: /\.scss$/, loaders: ["style", "css", "sass"]},...注意:这里loaders和文件中其他配置不同加了s 3、使用1、在使用的地方如下写法 <style lang="scss" scoped> div { a { color: red } }</style>2、@import外部导入,如果不加scoped如果在app.vue中导入那么就是全局scss <style lang="scss" scoped> @import './assets/scss/global.scss'; * { color: red }</style>这样写下面的覆盖外部引入的 注意遇到的坑 报错/node-sass/vendor no such file or directory in node-sass......解决方法,运行 rebuild解决了 npm/cnpm rebuild node-sass --save-dev更详细的解决方案参考:https://www.jianshu.com/p/8bf...

June 6, 2019 · 1 min · jiezi

SCSS-日常用法

SCSS 日常用法本文是以自己的理解起的结构,要看详细的帮助文档,参阅这里:https://sass-lang.com/documen...你需要了解的less 和 sass 是两种 css 预编译语言,其目的是为了更快、更结构的编写 css 文件,是一种强大的 css 编译语言,都能使用 变量、运算符、判断、方法等等。 scss 与 sass 的区别(这里先不讲 less ): 先有的 sass 后有的 scssscss 需要大括号{}和分号;sass 什么都不用直接裸奔感觉 sass 不如 scss 严谨,裸奔太狂野了,所以我们选用 scss, 看个小例子写一个 .btn 类并支持 :hover :active 样式 css .btn {/* btn 初始样式 */}.btn:hover{/* :hover 样式 */}.btn:active{/* :active 样式 */}scss .btn{// btn 初始样式 &:hover{ // hover 样式 } &:active{ // active 样式 }}在scss, sass, less 中 & 都代指父类上面这个例子中的 & 代指 .btn可以看出 scss 的结构要比 css 清晰,并且写的也要更少。下面的 scss 在使用中就会生成上面的 css。而这还只是皮毛,保证你用过 scss 之后就不会再用 css 写样式了。 ...

May 1, 2019 · 3 min · jiezi

自从用了Sass,我比以前更快了

前言说到css,相信大家都知道,css样式是用来修饰网页页面结构的。对于一名前端来说写好css并不难,但如何写出优雅可复用、易重构的css代码并不容易。 于是css预处理器便出现在大家的视线里,分别是 stylus、less、sass。它们的出现让编写css更加像JavaScript一样具有严谨性、编程性。 由于我工作中常用Scss(Sass3.0版本后更偏向css的原生语法),那就大展身手介绍一下Sass的用法,让更多小伙伴变得跟我一样快(just a kiding ????)。 在此对Stylus、Less就不做多叙述了,如果小伙伴对其他两种感兴趣,可以访问 Stylus官网 、Less官网了解更多哦。Sass背景Sass(Syntactically Awesome Style Sheets),套用sass官网的牛逼介绍:“Sass是世界上最成熟、最稳定、最强大的专业级CSS扩展语言!”。是一个相对新的css预编译框架,为前端开发而生。为什么使用Sass?通过Sass编写css代码,你可以减少冗余的css代码,编写更加语义化的css,它扩展了css的能力,增加变量、嵌套css规则、混合器、继承、函数等新特性。 Write less,Do more。何乐而不为呢?????.sass vs .scss ?早已Sass出现的时候,是没有Scss的,Sass语法跟原生css不尽相同。使用缩进代替括号,没有分号。有些开发者并不适应这种写法,于是在Sass发布的3.0版本后官方提出修改,将文件后缀名以.sass改成了.scss,语法也更贴切原生css,让开发者可以像原来写css一样愉快的写scss。scss对应css就像typescript是JavaScript的超集一样的关系。Sass安装关于Sass安装网上有很多详细教程,推荐几篇典型的安装教程文章。 Sass官网安装教程 慕课网Sass安装Sass在node.js编译环境的安装在 nodejs 的平台下面,我们需要安装node-sass模块,通过这个模块,我们可以将 scss 文件转换成 css 文件$ cnpm install node-sass –save安装完成以后,我们新建一个文件,名为index.scss文件使用 node-sass 的语法来编译index.scss,具体语法如下node-sass –watch src/index.scss dist/index.css如果我们需要监控一个文件夹下面所有的文件,则需要使用如下的语法格式node-sass -w -r <源文件夹> -o <目标文件夹> //它只会跟踪同名文件,没有则新建-w, –watch Watch a directory or file //监听-r, –recursive Recursively watch directories or files //递归地查看目录或文件-o, –output Output directory //输出目录为了能够方法的执行我们的node-sass语法,我们一般会把编译命令写在 package.json的配置文件下面,如下:{ “name”: “sass-demo”, “version”: “1.0.0”, “description”: “sass练习”, “main”: “index.js”, “scripts”: { “test”: “echo "Error: no test specified" && exit 1”, “sass”: “node-sass –watch ./src/index.scss ./src/index.css” }, “keywords”: [], “author”: “luckydong”, “license”: “ISC”, “dependencies”: { “node-sass”: “^4.9.0” }}1、 Sass变量1.1 变量声明与引用sass变量声明和css属性声明很像:$theme-color: #fff;这意味着变量$theme-color现在的值是#fff。$theme-color: #fff;div { $height: 100px; height: $height; color: $theme-color;}//编译后div { height: 100px; color: #fff;}在这段代码中,$theme-color这个变量定义在规则块外边,所以在这个样式表中都可以像 div规则块那样引用它。1.2 默认变量$defaultWidth: 100px; //全局变量$defaultWidth: 200px !default;.div1 { $height: 50px; //定义变量 局部变量 width: $defaultWidth; height: $height; //引用变量}.div2 { width: $defaultWidth;}注意:在Scss语法里面,变量分为全局变量与局部变量,变量加上!default 以后就是默认变量2、 嵌套 CSS 规则css中重复写选择器是非常繁琐无趣的事。如果要写一大串指向页面中同一块样式时,往往需要多次写同一个id或是同一个class类名:#content article h1 { color: #333;}#content article p { margin-bottom: 1.4em;}#content aside { background-color: #eee;}上面的css代码使用scss语法编写后就会变得简单明了、结构清晰,如下所示#content { article { h1 { color: #333; } p { margin-bottom: 1.4em; } } aside { background-color: #eee; }}2.1 父选择器的标识符&在 scss 中,有时候我们需要在子级当中使用父级选择器,此时我们就需要使用&来选取父级选择器.div1 { width: 100px; height: 100px;}.div1 img { width: 100%; height: auto;}.div1:hover { border: 1px solid black;}上面的 css 代码经过 scss 换写后,可以简写为如下.div1 { width: 100px; height: 100px; img { width: 100%; height: auto; } &:hover { border: 1px solid black; }}2.2 子级选择器中的> ~与+’>‘代表是的子级选择器空格代码的是后代选择器’+‘代表的是相邻兄弟选择器‘~’代表兄弟选择器以上的四种用法与 CSS 的选择器保持一致3、 混合器有时候我们在写样式的时候会发现,有些地方有样式,其中有一些是相同的,这个时候,我们会把这些样式提取出来,然后再单独导入进去。例如:假设我们需要写一个 button,这个 button 的大小与边框都一样,唯独在颜色上一样的时候,我们可以使用混合器做如下处理@mixin btn { width: 120px; height: 35px; border: 1px solid lightgray; border-radius: 15px;}.btn-success { @include btn; background-color: green;}说明:在上面的代码当中,不难发现,我们使用了@mixin 来定义一个混合器。在下面的样式当中,我们使用了@include导入混合器,这样 .btn-success 的样式就结合了之前定义的样式了。3.1 混合器的中参数SCSS中的混合器有点类似于js中的方法,定义一个混合器就相当于定义了一个方法,而我们定义方法的时候可以定义参数,在调用方法的时候,我们则可以使用这个参数。同理,在 SCSS 当中,定义混合器也可以使用参数,代码如下所示:@mixin flex-box($direction) { display: flex; flex-direction: $direction;}.item1 { @include flex-box(row); justify-content: center; align-items: center;}上面的代码经过 node-sass 编译后,如下:.item1 { display: flex; flex-direction: row; justify-content: center; align-items: center;}3.2 混合器参数的默认值为了在@include混合器时不必传入所有的参数,给参数指定一个默认值,上面的scss 中,如果希望flex布局中默认的主轴是 column,可以定义如下:@mixin flex-box($direction: column) { display: flex; flex-direction: $direction;}.item1 { @include flex-box; justify-content: center; align-items: center;}在上面的 SCSS 当中,我们在调用的时候没有传递参数给混合器,而是使用了它的默认值4、 选择器继承使用sass的时候,最后一个减少重复的主要特性就是选择器继承。选择器继承指的是一个选择器可以继承另一个选择器定义的所有样式。这个通过@extend语法实现,如下代码://通过选择器继承继承样式.error { border: 1px solid red; background-color: #fdd;}.loading-error { @extend .error; border-width: 3px;}上面的@extend就相当于继承,后面的.error 则是继承的选择器,上面的 scss 经过编译后所呈现的代码如下所示:.error,.loading-error { border: 1px solid red; background-color: #fdd;}.loading-error { border-width: 3px;}说明:我们可以看到,继承的选择器,它在这里使用了分组选择器来完了这个功能,这样我们的.loading-error 的样式则单独的区分开。关于@extend有两个要点你应该知道。跟混合器相比,继承生成的css代码相对更少。因为继承仅仅是重复选择器,而不会重复属性,所以使用继承往往比混合器生成的css体积更小。如果你非常关心你站点的速度,请牢记这一点。 继承遵从css层叠的规则。当两个不同的css规则应用到同一个html元素上时,并且这两个不同的css规则对同一属性的修饰存在不同的值,css层叠规则会决定应用哪个样式。 相当直观:通常权重更高的选择器胜出,如果权重相同,定义在后边的规则胜出。写在最后变量嵌套 CSS 规则混合器继承以上的四种是 Sass 的核心内容,也是最基础内容,通过了解学习后,我们可以快速的编写页面样式,提高开发效率,做到 CSS 代码重复率低,可复用性高。 下一篇我会带来关于Sass的高级用法,敬请期待!???? ...

April 15, 2019 · 2 min · jiezi

SCSS 环境配置

sass 和 scss 是什么scss的历史2007年 发行2016年 完全成熟sass是什么sass就是把所有分号冒号都去掉的css(哈哈哈)【一本正经】sass的官方解释器是开源的并且用Ruby语言写成的 但是也有用PHP、C语言、Java等实现的版本(C语言版本叫做llibSass,Java语言版本叫做JSass)SassScript提供以下功能:变量、嵌套、混入(Mixin)、选择器继承等。//就像这样… (缩进 格式必须这样写)body color red div color blue 然后呢……大家觉得不好使(最主要是前端工程狮看不懂) 就特别不开心 所以就又把分号冒号都加上了……再然后 scss就出生了scss是什么在sass的基础上把分号冒号都加回来其实就是css加强版…body{ color:red;}p{ color blue}环境配置安装node必须安装node(自己百度吧)node安装完成后 会自带一个 npm yarn 装不装都行 npm如果处理问题就装个yarn查看安装是否成功的方式:1、git bash里看2、cmd 的快捷键:键盘上的小旗键 加 R//这两个命令都一样:/* node -v 输入后安回车显示版本npm -v 输入后安回车显示版本yarn -v 输入后安回车显示版本配置淘宝的源需要配置淘宝的源 http://npm.taobao.org/ 千万不要装 cnpm如果连接有问题 就百度npm淘宝 第一篇文章就可以看到不会的可以点下面这个链接https://segmentfault.com/a/11…安装 http-server有了淘宝源才能安装安装它用来查看当前的html/* 命令行输入: */npm install -g http-server圈出的这两个用谁都行获取预览链接圈出的为预览链接 放入浏览器就能浏览啦它要一直运行 千万不要断 需要写别的命令 就另开一个窗口ctrl + c 中断运行工具安装另开一个命令窗口输入以下代码//第一步npm init -y//第二步npm i -D parcel//parcel 是代替 webpack 不需要任何配置就能使用 webpack 的工具

April 9, 2019 · 1 min · jiezi

Javascript如何与Sass,Less,Css之间共享变量?

原博文地址,此博文首次发于csdn,原创前段时间遇到网站换肤的需求,本想挺简单的,直接用 Sass 或者 Less 设置变量就好了,结果导致的问题就是 js 中设置的样式得单独设置,好麻烦。本文章代码gitHub地址 https://github.com/l-x-f/variables-css-less-sass-js 这个时候如果能让样式文件和 js 文件实现变量共享,那这个问题就解决了。查了好多资料,最终的解决方案如下:1.原理介绍:通过 webpack 和 css module,我们可以在 js 中使用样式 Sass,Less,Css 文件中定义的变量。2.环境: node: v8.10.0 vue-cli:3.5.3 3.package.json ( scss和less及其loader等先安装,vue-cli:3.5.3 下webpack已配置){ “name”: “Javascript 如何 Sass,Less,Css 之间共享变量”, “version”: “0.1.0”, “private”: true, “scripts”: { “serve”: “vue-cli-service serve”, “build”: “vue-cli-service build”, “lint”: “vue-cli-service lint” }, “dependencies”: { “core-js”: “^2.6.5”, “vue”: “^2.6.6”, “vue-router”: “^3.0.1”, “vuex”: “^3.0.1” }, “devDependencies”: { “@vue/cli-plugin-babel”: “^3.5.0”, “@vue/cli-plugin-eslint”: “^3.5.0”, “@vue/cli-service”: “^3.5.0”, “babel-eslint”: “^10.0.1”, “eslint”: “^5.8.0”, “eslint-plugin-vue”: “^5.0.0”, “less”: “^3.9.0”, “less-loader”: “^4.1.0”, “node-sass”: “^4.9.0”, “sass-loader”: “^7.1.0”, “vue-template-compiler”: “^2.5.21” }}4.文件目录5.variables文件夹下代码(核心代码)css.css文件/* @value 定义变量,然后使用。@value bgcColor: red; 会导出@ 后面的变量,在:export {} 可以取到该变量,也可以导出他们在功能上等同于 ES6 的关键字export,即导出一个 js 对象。/@value bgcColor: red;@value fontSize: 10px;/ 这里可以直接使用.demo { background-color: bgcColor; font-size: fontSize;} // CSS Module 导出 :export { cssExportBgcColor: bgcColor;} /less.less文件@mainColor: #398bd0;@fontSize: 100px;// CSS Module 有一个:export关键字,它在功能上等同于 ES6 的关键字export,即导出一个 js 对象。:export { name: “less”; mainColor: @mainColor; fontSize: @fontSize;}scss.scss文件$primaryColor: #f4d020;$fontSize: 11px;// CSS Module 有一个:export关键字,它在功能上等同于 ES6 的关键字export,即导出一个 js 对象。:export { name: “scss”; primaryColor: $primaryColor; fontSize: $fontSize;}index.js文件import variablesScss from “./scss.scss”;import variablesLess from “./less.less”;import variablesCss from “./css.css”;// 导出变量export default { variablesScss, variablesLess, variablesCss};6.styles文件夹下代码(样式文件中使用变量)css-use.css文件@value variables: “../variables/css.css”; / 导入变量*/@value bgcColor, fontSize from variables;/* 取出变量*/.box { name: “css”; /* 此属性错误,仅用于区分,可忽略*/ background-color: bgcColor; font-size: fontSize;}less-use.less文件@import “../variables/less.less”;.box { name: “less”;/* 此属性错误,仅用于区分,可忽略*/ background-color: @mainColor; font-size: @fontSize; }scss-use.scss文件@import “../variables/scss.scss”;.box { name: “scss”; /* 此属性错误,仅用于区分,可忽略*/ background-color: $primaryColor; font-size: $fontSize; }7.main.js代码import Vue from “vue”;import App from “./App.vue”;Vue.config.productionTip = false;import variables from “./variables”;console.log(variables, “main-variables”);new Vue({ render: h => h(App)}).$mount("#app");8.App.vue文件代码<template> <div id=“app” class=“box”></div></template><script>// variables in jsimport variables from “./variables”;export default { name: “home”, components: {}, data() { return { variables: { …variables } }; }, created() { console.log(this.variables, “App-this.variables”); }};</script><!–css –><style lang=“css”>#app { height: 500px;}@import “./styles/css-use.css”;</style><!–scss –><style lang=“scss”>@import “./styles/scss-use.scss”;</style><!– less–><style lang=“less”>@import “./styles/less-use.less”;</style>9.最后的效果如图我们在js文件(或vue 文件)中取到样式变量,最后引用第三个资料中的一句话结束本文章环境之间共享变量是编程的圣杯参考资料http://www.ruanyifeng.com/blo…https://github.com/css-module...https://www.bluematador.com/b...https://github.com/css-module...https://github.com/css-module… ...

April 8, 2019 · 2 min · jiezi

4种灵活的Scss编译输出风格整理

很多人从使用Scss的那一刻起,就被别人告诉了如何编译。所以,基本上也就只会一种命令编译方式。其实Scss提供了4种风格输出CSS,以满足更多人的需求。不同的输出方式如下:嵌套输出方式 nested展开输出方式 expanded紧凑输出方式 compact压缩输出方式 compressed那么,以后就可以随意的使用参数来生成自己喜欢的CSS风格。1、nestednested为嵌套输出风格,即左花括号和CSS类名(第一行)齐行。右侧花括号和最后一行齐行,不换行。此风格一般使用较少,因为正常这样写CSS的人不多,风格比较别扭。编译命令为:sass abc.scss:abc.css –style nested生成结果:.header { background: #f00; color: #000; font-size: 20px; }.sidebar { float: left; width: 300px; height: 500px; }.main { float: right; width: 800px; padding: 20px; min-height: 500px; }2、expandedexpanded为展开输出方式,也是一般前端开发直接写CSS使用较多的一种风格。其左花括号和第一行齐行,不换行。右侧的花括号在结尾处换行,另起一行。编译命令为:sass abc.scss:abc.css –style expanded生成结果:.header { background: #f00; color: #000; font-size: 20px;}.sidebar { float: left; width: 300px; height: 500px;}.main { float: right; width: 800px; padding: 20px; min-height: 500px;}3、compactcompact为紧凑输出方式,也是前端开发直接写CSS使用较多的另外一种方式。其左花括号和右花括号均不换行。花括号内的CSS属性值也不换行,一个接着一个写。对于比较喜欢写单行CSS的朋友十分友好。编译命令为:sass abc.scss:abc.css –style compact生成结果:.header { background: #f00; color: #000; font-size: 20px; }.sidebar { float: left; width: 300px; height: 500px; }.main { float: right; width: 800px; padding: 20px; min-height: 500px; }4、compressedcompressed为压缩输出方式。其所有内容均不换行,而且会删除所有注释和空格。把所有代码压成一团。一般在上线情况,或者完全不用阅读修改CSS文件的情况下使用。文件会比较小。编译命令为:sass abc.scss:abc.css –style compressed生成结果:.header{background:#f00;color:#000;font-size:20px}.sidebar{float:left;width:300px;height:500px}.main{float:right;width:800px;padding:20px;min-height:500px} ...

March 8, 2019 · 1 min · jiezi

全局SASS/SCSS变量在Vue项目中应用解决方案

场景说明// 这是一个存放变量的scss文件 “@/styles/_variables.scss”// color font …$cf-light: #B6B6B6;$cf-gray: #8C8C8C;$cf-med: #505050;$cf-dark: #333333;$cf-highlight: #1775F0;我要在其他文件内都用这个来保证样式统一。比如某个组件<template> <div class=“notice”>注意!</div></template><style lang=“scss” scoped>.notice { color: $cf-highlight;}</style>这样就报错了。要改成下面这样<template> <div class=“notice”>注意!</div></template><style lang=“scss” scoped>@import “@/styles/_variables.scss”;.notice { color: $cf-highlight;}</style>简单描述一下:做Vue项目的时候,有时候我们预先设置了一个主题样式文件(_variables.scss),存放大量的定义的SASS变量,需要在不同的组件中使用,默认是无法使用的,除非每个组件内都引入这个_variables.scss文件,十分麻烦,这里提供几种方案。解决办法我有几个解决方案,理论上都可行,大家不妨根据实际应用场景来实践一下。使用sass-resources-loader如果项目使用Vue-cli 2/3,或者Vue项目用的Webpack,用这个loader都是可以的。官方对于各种场景已经写的很清楚了,请看sass-resources-loader。具体不说明了。Vue-cli 3.x 下的最方便的方案这个我还没实践,不过应该是可行的。。。给小白们自己去试,好用的话记得留言回复下哦打开vue.config.js文件,进行如下配置:module.exports = { css: { loaderOptions: { sass: { data: @import "@/styles/_variables.scss"; } } }};具体细节,请阅读:Globally Load SASS into your Vue.js ApplicationsHow to Import a Sass File into Every Vue Component in an App这两篇原理相同,就是细节上有点不同,怕有的打不开就放两个给大家研究下。Nuxt这里还是接住一个插件style-resources-module,这个最近才出的,高级很多,在他之前,都是用nuxt-sass-resources-loader,如果你的项目还在用旧的,可以换成新的。nuxt-sass-resources-loader官方也说了不在更新维护,建议使用style-resources-module。怎么用呢?这里有Example,我也复制一份,醒目。打开nuxt.config.jsexport default { modules: [’@nuxtjs/style-resources’], styleResources: { scss: [ ‘./assets/styles/_variables.scss’, ‘./assets/styles/mixins.scss’ // use underscore “” & also file extension “.scss” ] }}自己注意文件路径结语现在不用每个组件都写导入变量文件了,是不是轻松多了,也不会因为文件名,路径调整,而胆战心惊的文件批量替换。我为什么写这个文章,因为虽然以前研究过,但是时代变化很快,一些更好的方案出现了,但是很多人依旧采用旧的,可能在新的项目上带来一些问题,所以就更新了。(小字,看不见):其次,我其实在使用easywebpack的egg+vue脚手架遇到了这个问题,搞了半天没搞好。。。去官方群里问没人鸟我,于是凄惨退群(底层技术渣的待遇)。参考:Load a global settings.scss file in every vue component? ...

March 7, 2019 · 1 min · jiezi

初识webpack,搭建webpack4+typescript+scss入门项目

为什要使用webPack随着大前端的来临,需要前端处理越来越多的事情,不仅局限页面的交互,项目的需求越来越多,更多的逻辑需要在前端完成,为了简化开发的复杂度,前端社区涌现出了很多好的实践方法。1.模块化,一种将复杂系统分解为可管理模块的方式,简单来说就是解耦,简化开发,一个模块就是实现特定功能的文件,想要什么功能,就加载什么模块,完美的实现了代码重用。其中三大剑客便是Angular,React和Vue2.JavaScript的拓展的开发语言typescript,能够实现目前版本的JavaScript不能直接使用的特性,并且之后还能转换为浏览器可识别的javascript语言3.scss less等CSS预处理器 ….这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让浏览器识别,而手动处理又是非常繁琐的,这就为webPack类的工具的出现提供了需求。webpack是什么webpack是一个模块打包工具,它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分割,等到实际需要的时候再异步加载。webpack支持的模块1.ES2015 import语句2.CommonJS require()语句3.AMD define 和 require语句4.css/sass/less文件的 @import 语句5.样式 (url(…)) 或 HTML文件(<img src=…>) 中的图片链接(image url)webPack的特点1.丰富的插件,方便进行开发工作2.大量的加载器,包括加载各种静态资源3.代码分割,提供按需加载的能力4.发布工具webpack的工作方式把项目当做一个整体,通过一个给定的主文件(如:index.js),从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件。开始项目搭建1.全局安装webpacknpm install -g webpack2.创建练习文件夹mkdir webpack_pratice3.创建package.json文件进入到webpack_pratice,创建package.json文件,在终端中使用npm init命令可以自动创建这个package.json文件 npm init输入这个命令后,终端会问你一系列诸如项目名称,项目描述,作者等信息,不过不用担心,如果你不准备在npm中发布你的模块,这些问题的答案都不重要,回车默认即可。package.json是一个标准的npm说明文件,里面蕴含了丰富的信息,包括当前项目的依赖模块,自定义的脚本任务等等。4.安装项目需要模块 npm install webpack webpack-cli –save-dev npm install typescript ts-loader –save-dev npm install style-loade node-sass sass-loader css-loader –save-dev npm install extract-text-webpack-plugin@next –save-dev npm install html-webpack-plugin –save-dev注意:extract-text-webpack-plugin 最新版本为 3.0.2,这个版本还没有适应 webpack 4 的版本,所以安装的时候需要extract-text-webpack-plugin@next5.构建项目结构a.创建src目录,增加index.html main.ts common.css main.scss index.html<!DOCTYPE html><html lang=“en”><head> <meta charset=“UTF-8”> <title>webpack测试</title></head><body> <div class=“test-block”> Webpack </div></body></html>main.tsimport ‘./main.scss’class TestMain { name: string; age: number; constructor ( name: string, age: number ) { this.name = name; this.age = age; }; testFun() { console.log(this.name + ‘—’ + this.age) }}let testMain = new TestMain(“Miss D”, 18);testMain.testFun();common.csshtml,body{ margin: 0; padding: 0; font-size: 25px; color: yellow;}main.scss@import “common.scss”;.test-block{ width: 300px; height: 300px; margin: 0 auto; background: green;}b.创建dist文件夹c.创建TypeScript的配置文件tsconfig.json{ “compilerOptions”: { “module”: “commonjs”, “target”: “es5”, “sourceMap”: true }, “exclude”: [ “node_modules” ]}d.创建webpack的配置文件webpack.config.jsconst path = require(‘path’);const htmlWebpackPlugin = require(‘html-webpack-plugin’);const ExtractTextPlugin = require(’extract-text-webpack-plugin’);module.exports = { entry: ‘./src/main.ts’, //模块的入口 output: { //输出配置 filename: ‘[name].bundle.js’, path: path.resolve(__dirname, ‘dist’) }, module: { //资源模块的处理器 rules: [ { test: /.tsx?$/, use: ’ts-loader’, exclude: path.resolve(__dirname, ’node_modules’), include: path.resolve(__dirname, ‘src’), }, { test: /.scss$/, use: ExtractTextPlugin.extract({ fallback: { loader: “style-loader” }, use: [ { loader: “css-loader”, }, { loader: “sass-loader” } ] }) }] }, plugins: [ //插件配置 new ExtractTextPlugin({ filename: “[name].min.css” }), new htmlWebpackPlugin({ template: ‘./src/index.html’, inject: ‘head’ }) ]}e.项目文件夹结构6.package.js配置build执行脚本{ “name”: “webpack-pratice”, “version”: “1.0.0”, “description”: “”, “scripts”: { “test”: “echo "Error: no test specified" && exit 1”, “build”: “webpack –config webpack.config.js” }, “author”: “”, “license”: “ISC”, “devDependencies”: { “html-webpack-plugin”: “^3.2.0”, “css-loader”: “^2.1.0”, “extract-text-webpack-plugin”: “^4.0.0-beta.0”, “node-sass”: “^4.11.0”, “sass-loader”: “^7.1.0”, “style-loader”: “^0.23.1”, “ts-loader”: “^5.3.3”, “typescript”: “^3.3.3333”, “webpack”: “^4.29.6”, “webpack-cli”: “^3.2.3” }}7.执行打包命令npm run build打包结果7.运行index.html项目的scss样式和typescript文件,解析成浏览器能识别的css和javascript文件,且自动引入到index.html文件中。官方参考1.webpack官网 链接描述2.html-webpack-plugin插件 链接描述3.extract-text-webpack-plugin插件 链接描述踩坑如果使用webpack,style-loader出现的错误:ERROR in {project}/node_modules/style-loader/lib/addStyles.jsModule not found: Error: Can’t resolve ‘./urls’ in ‘{project}\node_modules\style-loader\lib’解决方法: 直接修改{project}/node_modules/style-loader/lib/addStyles.js文件: 把require(“./urls”)改为require(“./urls.js”) ...

March 6, 2019 · 2 min · jiezi

使用gulp和scss构建样式库

目的为了更好地复用样式,以及出于练习gulp、scss和学习mocha的目的,我在尝试使用gulp、scss构建一个用于pc端的样式库,使用mocha进行浏览器端的测试。为了方便起见,脚本没有使用纯javascript编写,而是选择了jquery。目前,基本的框架已经搭好,正在完善样式中。目录结构lib –> 源代码库scss –> scss代码库mixins –> 共用mixinscomponents –> 组件layouts –> 布局text –> 文字和文本utilities –> 实用的scssstate –> 状态variables –> 变量js –> 组件使用的jsvendor –> 第三方资源(js和css)dist –> 打包后的文件(js和css)examples –> 例子(ejs)test –> 单元测试css命名方式样式库使用前缀+主体+表现的形式命名,比如.c-btn-color–primary。前端的部分使用单横杆连接,状态使用双横杆形式。命名有些丑陋,这是参考命名空间和BEM后的一种尝试。前缀主要区分各自的作用,它们包括:c —> 组件类u —> 实用类l —> 布局类is —> 状态类(显示、隐藏等)t —> 文字或排版类js —> js钩子(表示使用js)其它对于项目的详情,请点击这里遇到的问题由于第一次使用gulp,不可避免地遇到了一些问题,记录如下:gulp4的使用gulp的中文文档是gulp3的,安装gulp3的方法使用,会发现gulp没有找到任务的情况。在gulp4,创建一个任务应该是:function task() { // 需要返回stream、promise或者其他类型(详见gulp4文档) return gulp.src(…).pipe(…);}// 导出default任务exports.default = task;在多个任务的情况,可以使用series和parallel,来分别指定顺序执行和并行,而且可以相互嵌套。下面是一个例子:// 假设各个task已经定义。exports.default = series( task1, parallel(task2, task3));这样,导出的default任务就是先执行task1,然后task2和task3同时执行。gulp-order的使用我在项目中使用了gulp-concat用于拼接js文件,这时,遇到的问题是怎么确定文件的顺序,有的文件有顺序要求。这是一个例子:function task() { return gulp.src(“js/*.js”) .pipe(order([ “js/component.js”, “!js/index.js”, “js/index.js” ], {base: “./”})) .pipe(concat(“main.js”)) .pipe(dest(“dist”));}上面的任务表示先合并component.js然后合并非index.js的文件,最后合并index.js,至于base用于设置基本路径,不使用base可以会发现文件没有合并。最后由于本人能力有限,如有错误,欢迎指出;如果有什么建议,请不吝赐教。

February 21, 2019 · 1 min · jiezi

react中使用css的7中方式(应该是最全的)

第一种: 在组件中直接使用style不需要组件从外部引入css文件,直接在组件中书写。import React, { Component } from “react”;const div1 = { width: “300px”, margin: “30px auto”, backgroundColor: “#44014C”, //驼峰法 minHeight: “200px”, boxSizing: “border-box”};class Test extends Component { constructor(props, context) { super(props); } render() { return ( <div style={div1}>123</div> <div style=“background-color:red;"> ); }}export default Test;注意事项:在正常的css中,比如background-color,box-sizing等属性,在style对象div1中的属性中,必须转换成驼峰法,backgroundColor,boxSizing。而没有连字符的属性,如margin,width等,则在style对象中不变。在正常的css中,css的值不需要用双引好(”"),如.App-header { background-color: #282c34; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: calc(10px + 2vmin); color: white;}而在react中使用style对象的方式时。值必须用双引号包裹起来。这种方式的react样式,只作用于当前组件。第二种: 在组件中引入[name].css文件需要在当前组件开头使用import引入css文件。import React, { Component } from “react”;import TestChidren from “./TestChidren”;import “@/assets/css/index.scss”;class Test extends Component { constructor(props, context) { super(props); } render() { return ( <div> <div className=“link-name”>123</div> <TestChidren>测试子组件的样式</TestChidren> </div> ); }}export default Test;这种方式引入的css样式,会作用于当前组件及其所有后代组件。第三种: 3、在组件中引入[name].scss文件引入react内部已经支持了后缀为scss的文件,所以只需要安装node-sass即可,因为有个node-sass,scss文件才能在node环境上编译成css文件。>yarn add node-sass然后编写scss文件//index.scss.App{ background-color: #282c34; .header{ min-height: 100vh; color: white; }}关于如何详细的使用sass,请查看sass官网这种方式引入的css样式,同样会作用于当前组件及其所有后代组件。第四种: 在组件中引入[name].module.css文件将css文件作为一个模块引入,这个模块中的所有css,只作用于当前组件。不会影响当前组件的后代组件。import React, { Component } from “react”;import TestChild from “./TestChild”;import moduleCss from “./test.module.css”;class Test extends Component { constructor(props, context) { super(props); } render() { return ( <div> <div className={moduleCss.linkName}>321321</div> <TestChild></TestChild> </div> ); }}export default Test;这种方式可以看做是前面第一种在组件中使用style的升级版。完全将css和组件分离开,又不会影响其他组件。第五种: 在组件中引入 [name].module.scss文件类似于第四种,区别是第四种引入css module,而这种是引入 scss module而已。import React, { Component } from “react”;import TestChild from “./TestChild”;import moduleCss from “./test.module.scss”;class Test extends Component { constructor(props, context) { super(props); } render() { return ( <div> <div className={moduleCss.linkName}>321321</div> <TestChild></TestChild> </div> ); }}export default Test;同样这种方式可以看做是前面第一种在组件中使用style的升级版。第六种: 使用styled-components需要先安装>yarn add styled-components然后创建一个js文件(注意是js文件,不是css文件)//style.jsimport styled, { createGlobalStyle } from “styled-components”;export const SelfLink = styled.div height: 50px; border: 1px solid red; color: yellow;;export const SelfButton = styled.div height: 150px; width: 150px; color: ${props =&gt; props.color}; background-image: url(${props =&gt; props.src}); background-size: 150px 150px;;组件中使用styled-components样式import React, { Component } from “react”;import { SelfLink, SelfButton } from “./style”;class Test extends Component { constructor(props, context) { super(props); } render() { return ( <div> <SelfLink title=“People’s Republic of China”>app.js</SelfLink> <SelfButton color=“palevioletred” style={{ color: “pink” }} src={fist}> SelfButton </SelfButton> </div> ); }}export default Test;这种方式是将整个css样式,和html节点整体合并成一个组件。引入这个组件html和css都有了。它的好处在于可以随时通过往组件上传入 属性,来动态的改变样式。对于处理变量、媒体查询、伪类等较方便的。这种方式的css也只对当前组件有效。具体用法,请查看styled-components官网第七种: 使用radium需要先安装>yarn add radium然后在react组件中直接引入使用import React, { Component } from “react”;import Radium from ‘radium’;let styles = { base: { color: ‘#fff’, ‘:hover’: { background: ‘#0074d9’ } }, primary: { background: ‘#0074D9’ }, warning: { background: ‘#FF4136’ }};class Test extends Component { constructor(props, context) { super(props); } render() { return ( <div> <button style={[ styles.base, styles.primary ]}> this is a primary button </button> </div> ); }}export default Radium(Test); 对于处理变量、媒体查询、伪类等是不方便的。使用Radium可以直接处理变量、媒体查询、伪类等,并且可以直接使用js中的数学,连接,正则表达式,条件,函数等。具体用法请查看radium官网注意:在export之前,必须用Radium包裹。 ...

February 11, 2019 · 2 min · jiezi

vue2+webpack4+scss

作者:心叶时间:2019年01月30日 10:37前要由于webpack的配置具有实时性,之前搭建的vue2项目是基于webpack2,因此,特地在此维护一篇关于webpack4搭建vue2项目的说明,会及时更新(github地址:https://github.com/yelloxing/…)。基础配置npm install –save-dev vue vue-router由于是搭建vue2项目,首先需要安装用到的vue和vue路由。npm install –save-dev webpack webpack-cli接着,安装webpack,建立好空的webpack.config.js,如下:module.exports = { entry: [’./src/entry.js’], output: { path: __dirname, filename: ‘build/main.js’ }, resolve: { alias: { ‘vue’: ‘vue/dist/vue.js’ } }, module: { rules: [] }};上面的配置和webpack2的没有区别,这里不再赘述了(entry:打包入口,output:打包文件存放地址,resolve的配置是因为vue2在开发和生成模式对象不统一)。解析vue2npm install –save-dev vue-template-compiler vue-loader首先安装vue模板解析器,接着,在webpack.config.js中配置一下:…rules: [{ test: /.vue$/, use: [‘vue-loader’]}]…配置的时候,其实就是加上上面这二句代码。到此为止,最简单的项目就搭建好了。为了方便执行,在package.json中添加下面脚本:“scripts”: { “release”: “node_modules/.bin/webpack”}然后在命令行执行:npm run release搭建开发环境上面的打包方式时候开发完毕以后,发布代码,如果是开发中,我们希望实时刷新。首先安装服务器:npm install –save-dev webpack-dev-server接着在webpack中配置:…devServer: { contentBase: ‘./’, compress: true, host: ’localhost’, port: ‘20000’, hot: true, inline: true, historyApiFallback: true},plugins: [ new webpack.HotModuleReplacementPlugin()],module:…然后,在package.json中添加下面脚本:“scripts”: { “dev”:“node_modules/.bin/webpack-dev-server –open”, “release”: “node_modules/.bin/webpack”}执行下面命令:npm run dev浏览器会自动打开:localhost:20000完善vue配置npm install –save-dev vue-style-loader css-loader上面是添加项目中对css的解析器,再在webpack.config.js中添加如下配置,即可开发css代码:{ test: /.css$/, use: [‘vue-style-loader’, ‘css-loader’]}添加对scss的支持npm install –save-dev sass-loader node-sass然后,添加下面配置: { test: /.scss$/, use: [“vue-style-loader”, “css-loader”, “sass-loader”]}添加对图片的支持npm install –save-dev file-loader然后,添加下面配置:{ test: /.(png|jpg|jpeg|gif|bmp)$/, use: [‘file-loader?limit=7000&name=build/image/[name].[ext]’]}如果你使用的图片格式不被上面的test包含,需要手动额外添加即可。后记完整的代码维护在github中,会及时更新:https://github.com/yelloxing/…希望对你学习vue2有所帮助 :) ...

January 30, 2019 · 1 min · jiezi

sass和compass基础用法

一、一些基本的命令sass都是通过gem安装,以下是一些基础的命令移除ruby的镜像地址gem sources –remove https://rubygems.org/添加淘宝的镜像 gem source -a http://ruby.taobao.org查看镜像 gem source -v单文件转换命令sass style.scss style.css单文件监听命令(监听会自动编译)sass –watch style.scss:style.css文件夹监听命令sass –watch sassFileDirectory:cssFileDirectorycss文件转成sass/scss文件(在线转换工具css2sass)sass-convert style.css style.sasssass-convert style.css style.scss运行命令行帮助文档,可以获得所有的配置选项sass -h–style表示解析后的css是什么格式,有四种取值分别为:nested,expanded,compact,compressedsass –watch style.scss:style.css –style compact—————-以下是compass———–compass创建一个编译目录,会生成config.rb文件,里面是一些配置compass create sassAPPcompass编译compass compilecompass compile –forcecompass监视compass watchcompass watch –force

January 9, 2019 · 1 min · jiezi

angular实现皮肤主题切换的方案

分配了个给现有angular6项目实现主题切换的效果,实现light dark明暗两种显示效果,我使用scss css预处理器方便开发。效果(因为项目需要保密,只截了一点点):切换样式 就是 实现css 的 变化,主要思路是通过在body 上控制自定义属性的值实现样式的控制,在body上 添加 data-theme-style=”dark”, 像这样:<body data-theme-style=“dark”> <app-root></app-root></body>我们通过data-theme-style的值 来控制样式,本项目中 值有 light,dark 分别代表明暗两套主题首先把切换主题 需要变化的 样式 抽离出来 定义成mixin,如:背景颜色,字体颜色,阴影,边框等,,这里以背景颜色 和 字体颜色举例:@mixin mixin-bg-color($dark-color,$light-color){ [data-theme-style=“dark”] & { background-color: $dark-color; } [data-theme-style=“light”] & { background-color: $light-color; }}@mixin mixin-font-color($dark-color,$light-color){ [data-theme-style=“dark”] & { color: $dark-color; } [data-theme-style=“light”] & { color: $light-color; }}在需要使用相关样式的选择器里应用mixin: @include mixin-font-color(blue,red)举个使用的例子,在data-theme-style=dark时 让 .title 类的字体颜色变为蓝色 在data-theme-style=light时 让 .title 类的字体颜色变为红色:@mixin mixin-font-color($dark-color,$light-color){ [data-theme-style=“dark”] & { color: $dark-color; } [data-theme-style=“light”] & { color: $light-color; }}.main{ .title{ @include mixin-font-color(blue,red) }}上方的scss 编译成css后的结果:[data-theme-style=“dark”] .main .title { color: blue; }[data-theme-style=“light”] .main .title { color: red; }这样一看 就很明白了。接下来就是实现切换到效果,我这里是点击一个按钮 实现 dark 和light 的来回切换,在html模板上:<button class=“switch-theme-btn” (click)=“changeTheme()">{{theme | uppercase}}</button>ts 代码如下,注释很清楚了: /** * 使用localStorage 存储主题的名称 * @param theme / saveTheme(theme): void { localStorage.setItem(theme, theme); } /* * 获取主题名称并设置到body / getTheme(): void { let theme = localStorage.getItem(theme); // 获取主题名称 if (!theme) { theme = dark; // 本地存储中没有theme的话 使用dark主题 } const body = document.getElementsByTagName(‘body’)[0]; body.setAttribute(‘data-theme-style’, theme); // 设置data-theme-style 属性 this.theme = theme; // 用于界面显示 } /* * 点击按钮 触发改变主题的方法 */ changeTheme(): void { const body = document.getElementsByTagName(‘body’)[0]; if (body.getAttribute(data-theme-style) === ‘dark’) { this.saveTheme(light); // 保存 this.getTheme(); // 更新获取 } else { this.saveTheme(dark); // 保存 this.getTheme(); // 更新获取 } }在组件的 ngOnInit() 生命周期 调用下 this.getTheme() 初始化。。做完这些 已经可以实现主题的切换了 ,但是 上方的 样式 写在公共的样式表里才有效,因为组件的样式只对对应的组件生效,使用[data-theme-style=”dark”]属性选择器无法匹配到对应的元素,该属性是定义在body上的,组件上肯定是没有的。 如何在组件的样式里生效呢,这个问题困扰了我一阵子,还是在官网文档找到答案::host-context 选择器有时候,基于某些来自组件视图外部的条件应用样式是很有用的。 例如,在文档的 元素上可能有一个用于表示样式主题 (theme) 的 CSS 类,你应当基于它来决定组件的样式。这时可以使用 :host-context() 伪类选择器。它也以类似 :host() 形式使用。它在当前组件宿主元素的祖先节点中查找 CSS 类, 直到文档的根节点为止。在与其它选择器组合使用时,它非常有用。参考:https://www.angular.cn/guide/…根据文档的说明,我们把前面的mixin改一下:@mixin mixin-font-color($dark-color,$light-color){ :host-context([data-theme-style=“dark”]) & { color: $dark-color; } :host-context([data-theme-style=“light”]) & { color: $light-color; }}.main{ .title{ @include mixin-font-color(blue,red) }}生成 的css 是这样的::host-context([data-theme-style=“dark”]) .main .title { color: blue; }:host-context([data-theme-style=“light”]) .main .title { color: red; }至此 大功告成,对你有帮助的话记得点个赞哦~~ ...

January 3, 2019 · 2 min · jiezi

Vue2学习之旅六:添加对scss的支持

作者:心叶时间:2019-01-01 16:33本篇最终项目文件Github地址:github.com/yelloxing/vue.quick/tree/V6scss支持为了使用scss,我们需要先安装相关的node包:npm install –save style-loader sass-loader node-sass file-loader安装好之后,为了可以在.vue和.scss中使用,需要在webpack.config.js中配置对应的解析器:var webpack = require(‘webpack’);module.exports = { entry: [’./src/entry.js’], output: { path: __dirname, filename: ‘build/main.js’ }, resolve: { alias: { ‘vue’: ‘vue/dist/vue.js’ } }, module: { loaders: [{ test: /.vue$/, loader: ‘vue-loader’, options: { loaders: { scss: ‘style-loader!css-loader!sass-loader’ } } }, { test: /.js$/, loader: ‘babel-loader’, exclude: /node_modules/ },{ test: /.css$/, loader: [‘style-loader’, ‘css-loader’] }, { test: /.scss$/, loader: [‘style-loader’, ‘css-loader’, ‘sass-loader’] }, { test: /.(png|jpg|jpeg|gif|bmp)$/, loader: [‘file-loader?limit=7000&name=build/assets/[name].[ext]’] } ] }};关于上面resolve的配置,是因为编译和打包源文件默认不一样。测试scss打开PageTwo.vue测试一下:<style lang=“scss” scoped>section { & > div { font-size: 20px; }}</style>编译正常。 ...

January 1, 2019 · 1 min · jiezi