<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; CSS</title>
	<atom:link href="https://blog.gmem.cc/category/work/web/css/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Tue, 21 Apr 2026 10:40:56 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>PostCSS学习笔记</title>
		<link>https://blog.gmem.cc/postcss-study-note</link>
		<comments>https://blog.gmem.cc/postcss-study-note#comments</comments>
		<pubDate>Thu, 22 Dec 2016 08:03:47 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=14147</guid>
		<description><![CDATA[<p>简介 由于CSS语言本身的表达能力较差，Web开发人员常常使用SASS、LESS之类的CSS预处理器语言来编写样式，然后再编译为普通的CSS代码。 PostCSS是一个类似的、较晚出现的CSS处理器，它基于JavaScript语言编写。PostCSS使用插件式的架构，而不是像以前的CSS预处理器那样内置所有特性。目前PostCSS的插件数量已经有数百个。 尽管名字中带有Post，PostCSS并不是所谓后处理器。它可以执行其它预处理器能够完成的任务。PostCSS本身只做两件事情： 将输入代码转换为抽象语法树（AST） 调用插件处理AST 插件机制 PostCSS依赖于插件完成实际的工作，例如Lint、变量和混入的支持、未来CSS特性支持（transpile）、内联图片，等等。本节列出常用的插件。 解决全局CSS问题 插件 说明 postcss-use 允许你在CSS中明确声明使用PostCSS特性，这样可以仅针对某些文件使用PostCSS postcss-modules 可以让你在任何地方使用CSS Modules——自动进行CSS选择器的命名隔离，不仅仅限于客户端 react-css-modules 针对React扩展CSS Modules postcss-autoreset 条件式的自动重置 postcss-initial <a class="read-more" href="https://blog.gmem.cc/postcss-study-note">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/postcss-study-note">PostCSS学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">简介</span></div>
<p>由于CSS语言本身的表达能力较差，Web开发人员常常使用SASS、LESS之类的CSS预处理器语言来编写样式，然后再编译为普通的CSS代码。</p>
<p>PostCSS是一个类似的、较晚出现的CSS处理器，它基于JavaScript语言编写。PostCSS使用插件式的架构，而不是像以前的CSS预处理器那样内置所有特性。目前PostCSS的插件数量已经有数百个。</p>
<p>尽管名字中带有Post，PostCSS并不是所谓后处理器。它可以执行其它预处理器能够完成的任务。PostCSS本身只做两件事情：</p>
<ol>
<li>将输入代码转换为抽象语法树（AST）</li>
<li>调用插件处理AST</li>
</ol>
<div class="blog_h2"><span class="graybg">插件机制</span></div>
<p>PostCSS依赖于插件完成实际的工作，例如Lint、变量和混入的支持、未来CSS特性支持（transpile）、内联图片，等等。本节列出常用的插件。</p>
<div class="blog_h3"><span class="graybg">解决全局CSS问题</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">插件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>postcss-use</td>
<td>
<p>允许你在CSS中明确声明使用PostCSS特性，这样可以仅针对某些文件使用PostCSS</p>
</td>
</tr>
<tr>
<td>postcss-modules</td>
<td>可以让你在任何地方使用CSS Modules——自动进行CSS选择器的命名隔离，不仅仅限于客户端</td>
</tr>
<tr>
<td>react-css-modules</td>
<td>针对React扩展CSS Modules</td>
</tr>
<tr>
<td>postcss-autoreset</td>
<td>条件式的自动重置</td>
</tr>
<tr>
<td>postcss-initial</td>
<td>支持<pre class="crayon-plain-tag">all: initial</pre> 规则，以便重置所有继承得到的样式</td>
</tr>
<tr>
<td>cq-prolyfill</td>
<td>添加容器查询（container query）支持，允许根据父元素的宽度来决定样式</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">使用未来的CSS特性</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">插件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>autoprefixer</td>
<td>自动添加厂商相关的规则前缀</td>
</tr>
<tr>
<td>postcss-cssnext</td>
<td>支持未来的CSS特性</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">CSS可读性</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">插件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>precss</td>
<td>
<p>提供SASS风格的特性，例如变量、嵌套、混入</p>
</td>
</tr>
<tr>
<td>postcss-sorting</td>
<td>对规则的内容进行排序</td>
</tr>
<tr>
<td>postcss-utilities</td>
<td>包含很多常用的助手工具</td>
</tr>
<tr>
<td>short</td>
<td>支持某些属性简写</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">图像和字体</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">插件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>postcss-assets</td>
<td>管理资产，把样式表和环境改变隔离。可以自动寻找图片的URL、自动生成图片的尺寸</td>
</tr>
<tr>
<td>postcss-sprites</td>
<td>生成图片sprites，自动合并多张小图片</td>
</tr>
<tr>
<td>font-magician</td>
<td>生成CSS中所有需要的@font-face规则</td>
</tr>
<tr>
<td>postcss-inline-svg</td>
<td>支持内联SVG图片并设置样式</td>
</tr>
<tr>
<td>postcss-write-svg</td>
<td>支持在CSS中直接写入简单的SVG</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">语法相关</span></div>
<p>PostCSS可以转换基于任何语法的样式，不仅仅是CSS</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">插件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>sugarss</td>
<td>类似于SASS的基于缩进的语法</td>
</tr>
<tr>
<td>postcss-scss</td>
<td>与SCSS语言一起工作，但是不进行SCSS编译</td>
</tr>
<tr>
<td>postcss-less</td>
<td>与LESS语言一起工作，但是不进行LESS编译</td>
</tr>
<tr>
<td>postcss-less-engine</td>
<td>与LESS语言一起工作，并且把LESS编译为CSS</td>
</tr>
<tr>
<td>postcss-js</td>
<td>
<p>支持在JS中编写样式，或者把转换React内联样式、Radium、JSS</p>
</td>
</tr>
<tr>
<td>postcss-safe-parser</td>
<td>查找并修复CSS语法错误</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">其它</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">插件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>cssnano</td>
<td>模块化的CSS压缩器</td>
</tr>
<tr>
<td>lost</td>
<td>基于calc()的特性丰富的网格系统</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">使用PostCSS</span></div>
<div class="blog_h2"><span class="graybg">Webpack</span></div>
<p>基于postcss-loader：</p>
<pre class="crayon-plain-tag">module.exports = {
    module: {
        loaders: [
            {
                test: /\.css$/,
                // 需要在style、css等加载器之前执行
                loader: "style-loader!css-loader!postcss-loader"
            }
        ]
    },
    postcss: function () {
        // 列出启用的PostCSS插件
        return [ require( 'autoprefixer' ), require( 'precss' ) ];
    }
}</pre>
<div class="blog_h2"><span class="graybg">命令行</span></div>
<pre class="crayon-plain-tag">postcss --use autoprefixer -c options.json -o main.css css/*.css</pre>
<div class="blog_h2"><span class="graybg">Webstorm</span></div>
<p>你需要安装<a href="https://plugins.jetbrains.com/plugin/8578">PostCSS support</a>插件，以获得以下特性：</p>
<ol>
<li>自动识别.pcss文件</li>
<li>支持PostCSS语法高亮</li>
<li>智能的代码完成</li>
<li>可配置的代码样式和自动格式化</li>
<li>代码导航支持</li>
<li>对自定义选择器、自定义媒体查询的支持</li>
</ol>
<div class="blog_h3"><span class="graybg">设置</span></div>
<p>如果要对任意.css文件启用PostCSS支持，你可以在Preferences ⇨ Languages &amp; Frameworks ⇨ Stylesheets ⇨ Dialects 把方言切换为PostCSS。</p>
<div class="blog_h1"><span class="graybg">常用插件</span></div>
<div class="blog_h2"><span class="graybg">Autoprefixer</span></div>
<p>这是一个必备的插件，可以让你脱离编写厂商特定的规则前缀的苦海。启用该插件后，如果需要编写弹性和子布局，你仅需要：</p>
<pre class="crayon-plain-tag">#content {
    display: flex;
}</pre>
<p>该插件会将其转换为：</p>
<pre class="crayon-plain-tag">#content {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
}</pre>
<p>你可以配置需要支持的浏览器：</p>
<pre class="crayon-plain-tag">require( 'autoprefixer' )( {
    // 仅仅支持支持主流浏览器的最近两个版本
    browsers: [ 'last 2 versions' ]
    // ie 6-8 表示支持IE6-8
    // &gt; 1% 表示支持全球占用率超过1%的浏览器
} )</pre>
<div class="blog_h2"><span class="graybg">postcss-cssnext</span></div>
<p>该插件允许你使用未来版本CSS可能纳入标准的特性，它会将其编译为当前浏览器能够理解的CSS规则。</p>
<p>cssnext已经使用了Autoprefixer，因此不需要明确声明后者。</p>
<div class="blog_h3"><span class="graybg">自定义属性和变量</span></div>
<p>CSS 的层叠变量的自定义属性规范（CSS Custom Properties for Cascading Variables）允许在CSS中定义属性，并在样式规则中将其作为变量引用。自定义属性以<pre class="crayon-plain-tag">--</pre> 开头，你可以利用<pre class="crayon-plain-tag">var()</pre> 引用这些属性：</p>
<pre class="crayon-plain-tag">:root {
    /* 自定义属性 */
    --text-color: black;
}

body {
    /* 引用自定义属性 */
    color: var(--text-color);
}</pre>
<p>你还可以定义一个属性集，然后通过@apply来应用：</p>
<pre class="crayon-plain-tag">:root {
    /* 自定义属性集 */
    --danger-theme: {
        color: white;
        background-color: red;
    };
}

.danger {
    /* 应用属性集，新增两条样式规则 */
    @apply --danger-theme;
}</pre>
<p>你可以在calc()函数中引用属性：</p>
<pre class="crayon-plain-tag">:root {
    --fontSize: 1rem;
}

h1 {
    font-size: calc(var(--fontSize) * 2);
}</pre>
<div class="blog_h3"><span class="graybg">自定义媒体查询</span> </div>
<pre class="crayon-plain-tag">@custom-media --small-viewport (max-width: 30em);

@media (--small-viewport) {
    /* 对于小的viewport应用样式 */
}</pre>
<div class="blog_h3"><span class="graybg">媒体查询范围</span></div>
<p>使用操作符代替min- / max-，让语法更易读：</p>
<pre class="crayon-plain-tag">@media (width &gt;= 500px) and (width &lt;= 1200px) {
    /* 样式规则 */
}

/* 也可以和自定义媒体查询联用 */
@custom-media --only-medium-screen (width &gt;= 500px) and (width &lt;= 1200px);
@media (--only-medium-screen) {
    /* 样式规则 */
}</pre>
<div class="blog_h3"><span class="graybg">自定义选择器</span></div>
<p>CSS 扩展规范（CSS Extensions）允许自定义选择器，你可以创建一个选择器来引用多个既有选择器：</p>
<pre class="crayon-plain-tag">@custom-selector :--heading h1, h2, h3, h4, h5, h6;

:--heading {
    font-weight: bold;
}</pre>
<p>转换后的结果为：</p>
<pre class="crayon-plain-tag">h1, h2, h3, h4, h5, h6 {
 font-weight: bold;
}</pre>
<div class="blog_h3"><span class="graybg">样式规则嵌套</span></div>
<p>样式规则嵌套是非常实用的特性，可以减少重复的选择器声明。它是SASS、LESS等CSS预处理器能够流行的重要原因。</p>
<p>CSS 嵌套模块规范（CSS Nesting Module）中定义了标准的样式规则嵌套方式，cssnext支持这些规范。</p>
<p>规范引入了一种新的嵌套选择器，使用<pre class="crayon-plain-tag">&amp;</pre> 来表示。在嵌套样式规则（nested style rule）中使用该选择器时，它代表当前被匹配的父规则；在其它地方使用该选择器不代表任何东西。</p>
<p>嵌套样式规则具有两种语法：</p>
<ol>
<li>直接嵌套，直接编写在其它样式的内部，且规则的组合选择器（compound selector）的第一个必须是嵌套选择器：<br />
<pre class="crayon-plain-tag">.foo {
    color: blue;
    &amp; &gt; .bar { color: red; }
}
/* 转换后 */
.foo { color: blue; }
.foo &gt; .bar { color: red; }


.foo {
    color: blue;
    &amp;.bar { color: red; }
}
/* 转换后 */
.foo { color: blue; }
.foo.bar { color: red; }

.foo, .bar {
    color: blue;
    &amp; + .baz, &amp;.qux {
        color: red;
    }
}

/* 等价于 */
.foo, .bar { color: blue; }
:matches(.foo, .bar) + .baz, :matches(.foo, .bar).qux { color: red; }</pre>
</li>
<li>嵌套@Rule：这种方式更加灵活，没有嵌套选择器的那些限制：<br />
<pre class="crayon-plain-tag">.foo {
    color: red;
    @nest &amp; &gt; .bar { color: blue; }
}
/* 等价于 */
.foo { color: red; }
.foo &gt; .bar { color: blue; }


.foo {
    color: red;
    /* &amp; 仍然表示父规则，但是位置随意了 */
    @nest .parent &amp; { color: blue; }
}
/* 等价于 */
.foo { color: red; }
.parent .foo { color: blue; }

.foo {
    color: red;
    @nest :not(&amp;) { color: blue; }
}
/* 等价于 */
.foo { color: red; }
:not(.foo) { color: blue; }</pre>
</li>
</ol>
<div class="blog_h3"><span class="graybg">颜色操控</span></div>
<p>color函数可以让颜色操控更加方便，该函数会被编译为rgba：</p>
<pre class="crayon-plain-tag">a {
    color: color(red alpha(-10%));
}

a:hover {
    color: color(red blackness(80%));
}</pre>
<p>更多的颜色修饰符参考<a href="https://github.com/postcss/postcss-color-function#list-of-color-adjuster">官方</a>。</p>
<p>hwb函数类似于hsl，但是更加易于人类理解，该函数会被编译为rgba：</p>
<pre class="crayon-plain-tag">body {
    color: hwb(90, 0%, 0%, 0.5);
}</pre>
<p>gray函数用于指定灰度颜色 ，该函数会被编译为rgba：</p>
<pre class="crayon-plain-tag">.foo {
    color: gray(85);
}

.bar {
    color: gray(10%, 50%);
}</pre>
<p>四位或者八位的<pre class="crayon-plain-tag">#rrggbbaa</pre> 格式的颜色代码被支持：</p>
<pre class="crayon-plain-tag">body {
    background: #9d9c;
}</pre>
<div class="blog_h3"><span class="graybg">initial值</span></div>
<p>cssnext允许任何样式属性取值initial，这个值不是浏览器默认值，而是规定的某个属性的默认值。例如display的默认值总是inline。</p>
<p>你可以使用</p>
<pre class="crayon-plain-tag">div {
    all: initial;
}</pre>
<p>把所有属性设置为默认值。</p>
<div class="blog_h3"><span class="graybg">:any-link伪类</span></div>
<p>该伪类匹配任何具有href属性的a/area/link元素：</p>
<pre class="crayon-plain-tag">nav :any-link {
    background-color: yellow;
}</pre>
<div class="blog_h3"><span class="graybg">:matches伪类</span></div>
<p>该伪类：</p>
<pre class="crayon-plain-tag">p:matches(:first-child, .special) {
    color: red;
}</pre>
<div class="blog_h3"><span class="graybg">:not伪类</span></div>
<p>允许该伪类指定多个选择器：</p>
<pre class="crayon-plain-tag">p:not(:first-child, .special) {
  color: red;
}</pre>
<div class="blog_h3"><span class="graybg">::伪语法</span></div>
<p>对于不支持该语法的旧浏览器，自动转换为单个冒号：</p>
<pre class="crayon-plain-tag">a::before {  }</pre>
<div class="blog_h2"><span class="graybg">postcss-use</span></div>
<p>在某个样式类文件中启用PostCSS插件。例如清除CSS代码中的注释：</p>
<pre class="crayon-plain-tag">/* 标准语法 */
@use postcss-discard-comments(removeAll: true);
/* 备选语法 */
@use postcss-discard-comments {
    removeAll: true
}

/* 这里的注释会被清除 */
h1 {
    color: red
}</pre>
<div class="blog_h3"><span class="graybg">short</span></div>
<p>为某些样式属性提供简写：</p>
<pre class="crayon-plain-tag">/* 简写 */
.icon {
    size: 48px;
}
/* 等价于 */
.icon {
    width: 48px;
    height: 48px;
}


/* 简写 */
.frame {
    /* 第一个是下上，第二个是左右 */
    margin: * auto;
}
/* 等价于 */
.frame {
    margin-right: auto;
    margin-left: auto;
}


/* 简写 */
.banner {
    position: fixed 0 0 *;
}
/* 等价于 */
.banner {
    position: fixed;
    top: 0;
    right: 0;
    left: 0;
}

/* 简写 */
.canvas {
    color: #abccfc #212231;
}
/* 等价于 */
.canvas {
    color: #abccfc;
    background-color: #212231;
}</pre>
<p>目前IDE对这些简写的支持不太好，可能误判为语法错误。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/postcss-study-note">PostCSS学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/postcss-study-note/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS Modules学习笔记</title>
		<link>https://blog.gmem.cc/css-modules-study-note</link>
		<comments>https://blog.gmem.cc/css-modules-study-note#comments</comments>
		<pubDate>Thu, 22 Dec 2016 05:25:07 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=14132</guid>
		<description><![CDATA[<p>CSS Modules 简介 CSS Modules是一个开源项目，它是一个简单的CSS模块化规范，主要完成两件事情： 样式类名、动画名的作用域支持。这可以避免命名冲突 模块化支持，允许CSS文件之间的依赖关系 与Less、SASS、PostCSS不同，CM并不尝试把CSS变得像一门编程语言（比如支持控制结构、变量），它仅仅解决模块化的基本问题——作用域和模块依赖。 使用CM时所有[crayon-69ec9b49e1bee276812202-i/] 和[crayon-69ec9b49e1bf3523652688-i/] 所操作的URL均为模块请求格式（module request format）： [crayon-69ec9b49e1bf5354289324-i/]和[crayon-69ec9b49e1bf7151862078-i/] 这样的URL表示想对路径 [crayon-69ec9b49e1bf9995356263-i/]和[crayon-69ec9b49e1bfb371462911-i/] 这样的URL表示目标位于模块目录（例如node_modules）内部 作用域 使用CM时，样式类名、动画名默认仅具有局部作用域。CM会把CSS文件编译为一个低级别ICSS（Interoperable CSS）格式，不过你编写的时候仍然使用普通CSS语法： [crayon-69ec9b49e1bfd966902283/] ICSS会导出一个对象，其键是局部名称（即你在CSS中声明的样式类名），其值则是编译后的全局名称。全局名称正是运行时使用的真实CSS样式类名，默认情况下全局名称是依据局部名称生成的哈希串。 从JS模块引入一个CSS模块时，你自然获得上述导出对象，可以通过键引用CSS类名： [crayon-69ec9b49e1bff767386995/] 命名 CM建议局部名称一律使用驼峰式大小写，单这不是必须的。 <a class="read-more" href="https://blog.gmem.cc/css-modules-study-note">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/css-modules-study-note">CSS Modules学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">CSS Modules</span></div>
<div class="blog_h2"><span class="graybg">简介</span></div>
<p><a href="https://github.com/css-modules/css-modules">CSS Modules</a>是一个开源项目，它是一个简单的CSS模块化规范，主要完成两件事情：</p>
<ol>
<li>样式类名、动画名的作用域支持。这可以避免命名冲突</li>
<li>模块化支持，允许CSS文件之间的依赖关系</li>
</ol>
<p>与Less、SASS、PostCSS不同，CM并不尝试把CSS变得像一门编程语言（比如支持控制结构、变量），它仅仅解决模块化的基本问题——作用域和模块依赖。</p>
<p>使用CM时所有<pre class="crayon-plain-tag">url(...)</pre> 和<pre class="crayon-plain-tag">import</pre> 所操作的URL均为模块请求格式（module request format）：</p>
<ol>
<li><pre class="crayon-plain-tag">./xxx</pre>和<pre class="crayon-plain-tag">../xxx</pre> 这样的URL表示想对路径</li>
<li><pre class="crayon-plain-tag">xxx</pre>和<pre class="crayon-plain-tag">xxx/yyy</pre> 这样的URL表示目标位于模块目录（例如node_modules）内部</li>
</ol>
<div class="blog_h2"><span class="graybg">作用域</span></div>
<p>使用CM时，样式类名、动画名默认仅具有局部作用域。CM会把CSS文件编译为一个低级别ICSS（Interoperable CSS）格式，不过你编写的时候仍然使用普通CSS语法：</p>
<pre class="crayon-plain-tag">/* style.css */
.className {
    color: green;
}</pre>
<p>ICSS会导出一个对象，其<span style="background-color: #c0c0c0;">键是局部名称（即你在CSS中声明的样式类名），其值则是编译后的全局名称</span>。全局名称正是运行时使用的真实CSS样式类名，默认情况下全局名称是依据局部名称生成的哈希串。</p>
<p>从JS模块引入一个CSS模块时，你自然获得上述导出对象，可以通过键引用CSS类名：</p>
<pre class="crayon-plain-tag">// 导入全部映射
import styles from "./style.css";
// 导入需要的映射
import { className } from "./style.css";

// 基于键引用全局样式类名
element.innerHTML = '&lt;div class="' + styles.className + '"&gt;';</pre>
<div class="blog_h3"><span class="graybg">命名</span></div>
<p>CM建议局部名称一律使用驼峰式大小写，单这不是必须的。</p>
<div class="blog_h3"><span class="graybg">全局作用域</span></div>
<p>使用特殊伪类<pre class="crayon-plain-tag">:global</pre> 可以声明一个全局作用域：</p>
<pre class="crayon-plain-tag">:global(.className) {
    color: green;
}

@keyframes :global(animeName){
}</pre>
<p>全局名称不会被编译成哈希串，在JS中可以直接使用： </p>
<pre class="crayon-plain-tag">element.innerHTML = '&lt;div class="className"&gt;';</pre>
<p>尽管通常情况下没有必要，你可以显式的声明局部作用域： </p>
<pre class="crayon-plain-tag">:local(.className) {
    color: green;
}</pre>
<div class="blog_h2"><span class="graybg">组合</span></div>
<p>CM支持让一个选择器compose另一个选择器定义的样式规则，并称其为组合（Composition）。例如：</p>
<pre class="crayon-plain-tag">.className {
    color: green;
    background: red;
}

.otherClassName {
    composes: className;
    color: yellow;
}

/* 编译结果 */
.global_name_className{
   color: green;
   background: red;
}
.global_name_otherClassName{
    color: yellow;
}</pre>
<p>引用otherClassName的JS代码，会被编译为分别引用上面两个选择器的形式：</p>
<pre class="crayon-plain-tag">`&lt;div class="${otherClassName}"&gt;`
&lt;!-- 编译结果 --&gt;
&lt;div class="global_name_className global_name_otherClassName"&gt;</pre>
<p>注意：</p>
<ol>
<li>你可以在单个composes规则中指定多个目标类名，例如<pre class="crayon-plain-tag">composes: classNameA classNameB;</pre></li>
<li>你可以指定多次composes规则，但是必须位于其它规则的前面</li>
<li>组合仅仅支持局部选择器，并且选择器必须是单个样式类名</li>
</ol>
<div class="blog_h2"><span class="graybg">依赖</span></div>
<p>使用组合时，你可以compose来自其它CSS模块的样式类：</p>
<pre class="crayon-plain-tag">.title {
    composes: className from './another.css';
    color: red;
}</pre>
<p>注意： compose其它CSS文件中定义的样式类时，其应用顺序是不确定的，因此你不能假设同名规则的覆盖情况。</p>
<div class="blog_h2"><span class="graybg">在Webpack中使用</span></div>
<p>CM为流行的构建工具提供了插件支持。使用Webpack时，你可以通过css-loader来支持CM。配置示例：</p>
<pre class="crayon-plain-tag">// Webpack 1.x配置
module.exports = {
    module: {
        loaders: [
            {
                test: /\.css$/,
                // modules参数导致css-loader工作在module模式下
                loader: "style-loader!css-loader?modules"
                // 你可以使用localIdentName参数来定制全局名生成规则，默认规则为[hash:base64]
                loader: "style-loader!css-loader?modules&amp;localIdentName=[path][name]-[local]-[hash:base64:5]"
            },
        ]
    }
};</pre>
<p>当工作在modules模式下时，css-loader会把所有局部样式类名编译成唯一的全局名。 </p>
<div class="blog_h2"><span class="graybg">联用CSS预处理器</span></div>
<p>CM产生的ICSS文件与SASS/SCSS/LESS之类的CSS预处理器是兼容的。你可以把预处理器的loader添加到加载器链中：</p>
<pre class="crayon-plain-tag">{
    test: /\.scss$/,
    loaders: [
        // 注意链条是从右向左（从下向上）执行的
        'style',
        'css?modules&amp;importLoaders=1&amp;localIdentName=[path]___[name]__[local]___[hash:base64:5]',
        'resolve-url',
        'sass'
    ]
} </pre>
<div class="blog_h1"><span class="graybg">React CSS Modules</span></div>
<p>在开发React应用程序时，可以考虑使用PostCSS插件React CSS Modules来代替CM，其优势是：</p>
<ol>
<li>不要求你使用驼峰式大小写的类名。使用CM时，Webpack的css-loader强制要求驼峰式大小写</li>
<li>不需要在代码中到处引用styles对象中的属性</li>
<li>全局CSS与CSS模块很容易区分：<br />
<pre class="crayon-plain-tag">// RCS使用className引用全局CSS类名，styleName引用局部CSS类名
&lt;div className='global-css' styleName='local-module'&gt;&lt;/div&gt; </pre>
</li>
<li>如果styleName属性引用一个未定义的CSS模块，你可以得到一个警告而非错误</li>
</ol>
<div class="blog_h2"><span class="graybg">实现机制</span></div>
<p>RCS扩展了目标React组件的render方法，依据输出元素上的styleName属性的值来寻找styles对象中的CSS模块，然后把找到的全局样式类名<span style="background-color: #c0c0c0;">附加</span>到元素的className后面。</p>
<p>这意味着，组件必须要被RCS装饰。</p>
<div class="blog_h3">
<div class="blog_h3"><span class="graybg" style="color: #007755;">在Webpack中使用</span></div>
</div>
<div class="blog_h3"><span class="graybg">开发环境</span></div>
<p>在开发环境下，你可能希望启用Sourcemaps和热模块替换（Hot Module Replacement） 。加载器style-loader已经支持HMR，因此HMR是开箱即用的。</p>
<p>参考下面的内容配置加载器：</p>
<pre class="crayon-plain-tag">// 需要预先安装style-loader、css-loader
{
    test: /\.css$/,
    loaders: [
        'style?sourceMap',
        'css?modules&amp;importLoaders=1&amp;localIdentName=[path]___[name]__[local]___[hash:base64:5]'
    ]
}</pre>
<div class="blog_h3"><span class="graybg">生产环境</span></div>
<p>在生产环境下，你可能希望把CSS块合并到单个文件中：</p>
<pre class="crayon-plain-tag">// 需要预先安装style-loader、css-loader
// extract-text-webpack-plugin 用于把CSS块合并到单个文件
{
    module: {
        loaders: [
            // ExtractTextPlugin v2x
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract( {
                    notExtractLoader: 'style-loader',
                    loader: 'css?modules&amp;importLoaders=1&amp;localIdentName=[path]___[name]__[local]___[hash:base64:5]!resolve-url!postcss',
                } ),
            }
        ]
    },
    plugins: [
        new ExtractTextPlugin( {
            filename: 'app.css',
            allChunks: true
        } )
    ]
}</pre>
<div class="blog_h2"><span class="graybg">联用React</span></div>
<p>要使用RCM，你的React组件必须被CSSModules装饰：</p>
<pre class="crayon-plain-tag">import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './table.css';

// 可以使用ES7装饰器语法
@CSSModules(styles, options)
class Table extends React.Component {
    render() {
        return &lt;div styleName='table'&gt;
            &lt;div styleName='row'&gt;
                &lt;div styleName='cell'&gt;A0&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;;
    }
}

// 必须装饰React组件，否则无法使用styleName属性
export default CSSModules( Table, styles, options);</pre>
<p>其中options支持以下选项：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">选项</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>allowMultiple</td>
<td>默认false。是否允许多个CSS模块名，如果设置为false，以下代码会导致错误：<br />
<pre class="crayon-plain-tag">&lt;div styleName='foo bar' /&gt; </pre>
</td>
</tr>
<tr>
<td>errorWhenNotFound</td>
<td>默认true。如果styleName指定了无法在styles对象中找到的CSS模块，是否报错</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">styles属性</span></div>
<p>被装饰的React组件，会获得<pre class="crayon-plain-tag">this.props.styles</pre> 属性，它的值与CSSModules调用的第2参数是一个对象：</p>
<pre class="crayon-plain-tag">&lt;div&gt;
   // 这两种写法等价
    &lt;p styleName='foo'&gt;&lt;/p&gt;
    &lt;p className={this.props.styles.foo}&gt;&lt;/p&gt;
&lt;/div&gt;;</pre>
<div class="blog_h3"><span class="graybg">子组件</span></div>
<p>默认的，你不能在子组件中的输出元素中使用styleName属性，因为子组件没有被CSSModules装饰。你可以：</p>
<ol>
<li>使用装饰过的子组件</li>
<li>使用从被装饰过的父组件中继承得到的<pre class="crayon-plain-tag">this.props.styles</pre></li>
</ol>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/css-modules-study-note">CSS Modules学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/css-modules-study-note/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sass学习笔记</title>
		<link>https://blog.gmem.cc/sass-study-note</link>
		<comments>https://blog.gmem.cc/sass-study-note#comments</comments>
		<pubDate>Mon, 23 Feb 2015 01:33:55 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=14162</guid>
		<description><![CDATA[<p>简介 Sass是对CSS语言的扩展，为其提供了：变量、嵌套规则、混入、内联（inline）导入等语言特性。 语法风格 Sass具有两套语法风格。 一种是旧的、基于缩进的语法风格，通常称为Sass，扩展名.sass 。这种语法风格使用缩进而不是代码块来表示嵌套规则，使用换行符而非分号来分隔属性，因而比较简洁。 另一种是新的、基于代码块的语法风格，通常称为Sassy CSS，扩展名.scss 。符合CSS3语法的文件都可以是SCSS文件。 使用命令行，可以在这两种格式进行转换： [crayon-69ec9b49e2351273428793/] 本文主要使用SCSS的语法风格。 使用SASS 基于命令行 Sass命令行基于Ruby语言开发，你需要先安装、配置好Ruby环境 。然后执行： [crayon-69ec9b49e2355207630606/] CSS语言扩展 本章内容介绍Sass对标准CSS语言的扩展，Sass的某些特性与未来的CSS 4规范是兼容的。 嵌套规则 Sass允许一个CSS规则嵌套编写在另外一个规则的内部，这样可以避免重复书写父选择器： [crayon-69ec9b49e2358358905670/] 转换后的CSS为： <a class="read-more" href="https://blog.gmem.cc/sass-study-note">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/sass-study-note">Sass学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">简介</span></div>
<p>Sass是对CSS语言的扩展，为其提供了：变量、嵌套规则、混入、内联（inline）导入等语言特性。</p>
<div class="blog_h1"><span class="graybg">语法风格</span></div>
<p>Sass具有两套语法风格。</p>
<p>一种是旧的、基于缩进的语法风格，通常称为Sass，扩展名.sass 。这种语法风格使用<span style="background-color: #c0c0c0;">缩进而不是代码块</span>来表示嵌套规则，使用<span style="background-color: #c0c0c0;">换行符而非分号</span>来分隔属性，因而比较简洁。</p>
<p>另一种是新的、基于代码块的语法风格，通常称为Sassy CSS，扩展名.scss 。符合CSS3语法的文件都可以是SCSS文件。</p>
<p>使用命令行，可以在这两种格式进行转换：</p>
<pre class="crayon-plain-tag"># 将SASS转换为SCSS格式
sass-convert style.sass style.scss

# 将 SCSS转换为SASS格式
$ sass-convert style.scss style.sass</pre>
<p>本文主要使用SCSS的语法风格。</p>
<div class="blog_h1"><span class="graybg">使用SASS</span></div>
<div class="blog_h2"><span class="graybg">基于命令行</span></div>
<p>Sass命令行基于Ruby语言开发，你需要先安装、配置好Ruby环境 。然后执行：</p>
<pre class="crayon-plain-tag"># 安装Sass命令行工具
gem install sass

# 转换为标准CSS文件
sass input.scss output.css
# 指定输出风格：
# nested：嵌套缩进的CSS代码，默认值
# expanded：没有缩进的、扩展的代码代码
# compact：简洁格式的代码代码
# compressed：压缩后的代码代码，用于生产环境
sass --style compressed test.sass test.css

# 监控文件的改动并自动更新
sass --watch input.scss:output.css</pre>
<div class="blog_h1"><span class="graybg">CSS语言扩展</span></div>
<p>本章内容介绍Sass对标准CSS语言的扩展，Sass的某些特性与未来的CSS 4规范是兼容的。</p>
<div class="blog_h2"><span class="graybg">嵌套规则</span></div>
<p>Sass允许一个CSS规则嵌套编写在另外一个规则的内部，这样可以避免重复书写父选择器：</p>
<pre class="crayon-plain-tag">#main p {
    color: #00ff00;
    width: 97%;
    // 嵌套规则
    .redbox {
        background-color: #ff0000;
        color: #000000;
    }
}</pre>
<p>转换后的CSS为：</p>
<pre class="crayon-plain-tag">#main p {
    color: #00ff00;
    width: 97%;
}
#main p .redbox {
    background-color: #ff0000;
    color: #000000;
}</pre>
<div class="blog_h2"><span class="graybg">引用父选择器</span></div>
<p>Sass支持以<pre class="crayon-plain-tag">&amp;</pre> 来引用父选择器，转换时，该符号使用父选择器代替：</p>
<pre class="crayon-plain-tag">a {
    font-weight: bold;
    // 父选择器放在前面
    &amp;:hover {
        text-decoration: underline;
    }
    // 也可以放在后面
    body.firefox &amp; {
        font-weight: normal;
    }
}</pre>
<p>转换后的结果：</p>
<pre class="crayon-plain-tag">a {
    font-weight: bold;
}
a:hover {
    text-decoration: underline;
}
body.firefox a {
    font-weight: normal;
}</pre>
<div class="blog_h2"><span class="graybg">嵌套属性</span></div>
<p>你可以把某些同类属性合并到一个块中：</p>
<pre class="crayon-plain-tag">.funky {
    font: {
        family: fantasy;
        size: 30em;
        weight: bold;
    }
}</pre>
<div class="blog_h2"><span class="graybg">注释</span></div>
<p>Sass支持两种风格的注释：<pre class="crayon-plain-tag">/* */</pre> 和<pre class="crayon-plain-tag">//</pre> </p>
<div class="blog_h1"><span class="graybg">SassScript</span></div>
<p>除了普通的CSS语言扩展外，Sass还支持脚本机制。你可以定义变量、使用函数。任何CSS属性都可以用脚本来指定。</p>
<div class="blog_h2"><span class="graybg">变量</span></div>
<p>你可以使用<pre class="crayon-plain-tag">$</pre> 前缀声明SassScript变量：</p>
<pre class="crayon-plain-tag">$width: 5em;

#main {
    // 引用变量
    width: $width;
}</pre>
<p><span style="background-color: #c0c0c0;">变量的作用域取决于它所处于的块</span>。除了使用$前缀以外，旧式的<pre class="crayon-plain-tag">!</pre> 前缀仍然被支持；除了使用<pre class="crayon-plain-tag">:</pre> 定义变量值以外，旧式的<pre class="crayon-plain-tag">=</pre> 依然被支持。</p>
<div class="blog_h2"><span class="graybg">数据类型</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 12%; text-align: center;">类型</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>数字</td>
<td>举例：1.2  10  10px</td>
</tr>
<tr>
<td>字符串</td>
<td>
<p>可以没有引号、单引号包围、双引号包围</p>
<p>通常SCSS中使用哪种格式的字符串，则转换后的CSS也使用哪一种。例外情况是<pre class="crayon-plain-tag">#{}</pre> 插值：</p>
<pre class="crayon-plain-tag">@mixin firefox-message($selector) {
    body.firefox #{$selector}:before {
        content: "Hi, Firefox users!";
    }
}

@include firefox-message(".header");</pre>
<p>转换后引用字符串会变为非引用格式：</p>
<p><pre class="crayon-plain-tag">/* .header周围的引号被自动去掉 */
body.firefox .header:before {
    content: "Hi, Firefox users!";
}</pre>
</td>
</tr>
<tr>
<td>颜色</td>
<td>举例：#FF0000  red rgba(255, 0, 0, 0.5)</td>
</tr>
<tr>
<td>布尔</td>
<td>true  false</td>
</tr>
<tr>
<td>空值</td>
<td>null</td>
</tr>
<tr>
<td>值列表</td>
<td>
<p>以空格或者逗号分隔。例如：<pre class="crayon-plain-tag">Helvetica, Arial, sans-serif</pre> </p>
<p>某些SassScript函数能够操控列表，例如nth函数访问列表的成员，join函数把列表连接为字符串，append函数附加新值到列表中</p>
<p>列表中可以包含其它列表，例如<pre class="crayon-plain-tag">1px 2px, 5px 6px</pre> ，如果内外列表使用相同的分隔符，则必须用括号来区分：<pre class="crayon-plain-tag">(1px 2px) (5px 6px)</pre> </p>
</td>
</tr>
<tr>
<td>映射</td>
<td>
<p>例如：<pre class="crayon-plain-tag">(key1: value1, key2: value2)</pre> </p>
<p>与列表不同，映射必须以括号为界，且必须以逗号分隔条目</p>
<p>某些SassScript函数能够操控映射，例如map-get可以获取一个值，map-merge可以添加条目</p>
<p>映射可以作为列表使用，它相当于键值对的列表</p>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">操作符</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">操作符</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>==   !=</td>
<td>相等性判断，可以用于任何数据类型</td>
</tr>
<tr>
<td>+ - * / %</td>
<td>
<p>算术运算符。数字类型支持此类运算符，单位的转换会自动进行</p>
<p>由于CSS允许 / 作为分隔数字的房时，Sass必须支持它。只有使用函数、变量时， / 才会被解析为除法运算符：</p>
<pre class="crayon-plain-tag">p {
    font: 10px/8px;             // 不解释为除法，原样输出
    $width: 1000px;
    width: $width/2;            // 使用变量，解释为除法
    width: round(1.5)/2;        // 使用函数，解释为除法
    height: (500px/2);          // 使用括号，解释为除法
    margin-left: 5px + 8px/2px; // 使用+号，解释为除法
    font: (italic bold 10px/8px); // 列表中，不解释为除法，原样输出
}
/* 转换结果 */
p {
    font: 10px/8px;
    width: 500px;
    width: 1;
    height: 250px;
    margin-left: 9px;
    font: italic bold 10px/8px;
}</pre>
<p>使用 - 操作符时，需要注意：</p>
<ol>
<li>作为减法运算符时，前后应都有空格</li>
<li>作为负号或者一元操作符时，前面应有空格，后面不能有空格</li>
<li>在基于空格的列表中使用一元操作符，需要用括号包围：<pre class="crayon-plain-tag">10px (-$var)</pre>  </li>
</ol>
<p>使用 + 可以进行字符串连接：</p>
<pre class="crayon-plain-tag">p {
    cursor: e + -resize;
}
// 转换后：
p {
    cursor: e-resize;
}</pre>
<p>颜色支持算术运算符，RGB将会分别运算：</p>
<pre class="crayon-plain-tag">p {
    color: #111 + #222;
}
// 转换后：
p {
    color: #333333;
}

p {
    color: rgba(255, 0, 0, 0.75) + rgba(0, 255, 0, 0.75);
}
// 透明度不受影响：
p {
    color: rgba(255, 255, 0, 0.75);
}</pre>
</td>
</tr>
<tr>
<td>&lt; &gt; &lt;= &gt;=</td>
<td>关系运算符，数字类型支持此类运算符</td>
</tr>
<tr>
<td>and  or  not</td>
<td>用于布尔值的运算</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">函数</span></div>
<p>SassScript定义了一些额外的函数，调用方式与普通CSS函数一致：
<pre class="crayon-plain-tag">p {
    color: hsl(0, 100%, 50%);
}
// 转换后：
p {
    color: red;
}</pre>
<div class="blog_h3"><span class="graybg">关键字参数</span></div>
<p>调用SassScript函数时，可以明确指定参数名称，这样可以改变传参顺序：</p>
<pre class="crayon-plain-tag">p {
    color: hsl($hue: 0, $saturation: 100%, $lightness: 50%);
}</pre>
<div class="blog_h3"><span class="graybg">常用函数</span></div>
<p>所有函数的列表：<a href="http://sass-lang.com/documentation/Sass/Script/Functions.html">http://sass-lang.com/documentation/Sass/Script/Functions.html</a></p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">函数</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>lighten</td>
<td>提高颜色亮度：<pre class="crayon-plain-tag">lighten(#cc3, 10%) // #d6d65c</pre> </td>
</tr>
<tr>
<td>darken</td>
<td>降低颜色亮度</td>
</tr>
<tr>
<td>grayscale</td>
<td>灰度化颜色：<pre class="crayon-plain-tag">grayscale(#cc3) // #808080</pre> </td>
</tr>
<tr>
<td>complement</td>
<td>获得补偿色</td>
</tr>
<tr>
<td>invert</td>
<td>获得反色</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">插值#{}</span></div>
<p>你可以在选择器、属性名处使用插值来引用变量：</p>
<pre class="crayon-plain-tag">$name: foo;
$attr: border;
p.#{$name} {
    #{$attr}-color: blue;
}
// 转换后
p.foo {
    border-color: blue;
}</pre>
<p>在属性值中，通常直接使用变量。如果想把插值周围的操作符作为普通CSS字符看待，可以使用插值：</p>
<pre class="crayon-plain-tag">p {
    $font-size: 12px;
    $line-height: 30px;
    // 这里的 / 不会作为除法看待
    font: #{$font-size}/#{$line-height};
}

// 转换后
p {
    font: 12px/30px;
}</pre>
<div class="blog_h2"><span class="graybg">&amp;与SassScript</span> </div>
<p>在SassScript中，&amp;符号同样代表父选择器：</p>
<pre class="crayon-plain-tag">.foo.bar .baz.bang, .bip.qux {
    $selector: &amp;;
    // 这里变量$selector的值为 ((".foo.bar" ".baz.bang"), ".bip.qux")
}</pre>
<p>如果父选择器不存在，则&amp;的值为null。你可以依此判断父选择器是否存在：</p>
<pre class="crayon-plain-tag">@mixin does-parent-exist {
    @if &amp; {
        &amp;:hover {
            color: red;
        }
    } @else {
        a {
            color: red;
        }
    }
}</pre>
<div class="blog_h2"><span class="graybg">默认值</span></div>
<p>特殊语法<pre class="crayon-plain-tag">!default</pre> 用来给变量赋默认值：</p>
<pre class="crayon-plain-tag">$content: "First content";
// 如果$content没有赋值过，则设置为Second content?
$content: "Second content?" !default;
$new_content: "First time reference" !default;

#main {
    content: $content;
    new-content: $new_content;
}

// 转换后：
#main {
    content: "First content";
    new-content: "First time reference";
}</pre>
<div class="blog_h2"><span class="graybg">@规则和指令</span></div>
<div class="blog_h3"><span class="graybg">@extend</span></div>
<p>从另外一个选择器继承属性：</p>
<pre class="crayon-plain-tag">.class1 {
    border: 1px solid #ddd;
}

.class2 {
    @extend .class1;
    font-size: 120%;
}


/* 转换后 */
.class1, .class2 {
    border: 1px solid #ddd;  // .class2选择器自动获得该属性
}

.class2 {
    font-size: 120%;
}</pre>
<p>在同一个规则中，该指令可以出现多次。</p>
<div class="blog_h3"><span class="graybg">@mixin</span></div>
<p>混入，定义一个可复用的代码块：</p>
<pre class="crayon-plain-tag">@mixin left {
    float: left;
    margin-left: 10px;
}
div {
    @include left;
}

/* 转换后 */
div {
    float: left;
    margin-left: 10px;
}</pre>
<p>上述示例类似于@extend，但是混入本身不会引入选择器定义。<span style="background-color: #c0c0c0;">混入的强大之处在于它支持参数</span>： </p>
<pre class="crayon-plain-tag">// 指定一个value参数，还提供了默认值
@mixin left($value: 10px) {
    float: left;
    margin-right: $value;
}

div {
    @include left(20px);
    // 使用默认值
    @include left();
    @include left;
}

/* 转换后：*/
div {
    float: left;
    margin-right: 20px;
}</pre>
<div class="blog_h3"><span class="graybg">@import</span></div>
<p>用于把外部文件插入到当前文档中：</p>
<pre class="crayon-plain-tag">@import "path/filename.scss";
@import "http://foo.com/bar";
@import url(foo);
// 同时引入多个文件
@import "rounded-corners", "text-shadow";</pre>
<p>如果插入的是CSS文件，则等价于CSS3的@import指令。 </p>
<p>如果你<span style="background-color: #c0c0c0;">不希望Sass编译某个scss文件，可以让他的名字以下划线开头</span>。这种文件可以用于被导入，导入时需要去掉下划线前缀：</p>
<pre class="crayon-plain-tag">// 导入_colors.scss
@import "colors";</pre>
<p>@import可以嵌套在规则内部使用：</p>
<pre class="crayon-plain-tag">.example {
  color: red;
}</pre><br />
<pre class="crayon-plain-tag">#main {
    @import "example";
}

// 转换后
#main .example {
    color: red;
}</pre>
<div class="blog_h3"><span class="graybg">@function</span></div>
<p>用于自定义函数：</p>
<pre class="crayon-plain-tag">@function square($n) {
    @return $n * $n;
}

#squre {
    size: square(10);
}

// 转换后
#squre {
    size: 10000; }</pre>
<div class="blog_h2"><span class="graybg">流程控制</span></div>
<p>SassScript支持条件分支、循环等基本的流程控制。</p>
<div class="blog_h3"><span class="graybg">@if</span></div>
<pre class="crayon-plain-tag">$width: 100;
div {
    @if $width &gt;= 100 {
        height: 100px;
    } @else if ($width &lt;50) {
        height: 50px;
    } @else {
        height: 75px;
    }
}

// 转换后：
div {
    height: 100px;
}</pre>
<div class="blog_h3"><span class="graybg">@for</span></div>
<p>注意以开区间结束：</p>
<pre class="crayon-plain-tag">@for $i from 1 to 3 {
    .kssi-header-#{$i} {
        font-size: $i*10px;
    }
}

// 转换后：
.kssi-header-1 {
    font-size: 10px; }

.kssi-header-2 {
    font-size: 20px; }</pre>
<div class="blog_h3"><span class="graybg">@while</span></div>
<pre class="crayon-plain-tag">$i: 0;
@while $i &lt; 2 {
    .icon-user-#{$i} {
        background-image: url("user-#{$i}.jpg");
    }
    $i : $i + 1;
}

// 转换后

.icon-user-0 {
    background-image: url("user-0.jpg"); }

.icon-user-1 {
    background-image: url("user-1.jpg"); }</pre>
<div class="blog_h3"><span class="graybg">@each</span></div>
<pre class="crayon-plain-tag">@each $user in user admin anonymous {
    .icon-#{$user}{
        background-image: url("#{$user}.png");
    }
}

// 转换后：
.icon-user {
    background-image: url("user.png"); }

.icon-admin {
    background-image: url("admin.png"); }

.icon-anonymous {
    background-image: url("anonymous.png"); }</pre>
<p>&nbsp;</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/sass-study-note">Sass学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/sass-study-note/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS3学习笔记</title>
		<link>https://blog.gmem.cc/css3-study-note</link>
		<comments>https://blog.gmem.cc/css3-study-note#comments</comments>
		<pubDate>Tue, 19 Apr 2011 07:42:21 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=11297</guid>
		<description><![CDATA[<p>常用CSS3样式 文字 线性渐变 只有基于Webkit的浏览器才支持此特性，Firefox不支持： [crayon-69ec9b49e2e7f777087390/] 背景 限制背景图片大小 注意：不能和背景颜色一起使用，但是可以和渐变背景一起使用： [crayon-69ec9b49e2e84787857983/] 线性渐变 CSS格式说明： [crayon-69ec9b49e2e86024787609/] 从左向右的渐变：  [crayon-69ec9b49e2e88803464497/] 你可以为direction指定任意的渐变角度： [crayon-69ec9b49e2e8a199406345/] 设置占位符样式 要设置表单元素placeholder的样式，需要为不同浏览器设置伪元素/类的样式： [crayon-69ec9b49e2e8c382621878/] CSS选择器 我们知道CSS由一系列的规则组成，每个规则包括两个部分：选择器（selector）和声明块（declaration block）组成。 <a class="read-more" href="https://blog.gmem.cc/css3-study-note">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/css3-study-note">CSS3学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">常用CSS3样式</span></div>
<div class="blog_h2"><span class="graybg">文字</span></div>
<div class="blog_h3"><span class="graybg">线性渐变</span></div>
<p>只有基于Webkit的浏览器才支持此特性，Firefox不支持：</p>
<pre class="crayon-plain-tag">selector  {
    background: -webkit-linear-gradient(#3ADB69, #059CF7);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
}</pre>
<div class="blog_h2"><span class="graybg">背景</span></div>
<div class="blog_h3"><span class="graybg">限制背景图片大小</span></div>
<p>注意：不能和背景颜色一起使用，但是可以和渐变背景一起使用：</p>
<pre class="crayon-plain-tag">selector {
    /* 不能和background-color配合 */
    background: -webkit-linear-gradient(0deg, #3ADB69, #059CF7, #3ADB69);
    background: -o-linear-gradient(0deg, #3ADB69, #059CF7, #3ADB69);
    background: -moz-linear-gradient(0deg, #3ADB69, #059CF7, #3ADB69);
    background: linear-gradient(0deg, #3ADB69, #059CF7, #3ADB69);
    background-repeat: no-repeat;
    background-size: 3px 100%; /* 背景宽度3像素，高度100% */
}</pre>
<div class="blog_h3"><span class="graybg">线性渐变</span></div>
<p>CSS格式说明：</p>
<pre class="crayon-plain-tag">/* direction：表示渐变发生的方向 */
/* 预定义值：to bottom, to top, to right, to left, to bottom right */
/* 至少需要两个颜色（color-stop），支持透明度 */
selector {
    background: linear-gradient(direction, color-stop1, color-stop2,...);
}</pre>
<p>从左向右的渐变： </p>
<pre class="crayon-plain-tag">selector {
    background: red; /* For browsers that do not support gradients */
    background: -webkit-linear-gradient(left, #3ADB69, #059CF7); /* For Safari 5.1 to 6.0 */
    background: -o-linear-gradient(right, #3ADB69, #059CF7); /* For Opera 11.1 to 12.0 */
    background: -moz-linear-gradient(right, #3ADB69, #059CF7); /* For Firefox 3.6 to 15 */
    background: linear-gradient(to right, #3ADB69, #059CF7); /* Standard syntax */
}</pre>
<p>你可以为direction指定任意的渐变角度：</p>
<pre class="crayon-plain-tag">/* 从下往上为0deg，顺时针旋转，90deg为从左往右 */
selector {
    background: -webkit-linear-gradient(60deg, #3ADB69, #059CF7, #3ADB69); /* For Safari 5.1 to 6.0 */
    background: -o-linear-gradient(60deg, #3ADB69, #059CF7, #3ADB69); /* For Opera 11.1 to 12.0 */
    background: -moz-linear-gradient(60deg, #3ADB69, #059CF7, #3ADB69); /* For Firefox 3.6 to 15 */
    background: linear-gradient(60deg, #3ADB69, #059CF7, #3ADB69); /* Standard syntax */
} </pre>
<div class="blog_h2"><span class="graybg">设置占位符样式</span></div>
<p>要设置表单元素placeholder的样式，需要为不同浏览器设置伪元素/类的样式：</p>
<pre class="crayon-plain-tag">/* Safari, Google Chrome, Opera 15+ */
selector::-webkit-input-placeholder{}
/* Mozilla Firefox 19- */
selector:-moz-placeholder{}
/* Mozilla Firefox 19+ */
selector::-moz-placeholder{}
/* IE 10/11 */
selector:-ms-input-placeholder{} </pre>
<div class="blog_h1"><span class="graybg">CSS选择器</span></div>
<p>我们知道CSS由一系列的<span style="background-color: #c0c0c0;">规则</span>组成，每个规则包括两个部分：<span style="background-color: #c0c0c0;">选择器</span>（selector）和<span style="background-color: #c0c0c0;">声明块</span>（declaration block）组成。</p>
<p>CSS3支持通过更多的选择器将元素和样式进行绑定，避免在HTML中添加不必要的class属性，进一步的实现内容与样式分离。</p>
<div class="blog_h2"><span class="graybg">元素选择器</span></div>
<p>即元素的名称（tag name）为选择器，匹配一个类型的元素：</p>
<pre class="crayon-plain-tag">元素标签名 {
    /* 样式声明 */
}</pre>
<div class="blog_h2"><span class="graybg">类选择器</span></div>
<p>匹配特定的样式类，样式类通过HTML元素的class属性声明，一个元素可以声明多个样式类，以空格分隔：</p>
<pre class="crayon-plain-tag">.类名称 {
    /* 样式声明 */
}
元素标签名.类名称 {
    /* 样式声明 */
}</pre>
<p>类选择器可以和元素选择器联用，进一步限制匹配范围，例如：</p>
<pre class="crayon-plain-tag">/* 匹配具有normal样式类的p元素 */
p.normal {}
/* 匹配具有normal样式类的任何元素 */
*.normal {}</pre>
<div class="blog_h3"><span class="graybg">多类选择器</span></div>
<p> 要限定目标元素同时具有多个样式类，可以使用多类选择器：</p>
<pre class="crayon-plain-tag">.类名称1.类名称2{
    /* 样式声明 */
}

/* 举例 */
p.normal.highlight{}</pre>
<p>各样式类的顺序无关紧要。</p>
<div class="blog_h2"><span class="graybg">ID选择器</span></div>
<p> 用于匹配具有特定ID的元素：</p>
<pre class="crayon-plain-tag">#标识符 {
    /* 样式声明 */
}</pre>
<div class="blog_h2"><span class="graybg">属性选择器</span></div>
<p>基于HTML元素的属性来匹配，包括4种变体：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">选择器</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>[attr]</td>
<td>匹配具有attr属性的元素</td>
</tr>
<tr>
<td>[attr=val]</td>
<td>匹配attr属性的值为val的元素</td>
</tr>
<tr>
<td>[attr~=val]</td>
<td>以空格分隔元素attr属性的值，如果分隔得到的数组元素，至少有一个为val，那么此选择器匹配该元素</td>
</tr>
<tr>
<td>[attr*=val]</td>
<td>子串匹配，匹配attr属性的值包含val的元素</td>
</tr>
<tr>
<td>[attr^=val]</td>
<td>子串匹配，匹配attr属性的值以val开头的元素</td>
</tr>
<tr>
<td>[attr$=val]</td>
<td>子串匹配，匹配attr属性的值以val结尾的元素</td>
</tr>
</tbody>
</table>
<p>属性选择器可以和元素选择器联用，例如：</p>
<pre class="crayon-plain-tag">p[class~="normal"]{}</pre>
<div class="blog_h2"><span class="graybg">通配符选择器</span></div>
<p>用于匹配文档中所有元素：</p>
<pre class="crayon-plain-tag">* {
    /* 样式声明 */
}</pre>
<div class="blog_h2"><span class="graybg">选择器分组</span></div>
<p>如果多个选择器具有相同的样式规则，可以使用<span style="background-color: #c0c0c0;">选择器分组</span>，用逗号分隔多个选择器： </p>
<pre class="crayon-plain-tag">选择器1, 选择器2 {
    /* 样式声明 */
}</pre>
<div class="blog_h2"><span class="graybg">后代选择器</span></div>
<p>也称为包含选择器、上下文选择器：</p>
<pre class="crayon-plain-tag">选择器1 &gt; 选择器2 {
    /* 仅匹配选择器1匹配元素的直接子元素，且子元素满足选择器2 */
}
选择器1  选择器2 {
    /* 于上面类似，但是匹配任意后代，不限定直接子元素 */
}</pre>
<div class="blog_h2"><span class="graybg">兄弟选择器</span></div>
<pre class="crayon-plain-tag">选择器1 + 选择器2 {
    /* 匹配选择器1的任何后续兄弟元素（父元素相同），且这些兄弟元素匹配选择器2 */
}</pre>
<div class="blog_h2"><span class="graybg">伪类选择器</span></div>
<p>所谓伪类，是指非用户指定的样式类，而是CSS中预定义的、与<span style="background-color: #c0c0c0;">元素状态相关</span>的特殊类：</p>
<pre class="crayon-plain-tag">:伪类{
    /* 样式声明 */
}</pre>
<div class="blog_h3"><span class="graybg">链接伪类</span></div>
<p>以下伪类适用于链接元素： </p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">伪类</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>:link</td>
<td>匹配未访问过的链接</td>
</tr>
<tr>
<td>:visited</td>
<td>匹配已经访问过的链接</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">动态伪类</span></div>
<p>以下伪类可以用于任何元素：</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">伪类</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>:focus</td>
<td>匹配当前获得焦点的元素</td>
</tr>
<tr>
<td>:hover</td>
<td>
<p>匹配当前鼠标指针悬停的元素</p>
<p>注意：在移动浏览器上，表现为轻触后元素的样式，而且仅仅应用到最近轻触的那个元素</p>
</td>
</tr>
<tr>
<td>:active</td>
<td>匹配被用户输入激活的元素，鼠标在目标上按下时样式生效</td>
</tr>
<tr>
<td>:enabled</td>
<td>当前元素可用时的样式</td>
</tr>
<tr>
<td>:disabled</td>
<td>当前元素禁用时的样式</td>
</tr>
<tr>
<td>:read-only</td>
<td>当元素处于只读状态时的样式</td>
</tr>
<tr>
<td>:read-write</td>
<td>当元素处于读写状态时的样式</td>
</tr>
<tr>
<td>:checked</td>
<td>复选框、单选框处于选中状态时的样式</td>
</tr>
<tr>
<td>:selection</td>
<td>文字被选中时的样式</td>
</tr>
<tr>
<td>:default</td>
<td>页面打开时，默认处于选中状态的样式。后续即使取消选中，样式也不会取消</td>
</tr>
<tr>
<td>:indeterminate</td>
<td>如果选框组没有任何一个被选中，则针对整个组应用样式。一旦后续选中某个选框，则样式取消</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">伪元素选择器</span></div>
<p>类似于伪类，伪元素并不是文档中真实存在的DOM节点，它描述与其它元素的关系。伪元素选择器也以冒号开头。 </p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">伪元素</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>:first-letter</td>
<td>匹配块元素中的第一个字母</td>
</tr>
<tr>
<td>:first-line</td>
<td>匹配块元素中的第一行</td>
</tr>
<tr>
<td>:before</td>
<td>在目标元素的前面插入内容，例如：<br />
<pre class="crayon-plain-tag">p:before {
    content: "++"; /* 在元素前面插入的内容 */
    content: url(img.png) /* 还可以插入图片 */
    content: attr(alt) /* 插入HTML属性值 */
    /*counter(计数器名称)用于顺序排号，计数器名称任意*/
    content: '第'counter(c0) '节' 
}</pre>
</td>
</tr>
<tr>
<td>:after</td>
<td>在目标元素的后面插入内容</td>
</tr>
<tr>
<td>:first-child</td>
<td>匹配第一个子元素，即当前元素<span style="background-color: #c0c0c0;">是其父元素的第一个子元素</span>时，应用此样式</td>
</tr>
<tr>
<td>:last-child</td>
<td>匹配最后一个子元素</td>
</tr>
<tr>
<td>:nth-child</td>
<td>匹配第n个子元素，举例：<br />
<pre class="crayon-plain-tag">p:nth-child(5){
    /* 匹配第5个子元素 */
}
p:nth-child(odd){
    /* 匹配序号为奇数的所有元素 */
}
p:nth-child(even){
    /* 匹配序号为偶数的所有元素 */
}</pre>
</td>
</tr>
<tr>
<td>:nth-last-child</td>
<td>匹配倒数第n个子元素</td>
</tr>
<tr>
<td>:nth-of-type</td>
<td>匹配第n个子元素，计数时仅仅考虑同类型元素</td>
</tr>
<tr>
<td>:nth-last-of-type</td>
<td>匹配倒数第n个子元素，计数时仅仅考虑同类型元素</td>
</tr>
<tr>
<td>:only-child</td>
<td>如果只有一个子元素，则针对此子元素应用样式</td>
</tr>
<tr>
<td>:root</td>
<td>将样式绑定到文档的跟元素，即html元素</td>
</tr>
<tr>
<td>:not</td>
<td>对某个元素应用样式，但是想排除其特殊的子元素时使用：<br />
<pre class="crayon-plain-tag">选择器1:not(选择器2){
    /* 样式声明 */
}</pre>
</td>
</tr>
<tr>
<td>:empty</td>
<td>匹配没有子节点的元素</td>
</tr>
<tr>
<td>:target</td>
<td>匹配文档中的某个目标，即ID被链接Hash部分引用的元素，只有连接到目标元素之后，样式才生效</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">文本样式</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">样式/属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>text-shadow</td>
<td>为文本添加阴影效果：<br />
<pre class="crayon-plain-tag">/*四个属性分别为：阴影水平偏移、阴影垂直偏移、阴影模糊半径、阴影颜色*/
text-shadow : length length length color;</pre></p>
<p>若要在左上方向显示阴影，可以将偏移设置为负数<br />模糊半径越大，则阴影外向模糊的范围越大，此值可省略<br />某些浏览器支持设置多个阴影，这种情况下使用逗号分隔多个阴影参数</p>
</td>
</tr>
<tr>
<td>word-break</td>
<td>让文本自动换行，可以实现任意位置换行：<br />normal，使用浏览器默认换行规则<br />keep-all，只能在半角空格或者连字符处换行<br />break-all，允许任意位置换行</td>
</tr>
<tr>
<td>word-wrap</td>
<td>可以让长单词、URL地址等自动换行。该属性得到所有浏览器支持<br />normal，使用浏览器默认换行规则<br />break-word，允许在单词内部换行</td>
</tr>
<tr>
<td>@font-face </td>
<td>用于定义字体，字体来源可以是服务器<br />有多种字体类型可用，例如OpenType（.otf）、TrueType（.ttf），以及IE专用的Embedded OpenType（.eot）。下面是一些例子：<br />
<pre class="crayon-plain-tag">@font-face {
    font-family: Gmem;
    src: url("fonts/gmem.otf") format("opentype");
    font-weight: normal;
}
/* 用于IE的字体定义，不需要指定format */
@font-face {
    font-family: Gmem;
    /* local表示使用客户端本地字体，指定多个源时，前面的优先使用 */
    src: local(Gmem), url("fonts/gmem.eot");
    font-weight: normal;
}

/* 引用字体定义 */
p {
    font-family: Gmem;
}</pre></p>
<p>注意，可以为同一个font-family定义多个变体（font-weight、font-style不同） </p>
</td>
</tr>
<tr>
<td>font-size-adjust</td>
<td>可以在切换字体后，保持文字大小不变 </td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">盒（Box）样式</span></div>
<p>在CSS中，<pre class="crayon-plain-tag">display</pre> 属性用于定义盒的类型。 总体上盒分为<span style="background-color: #c0c0c0;">块（Block）</span>和<span style="background-color: #c0c0c0;">内联（Inline）</span>两种类型，如果设置为<span style="background-color: #c0c0c0;">none</span>，则元素不会显示且不占用文档空间。</p>
<div class="blog_h2"><span class="graybg">inline-block类型</span></div>
<p>在CSS2.1追加了一种<span style="background-color: #c0c0c0;">inline-block</span>类型。下面的例子说明这三者的区别：</p>
<div style="background-color: #eee; margin: 12px; border: 1px dashed #EEE;">绿色的部分<span style="display: inline; width: 100px; height: 100px; color: #075; background-color: #bfe;">display:inline</span>是一个inline元素</div>
<div style="background-color: #eee; margin: 12px; border: 1px dashed #EEE;">绿色的部分<span style="display: block; width: 100px; height: 100px; color: #075; background-color: #bfe;">display:block</span>是一个block元素</div>
<div style="background-color: #eee; margin: 12px; border: 1px dashed #EEE;">绿色的部分<span style="display: inline-block; width: 100px; height: 100px; color: #075; background-color: #bfe;">display:inline-block</span>是一个inline-block元素</div>
<p>上例中，灰色背景指示了父块元素的边界，绿色背景指示了设置不同Box类型的子元素的边界，子元素的宽高被设置为100像素。</p>
<p>可以看到，block、inline-block元素遵循宽高设置，而inline、inline-block元素则在“行内”显示。</p>
<p>使用inline-block可以<span style="background-color: #c0c0c0;">方便的实现并列显示</span>，避免使用float、position等复杂的布局方式。使用inline-block并排显示时，默认是底部对齐，可以修改<pre class="crayon-plain-tag">vertical-align</pre> 样式改变。</p>
<div class="blog_h2"><span class="graybg">其它盒类型</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">盒类型</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>list-item</td>
<td>可以把多个元素作为列表的条目显示，并且在元素前面添加列表的标记，标记样式可以用<pre class="crayon-plain-tag">list-style-type</pre> 设置</td>
</tr>
<tr>
<td>run-in</td>
<td>此类元素的后面如果还有block元素，那么run-in元素将被包含在block的内部</td>
</tr>
<tr>
<td>compact</td>
<td>此类元素的后面如果还有block元素，那么compact元素将放置在左边</td>
</tr>
<tr>
<td>flex</td>
<td>设置弹性盒子容器，子元素采取CSS3弹性盒子模型进行布局</td>
</tr>
<tr>
<td>inline-flex</td>
<td>设置弹性盒子容器，内联方式渲染</td>
</tr>
<tr>
<td>inline-table</td>
<td>类似于inline-block，允许一般情况下作为块元素的表格可以内联显示，让其前后环绕文字</td>
</tr>
<tr>
<td>table</td>
<td>此类型元素用于表格方式显示的父元素</td>
</tr>
<tr>
<td>table-row</td>
<td>用于表格中的一行，可以让任意元素实现tr的显示效果</td>
</tr>
<tr>
<td>table-cell</td>
<td>用于表格中的一个单元格，可以让任意元素实现td、th的显示效果</td>
</tr>
<tr>
<td>table-row-group</td>
<td>用于表格中主体行的父元素，可以让任意元素实现tbody的显示效果</td>
</tr>
<tr>
<td>table-header-group</td>
<td>用于表格中头部行的父元素，可以让任意元素实现thead的显示效果 </td>
</tr>
<tr>
<td>table-footer-group</td>
<td>用于表格中脚注行的父元素，可以让任意元素实现tfoot的显示效果  </td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">盒内容溢出</span></div>
<p>如果设置了盒的宽高，当某些内容无法容纳到盒中时，可以使用overflow属性决定溢出内容如何显示：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>overflow</td>
<td>盒中容不下时，如何显示内容：<br />hidden，溢出的内容将被隐藏<br />scroll，总是显示滚动条，溢出的内容可以滚动显示<br />auto，根据需要显示垂直、水平滚动条<br />visible，相当于不设置overflow属性，溢出内容照常显示到盒的外部</td>
</tr>
<tr>
<td>overflow-x</td>
<td rowspan="2">与overflow类似，但是分别设定水平、垂直方向的溢出处理</td>
</tr>
<tr>
<td>overflow-y</td>
</tr>
<tr>
<td>text-overflow</td>
<td>只用于盒中文本内容在水平方向溢出时：<br />ellipsis，显示省略号（...）代替溢出的文本</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">box-shadow</span></div>
<p>在CSS3中，该属性可以给盒子添加阴影。使用Safari浏览器时，需要写作<pre class="crayon-plain-tag">-webkit-box-shadow</pre> ；使用Firefox元素时，需要写作<pre class="crayon-plain-tag">-moz-box-shadow</pre> 。语法：<pre class="crayon-plain-tag">box-shadow: length length length color;</pre> ，和text-shadow类似，四个值分别是阴影的水平、垂直偏移量，模糊半径和颜色。</p>
<p>将模糊半径设置为0，则阴影没有渐变消失的效果；将偏移设置为0，则可以实现类似于外发光的效果。</p>
<div class="blog_h2"><span class="graybg">box-sizing</span></div>
<p>在CSS3中，该属性指定如何计算元素的宽高。我们知道width、height用于设置元素的宽高，而box-sizing可以指示此宽高是否包含元素的<span style="background-color: #c0c0c0;">内部补白、边框</span>的宽高。</p>
<p>此属性设置为<pre class="crayon-plain-tag">content-box</pre> ，则宽高不包含补白、边框；设置为<pre class="crayon-plain-tag">border-box</pre> ，则宽高包含补白、边框。</p>
<p>使用Safari、Firefox、IE时，此属性分别要写作<pre class="crayon-plain-tag">-webkit-box-sizing</pre> 、<pre class="crayon-plain-tag">-moz--box-sizing</pre> 、<pre class="crayon-plain-tag">-ms-box-sizing</pre> 。</p>
<div class="blog_h1"><span class="graybg">背景和边框样式</span></div>
<div class="blog_h2"><span class="graybg">新增背景属性</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>background-clip</td>
<td>指定背景的显示（剪切）范围：<br />border-box，背景显示范围包括边框<br />padding-box，不包括边框，但是包括内补白<br />content-box，不包括边框和内补白</td>
</tr>
<tr>
<td>background-origin</td>
<td>指定绘制背景图像时相对于什么位置来定位其绘制起点：<br />padding-box，相对于内补白框（即补白的最外部分）定位<br />border-box，相对于边框定位<br />content-box ，相对于内容框定位</td>
</tr>
<tr>
<td>background-size</td>
<td>指定背景图片的尺寸：<br />length，指定宽高像素，第一个值为宽，第二个值为高（默认auto）<br />percentage，指定宽高百分比，第一个值为宽，第二个值为高（默认auto）<br />cover，等比例放大图片，以便覆盖全部背景区域，可能有部分背景图片无法显示<br />contain，等比例放大，直到宽或高和背景区域的宽或高一致</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">新增边框属性</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>border-radius</td>
<td>绘制圆角边框，可以指定1-4个值，值可以是像素或者百分比，50%用于绘制圆形边框<br />包含几个变体，分别指定四个角的半径<br />border-top-left-radius<br />border-top-right-radius<br />border-bottom-right-radius<br />border-bottom-left-radius</td>
</tr>
<tr>
<td>border-image</td>
<td>使用图片来绘制边框</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">布局相关样式</span></div>
<div class="blog_h2"><span class="graybg">多列布局</span></div>
<p>使用column-count属性，可以把块中的文本均匀的划分到多列显示。可以同时使用column-gap、column-rule，来指定列之间的间隙大小、列分隔线的颜色举例：</p>
<pre class="crayon-plain-tag">.newspaper {
    /* 分为三列显示 */
    -webkit-column-count: 3; /* Chrome, Safari, Opera */
    -moz-column-count: 3; /* Firefox */
    column-count: 3;
    /* 列与列之间的间隙为40像素 */
    -webkit-column-gap: 40px; /* Chrome, Safari, Opera */
    -moz-column-gap: 40px; /* Firefox */
    column-gap: 40px;
    /* 列与列之间分隔线的样式 */
    -webkit-column-rule: 4px outset #ff00ff; /* Chrome, Safari, Opera */
    -moz-column-rule: 4px outset #ff00ff; /* Firefox */
    column-rule: 4px outset #ff00ff;
}</pre>
<div class="blog_h2"><span class="graybg">弹性盒子布局<br /></span></div>
<p>CSS3引入了新的布局模型：弹性盒子（Flexbox）。设置样式<pre class="crayon-plain-tag">display: flex</pre> 或者<pre class="crayon-plain-tag">display: inline-flex</pre> ，则元素成为弹性盒子容器，其直接子元素则自动成为弹性盒子条目。Chrome 29、IE 11、Firefox 28之后的浏览器完整的支持弹性盒子模型。</p>
<p>弹性盒子布局仅关注条目在容器中的排列，条目内部如何显示不受影响，此布局的特性和ExtJS的flex布局很类似。</p>
<div class="blog_h3"><span class="graybg">容器属性</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>display</td>
<td>设置为flex或者flex，启用弹性盒子布局模型。要支持webkit核心的浏览器，需要额外指定一次display属性：<br />
<pre class="crayon-plain-tag">.flex-container {
    display: -webkit-flex; 
    display: flex;
} </pre>
</td>
</tr>
<tr>
<td>flex-direction<br />-webkit-flex-direction</td>
<td>说明条目在容器中的排列方向：<br />row，默认值，从左到右<br />row-reverse，从右到左<br />column，从上到下<br />column-reverse，从下到上</td>
</tr>
<tr>
<td>justify-content<br />-webkit-justify-content</td>
<td>如果条目没有完全用掉容器main-axis上的空间，如何水平的对齐条目：<br />flex-start，默认值，条目集中在容器开始处<br />flex-end，条目集中在容器结束处<br />center，条目集中在容器中间<br />space-between，在条目之间保留空白<br />space-around，在条目开始、之间、结束保留空白</td>
</tr>
<tr>
<td>align-items<br />-webkit-align-items</td>
<td>如果条目没有完全用掉容器cross-axis上的空间，如何垂直的对齐条目：<br />stretch，默认值，伸展条目以充满空间<br />flex-start，条目被存放在容器顶部<br />flex-end，条目被存放在容器底部<br />center，条目被存放在容器中间（垂直）<br />baseline，条目被存放在容器的baseline</td>
</tr>
<tr>
<td>flex-wrap<br />-webkit-flex-wrap</td>
<td>指定条目是否可以换行（到下一个flex line），当一个flex line空间不够时：<br />nowrap，默认值，不换行<br />wrap，如果必要，换行<br />wrap-reverse 如果必要，按逆序换行（即新行插入到前面）</td>
</tr>
<tr>
<td>align-content<br />-webkit-align-content</td>
<td>与align-items类似，但是其对齐的是Flex line</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">条目属性</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>order<br />-webkit-order</td>
<td>相对于其它条目，在容器内的显示顺序</td>
</tr>
<tr>
<td>margin</td>
<td>设置为<pre class="crayon-plain-tag">margin: auto</pre> 吸收全部多余空间，可能把后续条目推向一边，还可以实现相对于容器完全居中（水平、垂直）</td>
</tr>
<tr>
<td>align-self<br />-webkit-align-self</td>
<td>覆盖容器的align-items属性</td>
</tr>
<tr>
<td>flex<br />-webkit-flex</td>
<td>指定占据容器宽/高的比值，整数，类似于ExtJS的flex属性</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">转换（Transform）</span></div>
<p>在CSS3中，利用转换功能，可以对文字或图像进行<span style="background-color: #c0c0c0;">旋转、缩放、倾斜、移动</span>处理。 要进行转换，可以指定CSS属性<pre class="crayon-plain-tag">transform</pre> ，其语法为：</p>
<pre class="crayon-plain-tag">/* 多个转换函数以空格分开，可同时使用 */
transform: none|transform-functions;</pre>
<p>Internet Explorer 10、Firefox、Opera 支持 transform 属性；Internet Explorer 9仅支持通过<pre class="crayon-plain-tag">-ms-transform</pre> 进行2D转换；Safari、Chrome支持通过<pre class="crayon-plain-tag">-webkit-transform</pre> 进行2D/3D转换。下面是一个旋转转换的例子：</p>
<pre class="crayon-plain-tag">div {
    transform: rotate(7deg);
    -ms-transform: rotate(7deg); /* IE 9 */
    -moz-transform: rotate(7deg); /* Firefox */
    -webkit-transform: rotate(7deg); /* Safari 和 Chrome */
    -o-transform: rotate(7deg); /* Opera */
}</pre>
<div class="blog_h2"><span class="graybg">转换函数</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 25%; text-align: center;">函数</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>none</td>
<td>不进行转换</td>
</tr>
<tr>
<td>matrix()</td>
<td>使用6个值进行2D矩阵转换</td>
</tr>
<tr>
<td>matrix3d()</td>
<td>使用16个值进行3D的4x4矩阵转换</td>
</tr>
<tr>
<td>translate(x,y)</td>
<td rowspan="5">进行移动转换，正数表示向右、下移动，负数表示向左、上移动</p>
<p>&nbsp;</p>
</td>
</tr>
<tr>
<td>translate3d(x,y,z)</td>
</tr>
<tr>
<td>translateX(x)</td>
</tr>
<tr>
<td>translateY(y)</td>
</tr>
<tr>
<td>translateZ(z)</td>
</tr>
<tr>
<td>scale(x,y)</td>
<td rowspan="5">进行缩放转换，x为0.5表示宽度减少为50%</td>
</tr>
<tr>
<td>scale3d(x,y,z)</td>
</tr>
<tr>
<td>scaleX(x)</td>
</tr>
<tr>
<td>scaleY(y)</td>
</tr>
<tr>
<td>scaleZ(z)</td>
</tr>
<tr>
<td>rotate(angle)</td>
<td rowspan="5">进行旋转转换，正数表示顺时针旋转，负数表示逆时针旋转<br />使用<pre class="crayon-plain-tag">transform-origin</pre> 可以定义旋转的基点，此属性语法：<br />
<pre class="crayon-plain-tag">/* x-axis可以取值left center right 数值 百分比*/
/* y-axis可以取值top center bottom 数值 百分比*/
/* z-axis可以取值 数值 */
transform-origin: x-axis y-axis z-axis;</pre></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</td>
</tr>
<tr>
<td>rotate3d(x,y,z,angle)</td>
</tr>
<tr>
<td>rotateX(angle)</td>
</tr>
<tr>
<td>rotateY(angle)</td>
</tr>
<tr>
<td>rotateZ(angle)</td>
</tr>
<tr>
<td>skew(x-angle,y-angle)</td>
<td rowspan="3">进行扭曲转换，angle用于把x轴或者y轴日绕原点旋转一定的角度</p>
<p>&nbsp;</p>
</td>
</tr>
<tr>
<td>skewX(angle)</td>
</tr>
<tr>
<td>skewY(angle)</td>
</tr>
<tr>
<td>perspective(n)</td>
<td>为3D转换元素定义透视视图</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">动画</span></div>
<p>通过CSS3动画，可以让页面上的文字、图像具有移动、淡入淡出、变形等动画效果。CSS3支持通过两种方式实现动画：</p>
<ol>
<li>Transitions：从一个CSS属性过渡到另外一个属性，形成动画效果</li>
<li>Animations：通过指定多个关键帧，实现更加复杂的动画效果</li>
</ol>
<div class="blog_h2"><span class="graybg">transition属性</span></div>
<p>该属性的语法如下：</p>
<pre class="crayon-plain-tag">/* property 需要实现过渡的CSS属性名称，该值对应属性transition-property */
/* duration 完成过渡需要的时间，s或者ms，该值对应属性transition-duration */
/* timing-function 规定速度曲线的函数，该值对应属性transition-timing-function */
/* delay 规定何时启动过渡效果，该值对应属性transition-delay */
transition: property duration timing-function delay;</pre>
<p>其中timing-function指定速度曲线函数，可选值包括：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">timing-function值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>linear</td>
<td>以匀速完成过渡，等价于cubic-bezier(0,0,1,1)</td>
</tr>
<tr>
<td>ease</td>
<td>以慢速开始，然后变快，最后慢速结束的过渡效果，等价于cubic-bezier(0.25,0.1,0.25,1)</td>
</tr>
<tr>
<td>ease-in</td>
<td>以慢速开始、逐渐变快的过渡效果，等价于 cubic-bezier(0.42,0,1,1)</td>
</tr>
<tr>
<td>ease-out</td>
<td>以快速开始、逐渐变慢的过渡效果，等价于cubic-bezier(0,0,0.58,1)</td>
</tr>
<tr>
<td>ease-in-out</td>
<td>以慢速开始、逐渐变快、再逐渐变慢并结束的过渡效果，等价于cubic-bezier(0.42,0,0.58,1)</td>
</tr>
<tr>
<td>cubic-bezier(n,n,n,n)</td>
<td>自定义 cubic-bezier函数</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">Animation功能</span></div>
<p>要使用此功能，首先要定义一种特殊的CSS规则，语法如下：</p>
<pre class="crayon-plain-tag">@keyframes animation-name {
    from | to | percent {
        css-property : value;
        ... /*可以指定多个属性*/
    }
    ... /*可以指定多个帧*/
}
/* Safari 和 Chrome 使用下面的方式定义 */
@-webkit-keyframes {}</pre>
<p>然后，可以在某个样式规则中引用已经定义的动画：</p>
<pre class="crayon-plain-tag">.rule {
    /* 已定义的动画（@keyframes）的名称 */
    animation-name: animation-name; /* Safari 和 Chrome */
    webkit-animation-name: animation-name;
    /* 动画完成需要的时间，0意味着没有动画效果 */
    animation-duration: 5s;
    -webkit-animation-duration:2s; /* Safari 和 Chrome */
    /* 动画重复的次数，infinite则无限播放 */
    animation-iteration-count: 10;
    -webkit-animation-iteration-count: 10; /* Safari 和 Chrome */
    /* 当动画不在播放时（已经结束，或者延迟而尚未开始），如何显示目标元素 */
    /* none 默认值，在开始前、结束后，动画不会在目标上应用任何样式 */
    /* forwards 在动画结束后，将最后一帧的样式应用给元素 */
    /* backwards 在延迟动画开始前，将第一帧的样式应用给元素 */
    /* both 同时应用forwards和backwards*/
    animation-fill-mode: both;
    -webkit-animation-fill-mode: both;/* Safari 和 Chrome */
}</pre>
<div class="blog_h2"><span class="graybg">示例</span></div>
<p>最简单的例子，仅仅规定开始、结束两帧：</p>
<pre class="crayon-plain-tag">/* 移动效果 */
@keyframes slide {
    /*起始帧*/
    from {
        left: 0;
        top: 0;
    }
    /*结束帧*/
    to {
        left: 100px;
        top: 100px;
    }

}</pre>
<p> 指定多个关键帧的例子：</p>
<pre class="crayon-plain-tag">/* 摇晃效果 */
@keyframes wobble {
    /*动画开始时*/
    0% {
        left: 100px;
    }
    /*动画时间消逝了40%时*/
    40% {
        left: 150px;
    }
    /*动画时间消逝了60%时*/
    60% {
        left: 75px;
    }
    /*动画结束时*/
    100% {
        left: 100px;
    }
}</pre>
<p>进一步，还可以为每一个关键帧指定函数：</p>
<pre class="crayon-plain-tag">/* 弹跳效果 */
@keyframes bounce {
    from {
        top: 100px;
        animation-timing-function: ease-out;
    }
    25% {
        top: 50px;
        animation-timing-function: ease-in;
    }
    50% {
        top: 100px;
        animation-timing-function: ease-out;
    }
    75% {
        top: 75px;
        animation-timing-function: ease-in;
    }
    to {
        top: 100px;
    }
}</pre>
<div class="blog_h1"><span class="graybg">媒体查询（@media）</span></div>
<p>该特性用于针对特定媒体来改变样式，语法如下：</p>
<pre class="crayon-plain-tag">@media not|only mediatype and (media feature) {
    /* CSS样式规则 */
}

/* 示例 */
@media screen and (min-width: 480px) {
    body {
        background-color: lightgreen;
    }
}</pre>
<p>媒体类型包括：</p>
<table class=" full-width fixed-word-wrap">
<tbody>
<tr>
<td style="width: 20%;">all</td>
<td>匹配所有类型的媒体</td>
</tr>
<tr>
<td>print</td>
<td>匹配打印机</td>
</tr>
<tr>
<td>screen</td>
<td>匹配各种屏幕，包括手机、台式机、平板</td>
</tr>
<tr>
<td>speech</td>
<td>供屏幕阅读器读取的媒体</td>
</tr>
</tbody>
</table>
<p>媒体特性包括纵横比、颜色深度、设备尺寸、分辨率等等，详见：<a href="http://www.w3schools.com/cssref/css3_pr_mediaquery.asp">W3schools</a>。</p>
<p>使用媒体查询，可以很方便的实现“响应式布局”。以本网站的首页为例，当浏览器宽度变窄后，可以自动由三栏切换为单栏显示。Bootstrap是一个流行的可以实现响应式布局的UI框架。</p>
<div class="blog_h1"><span class="graybg">其它CSS3新特性</span></div>
<div class="blog_h2"><span class="graybg">颜色类属性值</span></div>
<p>在以前，CSS仅支持RGB颜色，并且只能通过<pre class="crayon-plain-tag">opacity</pre> 属性设置元素的透明度。CSS3新增加了RGBA、HSL、HSLA三种颜色类型。</p>
<p>利用RGBA、HSLA，可以基于alpha通道来设置透明度，其优势是可以针对背景、文字<span style="background-color: #c0c0c0;">分别设置透明度</span>，而opacity则只能整体上设置。下面是一个例子：</p>
<pre class="crayon-plain-tag">/* 四个数值分别为红、绿、蓝、透明度，完全透明为0，完全不透明为1 */
background-color: rgba(255, 0, 0, 0.5);</pre>
<div class="blog_h3"><span class="graybg">transparent</span></div>
<p>CSS3中，可以对一切颜色属性（color、border-color、background-color）设置特殊值 <pre class="crayon-plain-tag">transparent</pre> ，相当于alpha为0.</p>
<div class="blog_h2"><span class="graybg">resize属性</span></div>
<p>该属性允许用户通过拖拽方式来改变元素的尺寸，支持的值包括none、both、horizontal、vertical、inherit。 inherit表示继承父元素的设置。</p>
<div class="blog_h2"><span class="graybg">initial值</span></div>
<p>这一值用于取消对某一属性的样式设置，恢复其默认值。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/css3-study-note">CSS3学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/css3-study-note/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS知识集锦</title>
		<link>https://blog.gmem.cc/css-faq</link>
		<comments>https://blog.gmem.cc/css-faq#comments</comments>
		<pubDate>Sat, 05 Apr 2008 14:16:40 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[FAQ]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=870</guid>
		<description><![CDATA[<p>基本概念 CSS规则中URL相对于当前CSS文件，于引用CSS的网页的URL无关 CSS为每个HTML元素生成一个盒（Box），在其中包含元素的内容 CSS注释语法：[crayon-69ec9b49e3a8d748562460-i/]  [crayon-69ec9b49e3a91240946016-i/] 指令，用于引入外部样式表文件 URL格式[crayon-69ec9b49e3a93237348099-i/] ，url后面不得有空格 CSS值关键字： [crayon-69ec9b49e3a95678402725-i/] 表示不设置此属性 [crayon-69ec9b49e3a97648497012-i/] 表示从父元素继承此属性 [crayon-69ec9b49e3a99065871774-i/] 从CSS3开始支持，表示恢复为默认值 根元素：文档树顶端的元素，即html元素 正常流：指从左向右，从上到下的显示方式。要使一个元素脱离正常流，可以使之成为浮动元素或者定位元素 非替换元素：元素本身的内容包含在文档中，大部分元素都是非替换元素 替换元素（replaced element）：元素本身仅仅是一个占位符，需要根据其标签、属性的不同来决定显示什么，例如input、img、textarea、select、object 块级元素：类似p、div这样的元素，在正常流中，这类元素的元素框前、后会出现“换行”，兄弟块元素会垂直摆放。设置[crayon-69ec9b49e3a9c651618878-i/] 可以让任何元素成为块级元素，生成块级框 行内元素：也叫内联元素，类似span、strong，这类元素的元素框前后不会出现“换行”。设置[crayon-69ec9b49e3a9e464528216-i/] 可以让任何元素成为行内元素，生成行内框 匿名文本：未包含在任何行内元素中的文本 em框：即字符框，实际的字形可以比em框告或者矮 内容区：行内元素的内容区类似于块元素的内容框。非替换元素的内容区可以是各em框连接在一起构成的区域 行间距（leading）：只适用于非替换元素，line-heiht与font-size的差值，等分为上下两部分，分别称为半间距（half-leading） 行内框：对于非替换元素，行内框等于line-height；对于替换元素，行内框等于内容区高度，因为行间距不应用到替换元素 <a class="read-more" href="https://blog.gmem.cc/css-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/css-faq">CSS知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">基本概念</span></div>
<ol>
<li>CSS规则中<span style="background-color: #c0c0c0;">URL相对于当前CSS文件</span>，于引用CSS的网页的URL无关</li>
<li>CSS为每个HTML元素生成一个盒（Box），在其中包含元素的内容</li>
<li>CSS注释语法：<pre class="crayon-plain-tag">/* 注释内容，可以多行 */</pre> </li>
<li><pre class="crayon-plain-tag">@import</pre> 指令，用于引入外部样式表文件</li>
<li>URL格式<pre class="crayon-plain-tag">url(protocol://server/pathname)</pre> ，url后面不得有空格</li>
<li>CSS值关键字：
<ol>
<li><pre class="crayon-plain-tag">none</pre> 表示不设置此属性</li>
<li><pre class="crayon-plain-tag">inherit</pre> 表示从父元素继承此属性</li>
<li><pre class="crayon-plain-tag">initial</pre> 从CSS3开始支持，表示恢复为默认值</li>
</ol>
</li>
<li>根元素：文档树顶端的元素，即html元素</li>
<li>正常流：指从左向右，从上到下的显示方式。要使一个元素脱离正常流，可以使之成为浮动元素或者定位元素</li>
<li>非替换元素：元素本身的内容包含在文档中，大部分元素都是非替换元素</li>
<li>替换元素（replaced element）：元素本身仅仅是一个占位符，需要根据其标签、属性的不同来决定显示什么，例如input、img、textarea、select、object</li>
<li>块级元素：类似p、div这样的元素，在<span style="background-color: #c0c0c0;">正常流中</span>，这类元素的<span style="background-color: #c0c0c0;">元素框前、后会出现“换行”</span>，兄弟块元素会垂直摆放。设置<pre class="crayon-plain-tag">display:block</pre> 可以让任何元素成为块级元素，生成块级框</li>
<li>行内元素：也叫内联元素，类似span、strong，这类元素的元素框前后不会出现“换行”。设置<pre class="crayon-plain-tag">display:inline</pre> 可以让任何元素成为行内元素，生成行内框</li>
<li>匿名文本：未包含在任何行内元素中的文本</li>
<li>em框：即字符框，实际的字形可以比em框告或者矮</li>
<li>内容区：行内元素的内容区类似于块元素的内容框。非替换元素的内容区可以是<span style="background-color: #c0c0c0;">各em框连接在一起</span>构成的区域</li>
<li>行间距（leading）：只适用于非替换元素，line-heiht与font-size的差值，等分为上下两部分，分别称为半间距（half-leading）</li>
<li>行内框：对于非替换元素，行内框等于line-height；对于替换元素，行内框等于内容区高度，因为<span style="background-color: #c0c0c0;">行间距不应用到替换元素</span></li>
<li>行框：包含了该行所有行内框的最高最低点的最小框</li>
</ol>
<div class="blog_h1"><span class="graybg">CSS块布局原理</span></div>
<div class="blog_h2"><span class="graybg">元素框</span></div>
<p>CSS假定每个元素都会生成一个或者多个矩形框，称为<span style="background-color: #c0c0c0;">元素框（element boxes）</span>。元素框的最中央是<span style="background-color: #c0c0c0;">内容区（content area）</span>，向外依次是可选的<span style="background-color: #c0c0c0;">内边距（paddings）</span>、<span style="background-color: #c0c0c0;">边框（borders）</span>、<span style="background-color: #c0c0c0;">外边距（margins）</span>。外边距通常是透明的，可以看到父元素的背景，外边距甚至可以是负数。下图示意了CSS的元素框模型：</p>
<p><img class="aligncenter  wp-image-11366" src="https://blog.gmem.cc/wp-content/uploads/2008/04/css-frame.png" alt="css-frame" width="75%" /></p>
<div class="blog_h2"><span class="graybg">包含块(Containing Block)</span></div>
<p>每个元素都<span style="background-color: #c0c0c0;">相对于它的包含块</span>布局，包含块是元素的布局上下文。</p>
<p>CSS定义了一系列规则，来确定元素的包含块。对于文本来说，其最近的块祖先框、表单元格、行内块祖先框的<span style="background-color: #c0c0c0;">内容框边界</span>构成它的包含块，例如：</p>
<pre class="crayon-plain-tag">&lt;body&gt;
&lt;!-- div的包含块是body，因此div的布局依赖于body的布局 --&gt;
&lt;div&gt;
    &lt;!-- p的包含块是div，因此p的布局依赖于div的布局 --&gt;
    &lt;p&gt;This is a paragraph.&lt;/p&gt;
&lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h2"><span class="graybg">块级元素布局</span></div>
<p>如何在水平、垂直方向决定块元素的大小和位置，很不相同，这使得块元素的行为有时候显得诡异。</p>
<div class="blog_h3"><span class="graybg">水平方向布局</span></div>
<p><span style="background-color: #c0c0c0;">width指定的是内容区的宽度</span>，而不是整个元素框。后者的宽度还包括内外边距、边框。</p>
<p>水平方向所有<span style="background-color: #c0c0c0;">兄弟元素的元素框宽度之和</span>，总是等于<span style="background-color: #c0c0c0;">父元素的内容区宽度（width）</span>。以下面的代码为例：</p>
<pre class="crayon-plain-tag">&lt;div style="background-color: #DFE; border: 2px dotted #BDC;"&gt;
    &lt;div style="width: 100px;height:25px;background-color: #FEE; border: 2px dotted #ECC;"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<p>虽然内部红色的div貌似只有100像素的宽度，实质上它的元素框宽度几乎等于绿色部分，右侧大片空白（绿色）都属于红色div的右外边距（margin-right）：</p>
<div style="background-color: #dfe; border: 2px dotted #BDC;">
<div style="width: 100px; height: 25px; background-color: #fee; border: 2px dotted #ECC;"> </div>
</div>
<p>和水平方向布局有关的CSS属性有7个，它们和包含块宽度有如下关系（即使使用负外边距也满足）：</p>
<p style="padding-left: 60px;">包含块的宽度 = 左外边距宽度 + 左边框宽度 + 左内边距宽度 + width  + 右内边距宽度 + 右边框宽度 + 右外边距宽度</p>
<p>包含块的宽度往往就是父元素的width值。</p>
<p>这7个属性中，wdith、margin-left、margin-right可以设置为auto，其它4个必须是特定的值。当：</p>
<ol>
<li>设置某单个值为auto，则auto属性根据其余两个属性自动计算——auto可用于“实际值”与“总和值”的差距</li>
<li>设置margin-left、margin-right为auto，可以使元素相对于父元素水平居中</li>
<li>如果三个值都设置为auto（默认值），则margin变为0，宽度尽可能大</li>
<li>如果三个值都设置为非auto，那么margin-right强制变成auto</li>
</ol>
<p>注意：父子元素在<span style="background-color: #c0c0c0;">水平方向的外边距不会合并</span>，因此元素的外边距（内边距、边框）可能导致子元素的偏移</p>
<div class="blog_h3"><span class="graybg">替换元素</span></div>
<p>块级<span style="background-color: #c0c0c0;">替换元素</span>的水平布局，与非替换元素（上文）类似，但是有一个附加的规则：如果width设置为auto，则元素的宽度是<span style="background-color: #c0c0c0;">内容的固有宽度</span>：</p>
<pre class="crayon-plain-tag">&lt;img src="gmem.png" style="width: auto;"/&gt; &lt;!-- 如果图片大小是100像素，那么实际渲染为100像素--&gt;</pre>
<p>如果为替换元素设置width，那么其<span style="background-color: #c0c0c0;">height会成比例的自动变化</span>，除非明确设置。 </p>
<div class="blog_h3"><span class="graybg">垂直方向布局</span></div>
<p>在垂直方向，一个块级元素的<span style="background-color: #c0c0c0;">默认高度由其内容决定</span>（相比之下，默认宽度为包含块宽度）。高度还会受到宽度影响，宽度越窄，则高度越高，以便容纳全部内容。</p>
<p>可以对任何块级元素显式设置高度：</p>
<ol>
<li>如果高度设置的大于内容固有高度，效果上好像多出额外的下内边距</li>
<li>如果高度设置的小与内容固有高度，可能导致出现滚动条，或者溢出内容剪切</li>
</ol>
<p>和垂直方向布局相关的CSS属性也有7个：上外边距高度 、上边框高度、上内边距高度、height、下内边距高度、下边框高度、下外边距高度。其中height、margin-top、margin-bottom可以设置为auto，其它4个必须是特定的值。当：</p>
<ol>
<li>margin-top、margin-bottom设置为auto，相对于设置为0</li>
<li>正常块级元素的height设置为auto，且仅有内联子元素，那么元素高度恰好能容纳内联内容</li>
<li>正常块级元素的height设置为auto，且仅有块级子元素，那么元素的高度是最顶部子元素的上外边界到最底部下外边界的距离</li>
<li>设置为百分比时，如果<span style="background-color: #c0c0c0;">包含块的高度没有显式设置</span>，那么<span style="background-color: #c0c0c0;">设置任何百分比的高度都等价于auto</span></li>
</ol>
<div class="blog_h3"><span class="graybg">相邻垂直外边距的合并</span></div>
<p>垂直方向布局的另外一个特点是相邻外边距的合并（重叠）——前一个元素的下边距、后一个元素的上边距，<span style="background-color: #c0c0c0;">取其大者</span>作为两者间的边距。例如：</p>
<pre class="crayon-plain-tag">&lt;style&gt;
    li{margin-top:20px;margin-bottom: 20px;border:1px dashed #AED;}
&lt;/style&gt;
&lt;ol&gt;
    &lt;li&gt;line1&lt;/li&gt;
    &lt;li&gt;line2&lt;/li&gt;
    &lt;li&gt;line3&lt;/li&gt;
&lt;/ol&gt;</pre>
<p>你会注意到列表条目之间的距离是20像素，而不是40像素。 </p>
<div class="blog_h2"><span class="graybg">行内元素布局</span></div>
<p>行内元素的布局没有块元素那么直接——生成一个简单的矩形框。当行内文本较多，形成多行时，各文本行的边框默认相互重叠（上一行的下边框，位于下一行的上边框的下面，这是因为边框画在行外部的一个像素上）。</p>
<p>对于行内元素：</p>
<ol>
<li>行内元素的背景默认应用到内容区和内边距</li>
<li>行内元素的边框包围内容区和内边距</li>
<li><span style="background-color: #c0c0c0;">非替换元素</span>的内外边距、边框<span style="background-color: #c0c0c0;">不会</span>影响元素行内框的高度，即不会导致line-height变大</li>
<li><span style="background-color: #c0c0c0;">替换元素</span>的外边距、边框<span style="background-color: #c0c0c0;">会</span>影响行内框的高度，也可能进而影响行框的高度</li>
<li>各行内框，在行中依据自己的<pre class="crayon-plain-tag">vertical-align</pre> 属性，在垂直方向对齐</li>
</ol>
<p>行的高度由其<span style="background-color: #c0c0c0;">组成元素、文本节点</span>确定。<pre class="crayon-plain-tag">line-height</pre> 会显著的影响行内元素的显示，但是<span style="background-color: #c0c0c0;">它只会影响行内元素</span>和匿名文本，不会直接影响块级元素，为块级元素色和指line-height，只会<span style="background-color: #c0c0c0;">应用到它内部的</span>inline内容，相当于声明一个<span style="background-color: #c0c0c0;">最小</span>的行框高度：</p>
<pre class="crayon-plain-tag">&lt;!-- 由于下面的块元素没有任何内容，因此设置line-height为任意值，都不会影响行框的创建 --&gt;
&lt;div style="line-height:48px;border :1px dashed #A33;"&gt;&lt;/div&gt;
&lt;!-- div的高度为0 --&gt;</pre>
<p>注意：块元素中的<span style="background-color: #c0c0c0;">各行文本都是行内元素</span>。</p>
<div class="blog_h3"><span class="graybg">行框的构造步骤</span></div>
<ol>
<li>按下列步骤确定行内各元素的行内框高度：
<ol>
<li>得到非替换元素、匿名文本的font-size和line-height值，求差后等分，应用到内容区上下</li>
<li>得到各替换元素的height、margin-top、margin-bottom、padding-top、padding-bottom、border-top-height、border-bottom-height，将其加在一起</li>
</ol>
</li>
<li>对于各内容区，确定其<span style="background-color: #c0c0c0;">在整行基线的上下方分别超出多少</span>。需要获得各元素、匿名文本的基线位置，然后得到行本书基线的位置，最后对齐之；对于替换元素，将其底部放在整行的基线上</li>
<li>对于指定了vertical-align的元素，确定其垂直偏移量，即元素的行内框需要上移/下移多远</li>
<li>此时，每个行内框的大小位置已经确定，行框的高度自然确定</li>
</ol>
<div class="blog_h3"><span class="graybg">行内非替换元素</span></div>
<p>如果行中只包含非替换元素或匿名文本，则<span style="background-color: #c0c0c0;">font-size确定内容区的高度</span>，亦即每个字符的<span style="background-color: #c0c0c0;">em框高度都等于font-size</span>。假设font-size为14px，而line-height为20px（行内框高度），那么这两者之间的差值6px会被UA等分为两个3px，<span style="background-color: #c0c0c0;">分别应用到内容区的顶部和底部</span>：<a href="https://blog.gmem.cc/wp-content/uploads/2008/04/inline-el.png"><img class="aligncenter  wp-image-11395" src="https://blog.gmem.cc/wp-content/uploads/2008/04/inline-el.png" alt="inline-el" width="683" height="147" /></a></p>
<p>&nbsp;</p>
<p>需要注意的是，font-size可能大于line-height，这时行内框的高度比内容区更小，这是合法的。 </p>
<p>行内框大小一致，并不能让文本整齐的排列，因为文本默认是<span style="background-color: #c0c0c0;">按照基线对齐</span>的：</p>
<p><img class="aligncenter  wp-image-11397" src="https://blog.gmem.cc/wp-content/uploads/2008/04/inline-el-baseline.png" alt="inline-el-baseline" width="658" height="112" /></p>
<div class="blog_h3"><span class="graybg">垂直对齐</span></div>
<p>修改垂直对齐属性，可能导致行内框的抬高或者降低，进而影响行框的高度。下面的例子示例了垂直对齐不同取值下的效果：</p>
<pre class="crayon-plain-tag">&lt;div style="border:1px dotted #CCC;width: 95%;margin: auto;line-height: 100px;height:100px;font-size:25px;"&gt;
    &lt;!-- 行内块元素，设置高度为容器1/2--&gt;
    &lt;span style="background-color: #A55;display: inline-block;height:50px;vertical-align: top"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #A55;display: inline-block;height:50px;vertical-align: middle"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #A55;display: inline-block;height:50px;vertical-align: bottom"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #A55;display: inline-block;height:50px;vertical-align: baseline"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;!-- 行内元素，行内框与容器高度一致--&gt;
    &lt;span style="background-color: #55A;vertical-align: top"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #55A;vertical-align: middle"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #55A;vertical-align: bottom"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #55A;vertical-align: baseline"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;!-- 行内元素，行内框与内容区高度一致 --&gt;
    &lt;span style="background-color: #5A5;vertical-align: top;line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #5A5;vertical-align: middle;line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #5A5;vertical-align: bottom;line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #5A5;vertical-align: baseline;line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;!-- 行内元素，行内框与内容区高度一致，数值的垂直偏移--&gt;
    &lt;span style="background-color: #555;vertical-align: 25px;line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;
    &lt;span style="background-color: #555;vertical-align: -25px;line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;
&lt;/div&gt; </pre>
<p><img class="aligncenter size-full wp-image-11404" src="https://blog.gmem.cc/wp-content/uploads/2008/04/vertical-align.png" alt="vertical-align" width="566" height="112" /></p>
<div class="blog_h3"><span class="graybg">关于基线</span></div>
<p>讨论行内元素的垂直对齐时，往往需要关注基线，默认的，行内元素基于基线对齐。</p>
<p><span style="background-color: #c0c0c0;">基线</span>相对于em框的位置，取决于字体，这一信息是<span style="background-color: #c0c0c0;">内置在字体</span>中的。</p>
<div class="blog_h3"><span class="graybg">行内替换元素</span></div>
<p>一般认为行内替换元素具有固有的宽高，替换元素可能导致行框变高，但是它不会改变任何元素（包括它自己）的line-height。</p>
<p>行内替换元素的line-height存在的意义是，作为垂直对齐时（例如设置为百分比）的参考值。</p>
<p>默认的，行内替换元素按基线对齐，即它的底端<span style="background-color: #c0c0c0;">（下外边距的边界）与行基线对齐</span>。</p>
<div class="blog_h2"><span class="graybg">行内块元素（inline-block）</span></div>
<p>这是CSS2.1新增的，其效果类似于图片放在文本行中，即它是<span style="background-color: #c0c0c0;">作为替换元素进行布局</span>的。</p>
<p>你可以设置行内块元素的宽高，就好像设置行内替换元素、块元素的宽高一样。</p>
<div class="blog_h1">浮动和定位</div>
<div class="blog_h2"><span class="graybg">浮动</span></div>
<p>使用CSS属性<pre class="crayon-plain-tag">float</pre> ，可以实现任何元素的浮动。当一个元素浮动时，其它内容会<span style="background-color: #c0c0c0;">环绕</span>该元素，浮动元素的外边距不会被合并。如果要浮动一个非替换元素，则必须为该元素声明一个width，否则其宽度趋于0。</p>
<p>float属性可以取值left、right、none，最后一个值表示不浮动（默认值）。</p>
<p>浮动元素的包含块是最近的块级祖先元素。任何浮动元素都会生成一个块级框，不需要声明display:block，即使它是inline元素。</p>
<div class="blog_h3"><span class="graybg">清除</span></div>
<p><pre class="crayon-plain-tag">clear</pre> 用于清除元素前后的浮动元素。取值left，则元素左侧不会出现浮动元素；取值right，则元素右侧不会出现浮动元素；取值both，则元素两侧都不会出现浮动元素。</p>
<div class="blog_h2"><span class="graybg">定位</span></div>
<p>利用定位，可以准确的定义元素框相对于其正常位置/父元素/视窗应该出现在哪里。CSS使用属性<pre class="crayon-plain-tag">position</pre> 来进行定位，支持以下取值：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">position</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>static</td>
<td>元素框正常生成。块级元素生成一个矩形框，作为文档流的一部分；行内元素生成一个或者多个行框，置于其父元素中</td>
</tr>
<tr>
<td>relative</td>
<td>元素框偏移某个距离。 元素保<span style="background-color: #c0c0c0;">持其未定位前的形状</span>，其<span style="background-color: #c0c0c0;">原本占据的空间</span>仍然保留</td>
</tr>
<tr>
<td>absolute</td>
<td>元素框从文档流中完全删除，相对于其包含块定位。包含块可以是文档中另外一个元素或者是初始包含块（即根元素的包含块）。元素原本在文档中占据的空间会关闭，就好像没有这个元素一样。元素定位后总是生成一个块级框</td>
</tr>
<tr>
<td>fixed</td>
<td>类似于absolute，只是包含块为视窗本身</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">如何确定包含块</span></div>
<p>确定一个定位元素的<span style="background-color: #c0c0c0;">包含块（定位上下文）</span>的算法较为复杂：</p>
<ol>
<li>根元素的包含块由UA建立，在HTML中是html元素。在大部分浏览器中初始包含块是视窗大小的矩形</li>
<li>对于一个非根元素，如果其position取值<span style="background-color: #c0c0c0;">relative/static</span>，则其包含块由<span style="background-color: #c0c0c0;">最近的块级框、表单元格或者行内祖先框的内容边界</span>构成</li>
<li>对于一个非根元素，如果其position取值<span style="background-color: #c0c0c0;">absolute</span>，则其包含块取决于<span style="background-color: #c0c0c0;">最近的position不为static的祖先元素</span>：
<ol>
<li>如果此祖先是块级元素，包含块设置为祖先的内边距边界</li>
<li>如果此祖先是行内元素，包含块设置为祖先的内容边界</li>
<li>如果没有祖先，则包含块设置为初始包含块</li>
</ol>
</li>
</ol>
<div class="blog_h3"><span class="graybg">偏移属性</span></div>
<p>top、right、bottom、left这四个属性成为偏移属性，其中top/bottom说明元素相对于包含块顶边/底边的偏移，left/right则说明元素相对于包含块左边/右边的偏移。</p>
<div class="blog_h3"><span class="graybg">Z轴方向的放置</span></div>
<p><pre class="crayon-plain-tag">z-index</pre> 来限定定位元素在Z轴方向的摆放顺序，该值越大，则离读者越近。所有整数都可以作为z-index的值。</p>
<div class="blog_h1"><span class="graybg">字体和单位</span></div>
<div class="blog_h2"><span class="graybg">字体</span></div>
<p>在CSS中设置字体类型<pre class="crayon-plain-tag">font-family</pre> 时，既可以指定具体的字体名称，也可以指定<span style="background-color: #c0c0c0;">通用字体系列</span>。</p>
<div class="blog_h3"><span class="graybg">通用字体系列</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">字体系列</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>Serif</td>
<td>衬线字体，在字的笔划开始及结束的地方有<span style="background-color: #c0c0c0;">额外的装饰</span>，而且<span style="background-color: #c0c0c0;">笔划的粗细</span>会因直横的不同而有不同。宋体就是一种衬线字体<br />衬线字体易读性佳，长时间阅读不易疲劳，适用于大篇幅的正文内容</td>
</tr>
<tr>
<td>Sans-serif</td>
<td>无衬线字体，Sans是法语“无”的意思。此类字体缺少额外装饰，且必要粗细大致差不多。黑体就是一种非衬线字体<br />衬线字体比较醒目，适用于标题、表头等，但不需要长时间盯着阅读</td>
</tr>
<tr>
<td>Monospace</td>
<td>等宽字体，所有字符的宽度一致<br />适用于编程时的代码、字符终端</td>
</tr>
<tr>
<td>Cursive</td>
<td>试图模仿人的手写体</td>
</tr>
<tr>
<td>Fantasy</td>
<td>无法明确的归类</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">单位</span></div>
<div class="blog_h3"><span class="graybg">角度单位</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">单位</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>deg</td>
<td>度，一个圆周为360deg</td>
</tr>
<tr>
<td>grad</td>
<td>梯度，一个圆周为400grad</td>
</tr>
<tr>
<td>rad</td>
<td>弧度，一个圆周为2 * pi rad</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">长度单位</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 26px; text-align: center;"> </td>
<td style="width: 10%; text-align: center;">单位</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="5"><strong>绝对长度</strong></td>
<td>in</td>
<td>英寸，只有英美使用的单位</td>
</tr>
<tr>
<td>cm</td>
<td>厘米，1in = 2.52cm，1cm = 0.394in</td>
</tr>
<tr>
<td>mm</td>
<td>毫米，1cm = 10mm</td>
</tr>
<tr>
<td>pt</td>
<td>点，标准印刷度量单位，以往 1in = 72pt</td>
</tr>
<tr>
<td>pc</td>
<td>派卡，也是印刷业的度量单位，1pc = 12pt，6pc = 1in</td>
</tr>
<tr>
<td rowspan="6"><strong>相对长度</strong></td>
<td>em</td>
<td>em-height，等于给定元素的font-size值</td>
</tr>
<tr>
<td>ex</td>
<td>x-height， 所用字体中，小写x的高度</td>
</tr>
<tr>
<td>px</td>
<td>像素，对应屏幕上的一个点 <br />CSS规范建议，如果显示器的ppi（点/英寸）与96ppi差距很大，应当基于90ppi，自动缩放CSS中指定的px值。这样，在那些极高分辨率的显示器上，可以不至于无法看清文字</td>
</tr>
<tr>
<td>vw</td>
<td>相对于视窗的宽度，视窗本身宽度为100vw</td>
</tr>
<tr>
<td>vh</td>
<td>相对于视窗的高度，视窗本身高度为100vh</td>
</tr>
<tr>
<td>vmin<br />vmax</td>
<td>相对于视窗的宽度或高度，取决于哪个值更小（vmin）或者更大<br />IE9中使用vm代替vmin，不支持vmax</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">动态计算calc</span></div>
<p>CSS函数<pre class="crayon-plain-tag">calc()</pre>可以用于动态的计算一个值，可以用在任何需要&lt;length&gt;、&lt;frequency&gt;, &lt;angle&gt;、&lt;time&gt;、&lt;number&gt;、&lt;integer&gt;的地方。calc函数的参数可以是另外一个calc调用。包括IE10+在内的现代浏览器对此函数具有较好的支持。示例：</p>
<pre class="crayon-plain-tag">/* 充满可用宽度 - 80像素 */
width: calc(100% - 80px); 
/* 高度比视窗小80像素 */
height: calc(100vh - 80px);</pre>
<div class="blog_h1">常用CSS属性</div>
<div class="blog_h2"><span class="graybg">文本属性</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>text-indent</td>
<td>让第一行的文本向前后缩进一定的距离，例如：<br />
<pre class="crayon-plain-tag">/* 缩进2字符 */
text-indent: 2em;</pre></p>
<p> 注意，即使插入<pre class="crayon-plain-tag">&lt;br&gt;</pre> ，后续内容也不会自动获得缩进</p>
</td>
</tr>
<tr>
<td>text-align</td>
<td>水平对齐，导致块元素中文本对齐方向改变</td>
</tr>
<tr>
<td>vertical-align</td>
<td>垂直对齐，只应用于<span style="background-color: #c0c0c0;">行内元素和替换元素</span>，此属性不得继承：<br />baseline，默认值，元素的基线与父元素的基线对齐。对于img之类没有基线的元素，其底端与父元素的基线对齐<br />top，元素行内框与行框顶端对齐<br />bottom，元素行内框的底端与行框底端对齐<br />text-top，元素行内框顶端与父元素内容区顶端对齐<br />text-bottom，元素行内框的底端与父元素内容区底端对齐<br />middle，将元素行内框垂直中点与父元素基线上0.5ex处对齐<br />super，显示为上标，将元素的内容区与行内框上移，上移多少由用户代理确定<br />sub，显示为下标，将元素的内容区与行内框下移，下移多少由用户代理确定<br />百分比，相对于line-height上移或者下移一段距离</td>
</tr>
<tr>
<td>line-height</td>
<td>设置文本行基线（baseline）之间的（最小）距离<br />line-height - font-size得到的值就是行间距，行间距的1/2分别应用在内容区的顶部、底部，<span style="background-color: #c0c0c0;">文本默认情况下文本位于行内容区的中部</span></td>
</tr>
<tr>
<td>word-spacing</td>
<td>可以增加单词之间的距离</td>
</tr>
<tr>
<td>letter-spacing</td>
<td>可以增加字母之间的距离</td>
</tr>
<tr>
<td>text-transform</td>
<td>处理文本大小写</td>
</tr>
<tr>
<td>text-decoration</td>
<td>实现下划线、上划线、贯穿线、闪烁等效果</td>
</tr>
<tr>
<td>text-shadow</td>
<td>增加文本阴影效果</td>
</tr>
<tr>
<td>white-space</td>
<td>设置空白符的处理方式：<br />normal，合并多个空白符<br />pre，表现的像一个pre元素<br />nowrap，忽略换行符</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h2"><span class="graybg">CSS3问题</span></div>
<div class="blog_h3"><span class="graybg">Chrome下transform: translate3d导致透明PNG边缘锯齿（jag）</span></div>
<p>尝试添加样式：</p>
<pre class="crayon-plain-tag">outline: 1px solid transparent;</pre>
<div class="blog_h2"><span class="graybg">其它问题</span></div>
<div class="blog_h3"><span class="graybg">自适应布局最佳实践</span></div>
<ol>
<li>使用百分比或者视窗相对单位（vw/vh/vmin/vmax）来代替绝对数值</li>
<li>要想在大分辨率客户端上固定最大宽度，使用max-width</li>
<li>注意设置替换元素的max-width为100%</li>
<li>如果背景图片需要覆盖整个容器，使用background-size: cover</li>
<li>在grid中布局元素时，让grid的列数由视窗宽度决定。使用Flexbox、display:inline-block可以达到这一点</li>
<li>使用多栏文本时，指定column-width而不是column-count，以便自动在小分辨率UA上显示为单列</li>
</ol>
<div class="blog_h3"><span class="graybg">!important是什么作用</span></div>
<p>增加被修饰的样式的权重，权重高的样式规则会最终生效。权重从小到大依次为：</p>
<ol>
<li>用户代理的声明（浏览器默认样式）</li>
<li>用户声明</li>
<li>开发者声明（引用的CSS文件）</li>
<li>带有!important的开发者声明</li>
<li>带有!important的用户声明</li>
</ol>
<p>另外需要注意亮点：</p>
<ol>
<li>更加<span style="background-color: #c0c0c0;">具体化的选择器</span>比笼统选择器获得更大的权重</li>
<li><span style="background-color: #c0c0c0;">后面出现</span>的规则，具有更大的权重</li>
</ol>
<p>应当尽可能避免使用!important，因为它使得维护难度增加。</p>
<div class="blog_h3"><span class="graybg">悬停时子元素样式</span></div>
<pre class="crayon-plain-tag">.parent:hover .child {
} </pre>
<div class="blog_h3"><span class="graybg">禁止选择文本</span></div>
<pre class="crayon-plain-tag">.noselect {
    cursor: default; 
    -webkit-touch-callout : none; /* iOS Safari */
    -webkit-user-select: none; /* Chrome/Safari/Opera */
    -khtml-user-select: none; /* Konqueror */
    -moz-user-select: none; /* Firefox */
    -ms-user-select: none; /* Internet Explorer/Edge */
    user-select: none;
    -webkit-touch-callout: none; /* Non-prefixed version, currently not supported by any browser */
}</pre>
<div class="blog_h3"><span class="graybg">cellpadding以及cellspacing的CSS方式</span></div>
<p>对于cellpadding，可以设置td元素的样式：</p>
<pre class="crayon-plain-tag">td { 
    padding: 10px;
}</pre>
<p>对于cellspacing，可以设置table元素的样式：</p>
<pre class="crayon-plain-tag">table { 
    border-spacing: 10px;
    border-collapse: separate;
}

/* 下面的代码相当于设置table元素的cellspacing="0" */
table { 
    border-spacing: 0;
    border-collapse: collapse;
}</pre>
<div class="blog_h3"><span class="graybg">子元素相对于父元素绝对定位</span></div>
<p>将父元素设置为相对定位，子元素设置为绝对定位，则子元素相对于父元素进行绝对定位：</p>
<pre class="crayon-plain-tag">#parentDiv {
    position: relative;
}

#childDiv {
    position: absolute;
    left: 12px;
    top: 12px;
}</pre>
<div class="blog_h3"><span class="graybg">居中定位一个元素</span></div>
<pre class="crayon-plain-tag">/*对于块元素*/
#blockElement {
    margin: 0px auto;
}
/*对于文本元素*/
#textElement {
    text-align: center;
}</pre>
<div class="blog_h3"><span class="graybg">让一个块的高度为100%</span></div>
<pre class="crayon-plain-tag">html,body {
    margin: 0;
    height: 100%;
}

#blockDiv {
    width: 100%;
    height: 100%;
}</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/css-faq">CSS知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/css-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
