Semantic UI 自定义样式

git clone https://github.com/Semantic-Org/Semantic-UI.git

首先我看到的是.csscomb.json文件,我不知道这是什么,于是我百度了一下,这是一个csscomb的配置文件,这是一个格式化CSS的工具,而且这应该是SublimeText的csscomb插件的配置文件,因为我在package.json里面并没有找到csscomb

npm install -g csscomb

于是我们就可以在命令行下面用csscomb命令了

Administrator@LENOVO038 /f/Yugo/test
$ csscomb
No input paths specified

  Usage: csscomb [options] <file ...>

  Options:

    -h, --help           output usage information
    -V, --version        output the version number
    -v, --verbose        verbose mode
    -c, --config [path]  configuration file path
    -d, --detect         detect mode (would return detected options)
    -l, --lint           in case some fixes needed returns an error

新建一个.csscomb.json,并把下面的复制进去(这是官网提供的)。
传送门:http://csscomb.com/config

{
    "remove-empty-rulesets": true,
    "color-case": "upper",
    "block-indent": "  ",
    "color-shorthand": true,
    "element-case": "upper",
    "eof-newline": false,
    "leading-zero": false,
    "quotes": "double",
    "space-before-colon": "",
    "space-after-colon": "",
    "space-before-combinator": "",
    "space-after-combinator": "",
    "space-between-declarations": " ",
    "space-before-opening-brace": " ",
    "space-after-opening-brace": " ",
    "space-after-selector-delimiter": " ",
    "space-before-selector-delimiter": "",
    "space-before-closing-brace": " ",
    "tab-size": true
}

新建一个app.css

.a{
    text-align:center
}
#b{
}

运行命令

Administrator@LENOVO038 /f/Yugo/test
$ csscomb app.css

你可以看到app.css,变成了这个样子。

.a { text-align:center }

接下来是csslintrcjslintrc.gitignore分别是CSSLintJSLintGit的配置文件等,还是不纠结这些工具了,好多都感觉用不上,百度一搜CSSLint还搜出来一个CSSLint是有害的,我就无话可说了。

接下来看gulpfile.js

var gulp = require('gulp-help')(require('gulp')),

看到这句话,我还真不知道这是什么玩意,于是我就自己写个js文件,用console.log去看一下,并没有什么有价值的东西,这个方法算是比较笨的了,于是我没办法,只有上NPMJS上面去找。
https://www.npmjs.com/package/gulp-help ,于是找到了这个包。

我就在当前目录下面运行gulp help命令。

Administrator@LENOVO038 /f/Yugo/SemanticUI
$ gulp help
[20:29:03] Using gulpfile f:\Yugo\SemanticUI\gulpfile.js
[20:29:03] Starting 'help'...

Usage
  gulp [TASK] [OPTIONS...]

Available tasks
  build                          Builds all files from source
  build-docs                     Build all files and add to SUI Docs
  check-install                  Displays current version of Semantic
  clean                          Clean dist folder
  help                           Display this help text.
  install                        Runs set-up
  package compressed css
  package compressed docs css
  package compressed docs js
  package compressed js
  package uncompressed css
  package uncompressed docs css
  package uncompressed docs js
  package uncompressed js
  serve-docs                     Serve file changes to SUI Docs
  version                        Displays current version of Semantic
  watch                          Watch for site/theme changes

[20:29:03] Finished 'help' after 11 ms

可以看见gulpfile.jstask第二个参数,显示在命令行上面了。

gulp.task('watch', 'Watch for site/theme changes', watch);
gulp.task('build', 'Builds all files from source', build);

从上面的help里面就可以看到很多可以用的自动化命令。

接下来我们看src目录。
既然有readme.md那肯定要首先看这个了。

你可以把所有的semantic样式导入到你自己的less文件中。

/* Import all components */
@import 'src/semantic';

你也可以只导入部分样式,比如button,记得加上&{}

/* Import a specific component */
& { @import 'src/definitions/elements/button'; }

我们可以看到,假如没有就重命名.example结尾的文件,去掉末尾的.example就行。

semantic.less  // 里面导入了所有的子组件,像上面的第二种方式一样
theme.config  // 配置文件,修改主题,就需要在这里
theme.less     // 载入文件,通过config的变量配置,在这个文件里面进行载入

接下来

  • definitions/ 真正意义上的src,这里才是真正的源文件
  • themes/ 主题文件夹
  • site/ 你自己网站的样式

好,接下来我们来看看他们是如何工作的,从 theme.config 开始

我们可以看见类似这样的变量
@site       : 'default';
@themesFolder : 'themes';
@import "theme.less";

在最后可以看见,导入了theme.less。耐心,咱们慢慢找。

@theme: @@element;
/* Default site.variables */
@import "@{themesFolder}/default/globals/site.variables";
@import "@{themesFolder}/default/@{type}s/@{element}.variables";
@import (optional) "@{themesFolder}/@{theme}/@{type}s/@{element}.variables";

我们又看见了这句,根据上面的(theme、与type变量放一放)
我们可以知道编译后会是这样themes/default/globals/site.variables
到这里我们就不难猜测出,当然你还可以去该文件夹下面看一看,themes中文就是主题,显而易见,从themes文件夹中去拿到一些定义好的变量,去应用不同的样式,所以就导致了看起来不一样。
简单的来说,就是不同的变量(大小,颜色,边框,边距等)导致了不同的主题(Github、Bootstrap3、Google......),而我们只需要修改,theme.config文件下面的变量,例如@button : 'github';系统就会自动为我们去寻找该主题下的变量,然后载入。

有的朋友进去文件夹里面可能会看见这样的

button.overrides
button.variables

我们不妨先来猜测一下,overrides是空的,variables里面是有的。
override,对面向对象熟悉的人对这个不陌生,重载,又或者说是覆盖,其实在readme里面就有说明,你可以把你先要覆盖的写在override中,因为我们无论用什么框架最优的方法就是不要修改框架里面的东西,这样不利于升级。所有才有_site文件夹,你可以进去看看,发现里面全是空的类似于这样的文件。

接下来我们浅尝一下源码/src/definitions/collections/grid.less,体验一下流程

/*******************************
            Theme
*******************************/

@type    : 'collection';
@element : 'grid';

@import (multiple) '../../theme.config';

注释是主题,ok这肯定与主题相关。还记得theme、与type变量吗?
就是从这里来的,你会发现有一个@import (optional),其实你可以对比一下有option与没有之前的区别,没错就是default变成了@{theme},那明显就是切换主题的喽,根据名字去载入不同文件夹下面的变量。

@import "@{themesFolder}/default/@{type}s/@{element}.variables";

对于optional这个选项我查了一下中文官网文档好像并没有,于是google了一下,说白了就是带有覆盖功能的import,地址如下,想看的可以去看看。

https://github.com/less/less.js/issues/2145
/*******************************
            Standard 标准
*******************************/

.ui.grid {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: stretch;
  padding: 0em;
}

因为是响应式布局,采用flex。方向是row,超出换行,纵向拉伸。

/*----------------------
      Remove Gutters 移除没用的沟le
-----------------------*/
.ui.grid {
  margin-top: -(@rowSpacing / 2);
  margin-bottom: -(@rowSpacing / 2);
  margin-left: -(@gutterWidth / 2);
  margin-right: -(@gutterWidth / 2);
}
.ui.relaxed.grid  {
  margin-left: -(@relaxedGutterWidth / 2);
  margin-right: -(@relaxedGutterWidth / 2);
}
.ui[class*="very relaxed"].grid  {
  margin-left: -(@veryRelaxedGutterWidth / 2);
  margin-right: -(@veryRelaxedGutterWidth / 2);
}

/* Preserve Rows Spacing on Consecutive Grids */
.ui.grid + .grid {
  margin-top: @consecutiveGridDistance;
}

.very.relaxed.ui.grid的左右外边距会别.relaxed.ui.grid/.ui.grid
.ui.grid的相邻.grd的上外边距可能跟普通的有点不一样。
这些都可以在
组件变量/src/themes/default/collections/grid.variables或者
全局变量/src/themes/default/globals/site.variables找到,前提是你使用的默认样式。

/*-------------------
       Columns
--------------------*/

/* Standard 16 column */
.ui.grid > .column:not(.row),
.ui.grid > .row > .column {
  position: relative;
  display: inline-block;

  width: @oneWide;
  padding-left: (@gutterWidth / 2);
  padding-right: (@gutterWidth / 2);
  vertical-align: top;
}

.ui.grid > * {
  padding-left: (@gutterWidth / 2);
  padding-right: (@gutterWidth / 2);
}

标准的 16 列一行结构
这个变量在全局的变量里找到。
@columnCount: 16;
@oneWide : (1 / @columnCount * 100%);
这些都是使用的%布局。
每一个.column就是十六分之一的宽度

/*-------------------
        Rows
--------------------*/

.ui.grid > .row {
  position: relative;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: inherit;
  align-items: stretch;
  width: 100% !important;
  padding: 0rem;
  padding-top: (@rowSpacing / 2);
  padding-bottom: (@rowSpacing / 2);
}

通过设置width:100%使其沾满一行
有一些小的就忽略掉了,主要看大体。

/* Grid Based */
.ui[class*="one column"].grid > .row > .column,
.ui[class*="one column"].grid > .column:not(.row) {
  width: @oneColumn;
}
.ui[class*="two column"].grid > .row > .column,
.ui[class*="two column"].grid > .column:not(.row) {
  width: @twoColumn;
}

这个就是设置几列占一行的样式

<div class="ui two column grid">
  <div class="column">第一行第一列</div>
  <div class="column">第一行第二列</div>
  <div class="column">第二行第一列</div>
</div>
.ui.grid > [class*="one column"].row > .column {
  width: @oneColumn !important;
}
.ui.grid > [class*="two column"].row > .column {
  width: @twoColumn !important;
}

这样你还可以把two column写在.row上面

.ui.centered.grid,
.ui.centered.grid > .row,
.ui.grid > .centered.row {
  text-align: center;
  justify-content: center;
}
.ui.centered.grid > .column:not(.aligned):not(.row),
.ui.centered.grid > .row > .column:not(.aligned),
.ui.grid .centered.row > .column:not(.aligned) {
  text-align: left;
}

.ui.grid > .centered.column,
.ui.grid > .row > .centered.column {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

设置居中flex里面的元素居中,且只有.aligned.centered才会让文本居中。

/*----------------------
        Relaxed 给元素的边距设置的大一点
-----------------------*/


/*----------------------
        Padded 边距为0
-----------------------*/

/*----------------------
       "Floated"
-----------------------*/
.ui.grid [class*="left floated"].column {
  margin-right: auto;
}
.ui.grid [class*="right floated"].column {
  margin-left: auto;
}
// 有的人会问浮动为什么不是float。
// 因为这是flex布局,当左边的边距等于auto,他就自动到最右边,同理另一边也是。

其他的就是一些改变边距,背景颜色,以及flex布局方向的东西。经过Semantiui grid 包装了之后可以不需要懂太多的flex布局,但是我还是推荐学习flex布局,阮一峰的《Flex 布局教程:语法篇》不错,我也看了4、5次,不经常用的话,忘得很快。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,442评论 25 707
  • 删除xcode插件: ~/Library/Application Support/Developer/Shared...
    小小机器人阅读 100评论 0 0
  • 今天突然想学起HTML,去图书馆借了一本书,害怕自己以后会忘记了,我还是将关键点记录下来!方便我以后复习~仔细不容...
    干货助手阅读 627评论 1 2