最近很多小伙伴都在问wordpress中强大的query_posts()函数_PHP教程和wordpress的functionsphp在哪这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给
最近很多小伙伴都在问wordpress 中强大的 query_posts()函数_PHP教程和wordpress的functionsphp在哪这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展CSS 中强大的 EM、linux 下 php的 iconv()函数_PHP教程、MEF 插件式开发之 DotNetCore 中强大的 DI、MEF北京快乐8源码出售插件式开发 - DotNetCore 中强大的 DI等相关知识,下面开始了哦!
本文目录一览:- wordpress 中强大的 query_posts()函数_PHP教程(wordpress的functionsphp在哪)
- CSS 中强大的 EM
- linux 下 php的 iconv()函数_PHP教程
- MEF 插件式开发之 DotNetCore 中强大的 DI
- MEF北京快乐8源码出售插件式开发 - DotNetCore 中强大的 DI
wordpress 中强大的 query_posts()函数_PHP教程(wordpress的functionsphp在哪)
今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 。
query_posts()查询函数决定了哪些文章出现在WordPress 主 循环(loop)中,正因为如此,query_posts函数仅用于修改主页循环(Loop),而不是在页面上生成次级循环。如果你希望在主循环外另外生 成循环,应该新建独立的WP_Query对象,用这些对象生成循环。在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上 显示出你不希望看到的内容。
query_posts()查询函数函数接收大量参数,格式与URL中的参数格式相同(如p=4表示ID为4的文章)。下面就举例说说query_posts函数的一些常用的语法格式。
1.从博客主页上排除某些分类目录
将以下代码添加到index.php文件中,使主页显示的文章可以来自除分类3以外的任何分类。
Php代码
你也可以多排除几个分类。
Php代码
2.查询指定文章
用以下语句检索某篇指定文章:
Php代码
如果你希望在查询语句中使用Read More功能,请将全局变量$more设为0。
Php代码
3.检索指定页面
用以下语句检索某篇指定页面:
Php代码
或者
Php代码
检索子页面时,需要提供子页面及其父页面的别名,用斜线隔开两者。例如:
Php代码
上面都是采取 query_posts($query_string) 的形式来调用该函数,下面介绍另一种方法,用数组传递参数变量。
Php代码
相比字符串方式,数组形式更加形象直观,不容易出错。
下面整理一些经常要用到的参数,有些是我用过的,有些则没有,算作归纳吧。
分类参数
只显示特定分类下的文章。
- cat —— 必须使用分类ID
- category_name
- category_and —— 必须使用分类ID
- category_in —— 必须使用分类ID
- category_not_in —— 必须使用分类ID
根据ID显示单个分类
只显示来自某一个分类目录ID(以及该分类目录下的子分类目录)的文章:
Php代码
根据分类名称显示单个分类
只显示来自某一个分类名称下的文章:
Php代码
根据ID显示多个分类
显示来自若干指定分类目录ID下的文章:
Php代码
排除某一分类中的文章
显示除某一分类文章外的所有文章,被排除的分类ID以减号(’-'')作为前缀。
Php代码
以上代码删除ID为3的分类中的文章。
处理多个分类
显示隶属于多个分类的文章。下面的代码可展示同时属于分类2和分类6的文章:
Php代码
如果希望显示分类2或分类6中的文章,可以使用上面介绍的cat,也可以使用category_in函数 (注意这里不会显示分类下子分类中的文章) :
Php代码
可以用下面这种方式排除多个分类中的文章:
Php代码
标签参数
显示特定标签下的文章。
- tag —— 必须使用标签ID
- tag_id —— 必须使用标签ID
- tag_and —— 必须使用标签ID
- tag_in —— 必须使用标签ID
- tag_not_in —— 必须使用标签ID
- tag_slug_and ——必须使用标签ID
- tag_slug_in ——必须使用标签ID
获取某一标签中的文章
Php代码
获取若干标签中任一标签中的文章
Php代码
多个标签
显示同时属于ID为37和47的标签下的文章:
Php代码
若要显示ID为为37或47的标签下的文章,可以使用tag参数,也可以用tag_in:
Php代码
显示的文章既不属于标签37,也不属于标签47:
Php代码
tag_slug_in与tag_slug_and工作方式几乎一致,不同之处在于相匹配的别名不同。
作者参数
你也可以根据作者来选择文章。
- author=3
- author=-3 ——排除ID为3的作者所发表的文章
- author_name=Harriet
注意:author_name运行在user_nicename字段上,同时author运行在author id字段上。
显示ID为1的作者所发表的所有页面,以标题顺序排列页面,页面列表上方无置顶文章:
Php代码
文章&页面参数
检索单篇文章或页面。
- ‘p’ => 27 —— 通过文章ID显示该文章
- ‘name’ => ‘about-my-life’ —— 对某篇文章的查询,查询中含有文章别名
- ‘page_id’ => 7 —— 对ID为7的页面的查询
- ‘pagename’ => ‘about’ —— 注意,这不是页面标题,而是页面路径
- 用’posts_per_page’ => 1 – use ‘posts_per_page’ => 3 展示3篇文章。用’posts_per_page’ => -1展示所有文章
- ‘showposts’ => 1 – use ‘showposts’ => 3 展示3篇文章。用’showposts’ => -1展示所有文章。已弃用。
- ‘post__in’ => array(5,12,2,14,7) —— 指定希望检索的文章ID
- ‘post__not_in’ => array(6,2,8) ——排除不希望检索的文章ID
- ‘post_type’ => ‘page’ ——返回页面;默认值为post;可用值包括any, attachment, page, post或revision。any可检索到除修订版外的所有页面类型。
- ‘post_status’ => ‘publish’ —— 返回已发布页面。可用值还包括pending, draft, future, private, trash。关于inherit请见get_children。trash状态新增于WordPress 2.9。
- ‘post_parent’ => 93 —— 返回页面93的子页面。
置顶文章参数
置顶文章功能引入于WordPress 2.7。在查询中,被设为“置顶”的文章会显示在其它文章之前,除非该文章已经被caller_get_posts=1 参数排除。
- array(‘post__in’=>get_option(‘sticky_posts’)) —— 返回所有置顶文章的数组
- caller_get_posts=1 —— 排除返回的文章上方的置顶文章,但在返回文章列表时,以自然顺序将曾经置顶的文章安插在列表中。
返回第一篇置顶文章
Php代码
或
Php代码
注意:第二种方法只能返回最新发表的置顶文章;若当前无置顶文章,返回最新发表文章。
返回第一篇置顶文章;若无,则不返回任何内容
Php代码
从查询中排除所有置顶文章
Php代码
返回某一分类下所有文章,但不在文章列表上方显示置顶文章。所有设为“置顶”的文章以正常顺序(如日期顺序)显示
Php代码
返回某一分类下所有文章,完全不显示置顶文章,保留分页
Php代码
时间参数
检索特定时间段内发表的文章。
- hour= -hour (时,-范围从0到23)
- minute= – minute (分,-范围从0到60)
- second= – second (秒,-范围从0到60)
- day= – day of the month (日,-范围从1到31)
- monthnum= – month number (月,-范围从1到12)
- year= – 4 digit year (年,如2009)
- w= – week of the year(一年中的第几周,-范围从0到53),使用 MySQL WEEK command Mode=1命令
返回最近发表的文章
Php代码
返回12月20日发表的文章
Php代码
返回2009年3月1日到3月15日之间发表的文章
Php代码
返回最近30天内发表的文章
Php代码
返回过去30天到过去60天内发表的文章
Php代码
分页参数
- paged=2 ——显示点击“较早的日志”链接后出现在第二页中的文章
- posts_per_page=10 —— 每页所显示的文章数量;若值为-1,显示所有文章。
- order=ASC —— 按时间顺序显示文章,若值为DESC则按逆向时间顺序显示文章(默认)
offset(偏移)参数
通过offset参数,你可以移除或忽略正常情况下被查询集中的一篇或多篇初始文章。
以下显示最近一篇文章之后的5篇文章:
Php代码
排序参数
- orderby=author
- orderby=date
- orderby=category ——注意:该参数不能用于WordPress 2.8,可能已经被废止
- orderby=title
- orderby=modified
- orderby=menu_order
- orderby=parent
- orderby=ID
- orderby=rand
- orderby=meta_value —— meta_key=some value语句也应出现在查询参数中
- orderby=none – no order —— (新增于 WP 2.8)
- orderby=comment_count ——(新增于 WP 2.9)
顺序参数
决定以升序或降序排列排序参数
- order=ASC —— 升序,从最低值到最高值
- order=DESC —— 降序,从最高值到最低值
自定义字段参数
根据自定义关键字或值检索文章(或页面)。
- meta_key=
- metavalue=
- meta_compare= —— 用以测试metavalue=的操作符,默认值为 ‘=’,其它可能的值包括’!=’、 ‘>’、’>=’、 ‘
返回关键字为 ‘color’ 且值为’blue’的文章:
Php代码
返回自定义字段关键字为’color’的文章,无论自定义字段值为何:
Php代码
返回自定义字段值为’color’的文章,无论关键字为何:
Php代码
返回自定义字段值为’green’的页面,无论自定义字段关键字为何:
Php代码
返回自定义关键字为’color’、自定义字段值不为’blue’的文章和页面:
Php代码
返回自定义字段关键字为’miles’、自定义字段值小于等于22的文章。注意,字段值99会被看做大于字段值100,因为数据是以字符串形式而不是数字形式存储的。
query_posts('meta_key=miles&meta_compare=<=&metavalue=22');
联合参数
你可能已经从上面有些例子中看出来了,可以用&符号连接不同参数,如:
Php代码
显示主页上、当前月份发表的、隶属于分类13下的文章:
Php代码
在WP 2.3中,以下参数联合会返回同时属于分类1和分类3的两篇文章,以文章标题降序排列:
Php代码
在WP 2.3和WP 2.5中,以下参数联合本应返回属于分类1且带有“apples”标签的文章:
Php代码
但由于一个bug,代码没能显示出正常结果。有一个解决办法:利用+号查找多个标签:
Php代码
这就显示出我们希望显示的结果了。
使用技巧
设置>阅读中的“博客页面最多显示”参数会影响你的查询结果,要覆盖设置>阅读中的设置,需要在标签中添加’posts_per_page’ 参数。例如:
Php代码
注意:query_posts函数会改写并取代页面的主查询。为谨慎起见,请不要将query_posts用作其它用途。
来源: http://www.zuluo.net/2012/2012-01/
CSS 中强大的 EM
使用 CSS 也好久了,但一直都是在使用 “px” 来设置 Web 元素的相关属性,未敢使用 “em”。主要原因是,对其并不什么了解,只知道一点概念性的东西,前段时间在项目中要求使用 “em” 作为单位设置元素,所以从头对 “em” 学习了一回。稍为有一点理解,今天特意整理了一份博文与大家一起分享,希望对童子们有些许的帮助。
这篇教程将引导大家如何使用 “em” 来创建一个基本的弹性布局,从而学习其如何计算?又是如何使用 “em” 对层进行弹性扩展?又是如何扩展文本和图像等内容?下在我们就一起带着这些问题开始今天的 “em” 之行。
什么是弹性布局?
用户的文字大小与弹性布局
用户的浏览器默认渲染的文字大小是 “16px”,换句话说,Web 页面中 “body” 的文字大小在用户浏览器下默认渲染是 “16px”。当然,如果用户愿意他可以改变这种字体大小的设置,用户可以通过 UI 控件来改变浏览器默认的字体大小。
弹性设计有一个关键地方 Web 页面中所有元素都使用 “em” 单位值。“em” 是一个相对的大小,我们可以这样来设置 1em,0.5em,1.5em 等,而且 “em” 还可以指定到小数点后三位,比如 “1.365em”。而其中 “相对” 的意思是:
相对的计算必然会一个参考物,那么这里相对所指的是相对于元素父元素的 font-size。比如说:如果在一个 <div> 设置字体大小为 “16px”,此时这个 < div > 的后代元素教程了是将继承他的字体大小,除非重新在其后代元素中进行过显示的设置。此时,如果你将其子元素的字体大小设置为 “0.75em”,那么其字体大小计算出来后就相当于 “0.75 X 16px = 12px”;
如果用户通过浏览器的 UI 控件改变了文字的大小,那么我们整个页面也会进行放大(或缩小),不至于用户改变了浏览器的字体后会致使整个页面崩溃(我想这种现像大家都有碰到过,不信你就试试你自己制作过的项目,你会觉得很恐怖)。
大家可以查看这个弹性布局样例。此时你使用浏览器的 UI 控件改变了文字的大小或者直接 “ctrl +” 和 “ctrl - ”,你会发现这个弹性布局实例,在浏览器改变字体大小浏览会做出相应的放大和缩小,并不会影响整个页面的布局。注:这个实例的所有 HTML 和 CSS 在本教程中教程了都会使用到。
至于其他的弹性布局的实例,大家可以浏览 Dan Cederholm 的 Simplebites,并改变文字的大小去浏览。
体验后,是不是觉得弹性布局的页面很灵活呀,而且也像 “px” 一样的精确。因此,只要我们掌握了 “font-size”、“px” 和 “em” 之间的基本关系,我们就可以民以食快速使用 CSS 创建精确的布局。
CSS 的 Elastigirl 引进 EM
Elastigirl 的 “em” 是极其强大和灵活的,他不管字体大小是什么,是 12px,16 或 60,他都可以计算出其值。
em 其实就是一种排版的测试单位,而且他的由来还有一段小故事,关于这段小故事我就不和大家说了,因为大家都不是来听我讲故事的,我想大还是喜欢知道他在 CSS 中的那些事。
在 CSS 中,“em” 实际上是一个垂直测量。一个 em 等于任何字体中的字母所需要的垂直空间,而和它所占据的水平空间没有任何的关系,因此:
如果字体大小是 16px,那么 1em=16px。
入门
在我们开始来了解 CSS 中的这个 “em” 之前,我们需要知道在浏览器下,他的默认字体大小。正好我们前面也这样做了,在所有现代浏览器中,其默认的字体大小就是 “16px”。因此在浏览器下默认的设置将是:
1em = 16px
因此,在一个 CSS 选择器被写入时,浏览器就有了一个 “16px” 大小的默认字体。此时我们 Web 页面中的 < body > 就继承了这个 “font-size:16px;”,除非你在 CSS 样式中显式的设置 < body > 的 “font-size” 值,来改变其继承的值。这样一来,“1em = 16px”、“0.5em = 8px”、“10em = 160px” 等等,那么我们也可以使用 “em” 来指定任何元素的大小。
设置 Body 的 font-size
很多前辈在多年的实践中得出一个经验,他们建议我们在 <body> 中设置一个正文文本所需的字体大小,或者设置为 “10px”,相当于(“0.625em 或 62.5%”),这样为了方便其子元素计算。这两种都是可取的。但是我们都知道,<body > 的默认字体是 “16px”,同时我们也很清楚了,我们改变了他的默认值,要让弹性布局不被打破,就需要重新进行计算,重新进行调整。所以完美的设置是:
body {font-size:1em;}
可是在那个没人爱的 IE 底下,“em” 会有一个问题存在。调整字体大小的时候,同样会打破我们的弹性布局,不过还好,有一个方法可以解决:
html {font-size: 100%;}
公式转换 ——PXtoEM
如果你是第一创建弹性布局的,最好在身边准备一个计算器,因为我们一开始少不了很多的计算,有了他放心。
像素对于我们来说太密切了,因此我们也将从这开始。首先需要计算出 1px 和 em 之间的比例,然后是知道我们需要的 px 值。通过前面的介绍,大家都知道 1em 总是等于父元素的字体大小,因此我们完全可以通过下面的工式来计算:
1 ÷ 父元素的 font-size × 需要转换的像素值 = em 值
大家可以参考一下面这张转换表 (body 字体为 16px 时的值)
接下来我们一起看一个很简单的实例 “使用 CSS 的 EM 制作一个 960px 宽度的弹性布局”
HTML Markup
<body>
<div id="container"> …</div>
</body>
将 960px 转换为 em
1 ÷ 16px × 960px = 60em
这个计算值的前提条件是 <body> 的 “font-size:16px”。
CSS Code
html { font-size: 100%;
}
body { font-size: 1em;
}
#container { width: 60em;
}
通过上面的实例,我想大家更能形像化的理解了,因为有例可询,其实我们可以把上面的计算公式转换一下,将更方便你的计算:
需要转换的像素值 ÷ 父元素的 font-size = em 值
那么我们上面的实例 “960px” 就可以这样来转换成 “em” 值
960px ÷ 16px = 60em
上面我们一起见证了 “px” 转换成 “em” 的计算方式,接下来我们一起来动看制作上面展示过的弹性布局样例。下面我们主要一起来一步一步的实现他。
构建一个弹性的容器
要创建弹性布局样例那样的居中效果,我们首先需要创建一个 HTML 结构,我在此给创建一个 <div> 并且取名叫 “wrap”
<body>
<div id="wrap"> content here</div>
</body>
我们希望这个容器是一个 “740px” 宽,适合一个 “800px × 600px” 显屏的实例。那么 “740px” 会等于多少 “em” 呢?这就是我们需要关心的问题,大家一起来看吧:
1、将 “740px” 转换成 “em” 设置到我们的容器 “div#wrap”:我们都知道 “div#wrap” 的父元素 < body > 设置了字体为 “16px”,那么此时在没有进行另外显示的设置时,他的子元素 < div id="wrap"> 将继承 “font-size” 值,这样我们就可以轻意得到:“1px 和 1em 之间的关系”
1em = 16px 也就是 1px = 1 ÷ 16 = 0.0625em
这样一来,我们的 “740px” 就很容易的能转换成 “em”
0.0625em × 740 = 46.25em
当然大家也可以按照我们前面所列出的计算公式来进行转换,这样你心中更具有一个概念性,也不容易弄错:
1 ÷ 16 × 740 = 46.25em (1 ÷ 父元素的 font-size × 需要转换的像素值 = em 值)
这样一来,您可以使用上面的公式计算出您需要的任何宽度或高度的 “em” 值,你只需要知道 “1px 等于多少 em”,另外就是你要转换的 “px” 值是多少,具备这几个参数你就能得到你想要的 “em” 值了。
2、创建 CSS 样式:现在我们可以给 “div#wrap” 写样式了,弹性布局样例很明显的告诉我们,给 “div#wrap” 设置了一个宽度为 “740px” 居中,带有上下 “margin” 为 “24px”,而且带有 “1px” 的边框效果,那么我们首先根据上面的公式计算出相应的 “em 值”,然后在写到 CSS 样式中:
html {font-size: 100%;}
body {font-size: 1em;}
#wrap { width: 46.25em;/*740px ÷ 16 = 46.25em */
margin: 1.5em auto;/*24px ÷ 16 = 1.5em*/
border: 0.0625em solid #ccc;/*1px ÷ 16 = 0.0625em*/
}
现在我们就轻松的创建了一个包含内容的弹性容器:弹性布局样例。
文本样式与 em
首先我们在前面那个创建的 <div id="wrap"></div > 中插入一个 < h1 > 和一个 < p>:
<div id="wrap">
<h1>...</h1>
<p>...</p>
</div>
在弹性布局样例实例中,我们标题使用了 “18px”,而段落设置的是 “12px” 字体,同时其行高是 “18px”。18px 将是我们实现弹性布局的一个重要值,可以使用他们都按正比变化。(有关于标题和段落的排版介绍,大家感兴趣可以点击 Richard Rutter 的 basic leading 和 vertical rhythm 以及 chapter on vertical motion 的相关介绍)。
根据 CSS 继承一说,我们在 “div#wrap” 的内容容器中没有显式的设置字体大小,这样整个 “div#wrap” 将继承了其父元素 “body” 的字体 ——“16px”。
1、给段落设置样式:——“12px” 的字体,“18px” 的行高以及 margin 值
从 CSS 继承中,我们可以得知我们所有段落继承了其父元素 “div#wrap” 的 “font-size:16px”。同时我们通过前面的介绍得知 1px = 1 ÷ 16 = 0.0625em,这样一来我们就很轻松的知道 “12px” 等于多少个 “em”
0.0625em × 12 = 0.750em
这样我们就可以给段落 p 设置样式:
p {font-size: 0.75em;/*0.0625em × 12 = 0.750em */}
要计算出段落所需的行高和 “margin” 为 “18px”,来满足 Richard Rutter 说的 basic leading,那我们就需要像下面的方法和来计算:
18 ÷ 12 = 1.5em
使用所需的行高值 “18px” 直接除以 “字体大小 12px”,这样就得到了段落 “p” 的 “line-height” 值。在本例中行高就等于字体的 “1.5” 倍,接着我们把 “line-height” 和 “margin” 样式加到段落 “p” 中
p{ font-size: 0.75em;/*0.625em × 12 = 0.750em */
line-height: 1.5em;/*18px(line-height) ÷ 12(font-size) = 1.5em */
margin: 1.5em;/*18px(margin) ÷ 12(font-size) = 1.5em */
}
2、给标题设置一个 18px 的字号
标题 “h1” 和段落 “p” 一样的原理,他也是继承他父元素 “div#wrap” 的 “16px” 的 “font-size”,所以我们也是按同样的方法可以计处出他的 “em”
0.0625em × 18 = 1.125em
我们可以把得出的值写到 CSS 样式表中
h1 { font-size: 1.125em;/*0.625em × 18 = 1.125em*/
}
同样为了保留 Richard Rutter 所说的 vertical rhythm,我们同样将标题 “h1” 的 “line-height” 和 “margin” 都设置为 “18px”,使用方法前面介绍的方法。很容易得到他们的 “em” 值为 “1em”:
h1 { font-size: 1.125em; /*0.625em × 18 = 1.125em*/
line-height: 1em; /*18px(line-height) ÷ 18px(font-size) = 1em */
margin: 1em; /*18px(margin) ÷ 18px(font-size) = 1em */
}
设置图片大小 —— 使用 em
要做出弹性布局样例这样的果,我们也需要在 html 中插入一张图片:
<body>
<div id="wrap">
<h1>....</h1>
<p><img src="90.png" alt="" /> Lorem...</p>
</div>
</body>
我们这张图片具有 “90px” 的宽和高,同时具有一个右边距和底边距为 “18px” 设置,而且还进行左浮动。下面我们就一起来看其如何实现图片这几个样式效果:
从 HTML 结构中,我们很清楚的知道,图片是段落 “p” 的子元素,通过前面的介绍,你们知道这个段落 “p” 的 “font-size” 值被得定义为 “12px”,因此我们计算图片的属性值时,不能在按 “1px = 0.0625em” 或者 “1em=16px” 来计算,我们需要使用最老的公式计算:
1 ÷ 父元素的 font-size × 需要转换的像素值 = em 值
这样一来,按上面所示的公式,我们就可以计算出图片的大小:
1 ÷ 12 × 90 = 7.5em
现在你就可以将计算出来的值写到样式中去:
p img { width: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(图片的宽度) = 7.5em */
height: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(图片的高度) = 7.5em */
}
我们在段落中知道了 “18px” 刚好是 “1em”,现在我们也把他使用到图片的样式中:
p img { width: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(图片的宽度) = 7.5em */
height: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(图片的高度) = 7.5em */
margin: 0 1.5em 1.5em 0;
float: left;
}
这样我们就制作出一个和弹性布局样例一样的效果。希望通过这样的一个实例能帮助大家了解如何使用 “em” 来创建一个弹性布局的方法。当然大家可能还在担心使用 “em” 来制作一个弹性布局,不能像 “px” 一样的的精确,如果你真正理解了这篇教程后,我想你不会在有这样的想法。
弹性布局的公式总结
最后我想大家肯定和我会有同一种想法,就是相关参数是的 “px” 值如何成功而且正确的转换成 “em” 值,经过上面的学习,我最后将公式总结一下:
元素自身没有设置字号大小时,元素的 width、height、line-height、margin、padding、border 等值转换都按下面公式转换:
1 ÷ 父元素的 font-size × 需要转换的像素值 = em 值
我们来看一个实例:
<body>
<div id="wrapper">test</div>
</body>
我们在 body 默认字体大小为 “16px”, 此时需要 “div#wrapper” 的相关参数值为:
#wrapper { width: 200px;
height: 100px;
border: 5px solid red;
margin: 15px;
padding: 10px;
line-height: 18px;
}
那么我们按照上面的公式,将所在参数进行转换:
#wrapper { width: 12.5em;/*1 ÷ 16 × 200 = 12.5em值*/
height: 6.25em;/*1 ÷ 16 × 100 = 6.25em值*/
border: 0.3125em solid red;/*1 ÷ 16 × 5 = 0.3125em值*/
margin: 0.9375em;/*1 ÷ 16 × 15 = 0.9375em值*/
padding: 0.625em;/*1 ÷ 16 × 10 = 0.625em值*/
line-height: 1.125em;/*1 ÷ 16 × 18 = 1.125em值*/
}
我们一起来看计算出来的值:
接下来我需要大家在来看一个效果,这一点很关键哟,仔细看好,在同样的参数基础上稍加一条元素本身设置字体大小为:14px;,大家可以会说很简单的呀,按前面的公式计算出来加上就是了,那么我现在就按大家说的计算加上:
#wrapper { font-size: 0.875em;/*1 ÷ 16 × 14= 0.875em值*/
width: 12.5em;/*1 ÷ 16 × 200 = 12.5em值*/
height: 6.25em;/*1 ÷ 16 × 100 = 6.25em值*/
border: 0.3125em solid red;/*1 ÷ 16 × 5 = 0.3125em值*/
margin: 0.9375em;/*1 ÷ 16 × 15 = 0.9375em值*/
padding: 0.625em;/*1 ÷ 16 × 10 = 0.625em值*/
line-height: 1.125em;/*1 ÷ 16 × 18 = 1.125em值*/
}
此进我们在 firebug 下看计算出来的 layout 值
为了更好的说明问题,我把元素自身没有设置字体大小和元素自身设置了字体大小,两者在 firebug 计算出来值:
我截这个图的主要意图是,说明一个问题就是元素自身要是设置了字体大小后,其计算公式就不在是前面所说的,我们需要做一下修改:
1、字体计算公式依旧
1 ÷ 父元素的 font-size × 需要转换的像素值 = em 值
2、其它属性的计算公式需要换成
1 ÷ 元素的 font-size × 需要转换的像素值 = em 值
那么我们现在来计算一回:
#wrapper { font-size: 0.875em;/*1 ÷ 16 × 14= 0.875em值*/
width: 14.2857em;/*1 ÷ 14 × 200 = 14.2857em值*/
height: 7.1429em;/*1 ÷ 14 × 100 = 7.1429em值*/
border: 0.357em solid red;/*1 ÷ 14 × 5 = 0.357em值*/
margin: 1.071em;/*1 ÷ 14 × 15 = 1.071em值*/
padding: 0.714em;/*1 ÷ 14 × 10 = 0.714em值*/
line-height: 1.2857em;/*1 ÷ 14 × 18 = 1.2857em值*/
}
我们在来看一次计算出来的值:
总结
长篇介绍了一大堆,唯一想告诉大家的是以下几点
1、浏览器的默认字体大小是 16px
2、如果元素自身没有设置字体大小,那么元素自身上的所有属性值如 “boder、width、height、padding、margin、line-height” 等值,我们都可以按下面的公式来计算
1 ÷ 父元素的 font-size × 需要转换的像素值 = em 值
3、这一种千万要慢慢理解,不然很容易与第二点混了。如果元素设置了字体大小,那么字体大小的转换依旧按第二条公式计算,也就是下面的:
1 ÷ 父元素的 font-size × 需要转换的像素值 = em 值
那么元素设置了字体大小,此元素的其他属性,如 “border、width、height、padding、margin、line-height” 计算就需要按照下面的公式来计算:
1 ÷ 元素自身的 font-size × 需要转换的像素值 = em 值
这样说,不知道大家理解了整明白了没有,如果没有整明白,可以回过头来看上面的一个实例。
参考阅读
如果大家对我所说的还不是很了解,大家可以点击下面的相关博文:
W3C 的《The amazing em unit》
typophile.com 的《The Em》
Webtypography 的《The Elements of Typographic Style Applied to the Web》
CSS2 中的 Font-size
CSS2: Assigning property values, Cascading, and Inheritance
Mike Cherim 的《CSS Layouts: The Fixed. The Fluid. The Elastic》
Roger Johansson 的《Fixed or fluid width? Elastic!》
Patrick Griffiths 的《Elastic Design》
最后在结束此篇教程之时,我们一起来感谢 Jon 陳给我们带来这么好的教程《The Incredible Em & Elastic Layouts with CSS》。
如需转载烦请注明出处:W3CPLUS
linux 下 php的 iconv()函数_PHP教程
使用iconv方法进行编码转换。在windows平台下面可以正常的工作(本地环境使用的win7),但是在
参考phpinfo的信息,iconv模块也已经正确加载。
google一下。原来才知道,原来在linux版本下iconv这个方法还是有点下下问题的。
csdn上的一个网友给出的解决方案为:
一种方法是把iconv换成 mb_convert_encoding
另一种方法是修改iconv 的实现,从glibc 改为libiconv
搞了半天,烦躁!
有朋友碰到的话,也可以这么解决了
按照该网友提供的第一个方法,将iconv方法修改为使用mb_convert_encoding,搞定。。
多谢该网友提供的解决方案。
下载:ftp://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.8.tar.gz
安装:
#cp libiconv-1.8.tar.gz /usr/local/src
#tar zxvf lib*
#./configure --prefix=/usr/local/libiconv
#make
#make install
编译php
#./configure --prefix=/usr/local/php4.3.2 --with-iconv=/usr/local/libiconv/
使用的简单例子:
echo iconv("gb2312","ISO-8859-1","我们");
MEF 插件式开发之 DotNetCore 中强大的 DI
背景叙述
在前面几篇 MEF 插件式开发 系列博客中,我分别在
DotNet Framework
和DotNet Core
两种框架下实验了 MEF 的简单实验,由于DotNet Framework
由来已久,因此基于该框架下衍生出的很多优秀的 MEF 框架较多。但是对于DotNet Core
来说,情况有所不同,由于它本身对 DI 内置并提供支持,因此我尝试使用它的全新 依赖注入(DI) 来做一些实验。
动手实验
要想让程序支持 DI,就需要为项目安装 Package:
Install-Package Microsoft.Extensions.DependencyInjection -Version 2.1.1
然后,我们就可以使用强大的 DI 了。
在 DotNet Core,所有服务的注册都是统一放到一起的,而这个就是由 ServiceCollection 来接收的;其次,当服务注册完毕后,还需要对服务进行初始化构建,构建后的结果作为一个提供服务者返回,其对应的类型为 ServiceProvider;最后,如果获取某个已经注册的服务的话,可以通过 serviceProvider.GetService<T>() 来获取。
下面,我分别从下面 4 个方面来体验一下 DotNet Core
中强大的 DI
。
注入并设置服务的生命周期
注册服务需要涉及到服务的生命周期,因此,IServiceCollection 有 3 个不同的扩展方法:
- AddTransient:每次获取的服务都是新创建的;
- AddScoped:在一定范围内获取的服务是同一个;
- AddSingleton:每次获取的服务都是同一个,单例模式的服务;
示例代码如下所示:
public interface IBaseSender
{
void Send(string message);
}
public interface ITransientSender : IBaseSender { }
public class TransientSender : ITransientSender
{
public void Send(string message) => Console.WriteLine($"{GetHashCode()} {message}");
}
public interface IScopedSender : IBaseSender { }
public class ScopedSender : IScopedSender
{
public void Send(string message) => Console.WriteLine($"{GetHashCode()} {message}");
}
public interface ISingletonSender : IBaseSender { }
public class SingletonSender : ISingletonSender
{
public void Send(string message) => Console.WriteLine($"{GetHashCode()} {message}");
}
class Program
{
private static readonly object locker = new object();
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddTransient<ITransientSender, TransientSender>()
.AddScoped<IScopedSender,ScopedSender>()
.AddSingleton<ISingletonSender, SingletonSender>()
.BuildServiceProvider();
using (var scope = serviceProvider.CreateScope())
{
for (int i = 0; i < 2; i++)
{
serviceProvider.GetService<ITransientSender>().Send("ITransientSender");
scope.ServiceProvider.GetService<IScopedSender>().Send("IScopedSender");
serviceProvider.GetService<ISingletonSender>().Send("ISingletonSender");
}
}
Console.WriteLine("***********************************");
using (var scope = serviceProvider.CreateScope())
{
for (int i = 0; i < 2; i++)
{
serviceProvider.GetService<ITransientSender>().Send("ITransientSender");
scope.ServiceProvider.GetService<IScopedSender>().Send("IScopedSender");
serviceProvider.GetService<ISingletonSender>().Send("ISingletonSender");
}
}
Console.ReadKey();
}
}
程序输出如下图所示:
通过上图我们可以了解到,
- 在相同或不同的作用域内,通过 AddTransient 注册的服务每次都是新创建的;
- 在相同作用域内,通过 AddScoped 注册的服务每次同一个;在不同请求作用域中,通过 AddScoped 注册的服务每次都是新创建的;
- 通过 AddSingleton 注册的服务在整个程序生命周期内是同一个;
需要注意的是,在 ASP.NET Core 中,所有与 EF 相关的服务都应该通过 AddScoped<TInterface,T> 的方式注入。此外,如果想注入泛型的话,可借助 typeof方式来注入。
构造函数注入
参数注入
public interface IBaseSender
{
void Send();
}
public class EmialSender : IBaseSender
{
private readonly string _msg;
public EmialSender(string msg) => _msg = msg;
public void Send() => Console.WriteLine($"{_msg}");
}
class Program
{
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton<IBaseSender, EmialSender>(factory => { return new EmialSender("Hello World"); })
.BuildServiceProvider();
serviceProvider.GetService<IBaseSender>().Send();
Console.ReadKey();
}
}
服务注入
public interface IBaseSender
{
void Send();
}
public class EmialSender : IBaseSender
{
private readonly IWorker _worker;
public EmialSender(IWorker worker) => _worker = worker;
public void Send() =>_worker.Run("Hello World");
}
public interface IWorker
{
void Run(string message);
}
public class Worker : IWorker
{
public void Run(string message)
{
Console.WriteLine(message);
}
}
class Program
{
private static readonly object locker = new object();
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton<IBaseSender, EmialSender>()
.AddSingleton<IWorker, Worker>()
.BuildServiceProvider();
serviceProvider.GetService<IBaseSender>().Send();
Console.ReadKey();
}
}
在传统的DotNet 框架下开发,注入是支持 参数、服务和属性的,但是在 DotNet Core 平台下目前只支持前两种注入方式。
添加日志记录
DotNet Core 中已经将 Logger
功能集成进来,只需要安装相应的 Package 即可食用。
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Console
Microsoft.Extensions.Logging.Debug
示例程序如下所示:
public interface IBaseSender
{
void Send();
}
public class EmialSender : IBaseSender
{
private readonly IWorker _worker;
private readonly ILogger<EmialSender> _logger;
public EmialSender(IWorker worker, ILogger<EmialSender> logger)
{
_worker = worker;
_logger = logger;
}
public void Send()
{
_worker.Run("Hello World");
_logger.LogInformation(MethodBase.GetCurrentMethod().Name);
}
}
public interface IWorker
{
void Run(string message);
}
public class Worker : IWorker
{
public void Run(string message)
{
Console.WriteLine(message);
}
}
class Program
{
private static readonly object locker = new object();
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton<IBaseSender, EmialSender>()
.AddSingleton<IWorker, Worker>()
.AddSingleton(new LoggerFactory().AddConsole().AddDebug())
.AddLogging()
.BuildServiceProvider();
serviceProvider.GetService<IBaseSender>().Send();
Console.ReadKey();
}
}
总结
这次做的几个小实验还是很有趣的,体验了一下 DotNet Core 中强大的 DI 功能。和传统的 DotNet Framework 相比,有很多改进的地方,这是值得每一个 DotNet 程序员 去尝试的一门新技术。
相关参考
- How to register multiple implementations of the same interface in Asp.Net Core?
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient
- Multi-tenant Dependency Injection in ASP.NET Core
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
MEF北京快乐8源码出售插件式开发 - DotNetCore 中强大的 DI
要想让程序支持 DI,就需要为项目安装 Package:
Install-Package Microsoft.Extensions.DependencyInjection -Version 2.1.1
然后,我们就可以使用强大的 DI 了。
在,北京快乐8源码出售Q3266397597【dashengba.com大圣源码论坛】【bbsapple.com苹果源码论坛】所有服务的注册都是统一放到一起的,而这个就是由 ServiceCollection 来接收的;其次,当服务注册完毕后,还需要对服务进行初始化构建,构建后的结果作为一个提供服务者返回,其对应的类型为 ServiceProvider;最后,如果获取某个已经注册的服务的话,可以通过 serviceProvider.GetService() 来获取。
下面,我分别从下面 4 个方面来体验一下 DotNet Core
中强大的 DI
。
注入并设置服务的生命周期
注册服务需要涉及到服务的生命周期,因此,IServiceCollection 有 3 个不同的扩展方法:
- AddTransient:每次获取的服务都是新创建的;
- AddScoped:在一定范围内获取的服务是同一个;
- AddSingleton:每次获取的服务都是同一个,单例模式的服务;
示例代码如下所示:
public interface IBaseSender
{
void Send(string message);
}
public interface ITransientSender : IBaseSender { }
public class TransientSender : ITransientSender
{
public void Send(string message) => Console.WriteLine($"{GetHashCode()} {message}");
}
public interface IScopedSender : IBaseSender { }
public class ScopedSender : IScopedSender
{
public void Send(string message) => Console.WriteLine($"{GetHashCode()} {message}");
}
public interface ISingletonSender : IBaseSender { }
public class SingletonSender : ISingletonSender
{
public void Send(string message) => Console.WriteLine($"{GetHashCode()} {message}");
}
class Program
{
private static readonly object locker = new object();
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddTransient<ITransientSender, TransientSender>()
.AddScoped<IScopedSender,ScopedSender>()
.AddSingleton<ISingletonSender, SingletonSender>()
.BuildServiceProvider();
using (var scope = serviceProvider.CreateScope())
{
for (int i = 0; i < 2; i++)
{
serviceProvider.GetService<ITransientSender>().Send("ITransientSender");
scope.ServiceProvider.GetService<IScopedSender>().Send("IScopedSender");
serviceProvider.GetService<ISingletonSender>().Send("ISingletonSender");
}
}
Console.WriteLine("***********************************");
using (var scope = serviceProvider.CreateScope())
{
for (int i = 0; i < 2; i++)
{
serviceProvider.GetService<ITransientSender>().Send("ITransientSender");
scope.ServiceProvider.GetService<IScopedSender>().Send("IScopedSender");
serviceProvider.GetService<ISingletonSender>().Send("ISingletonSender");
}
}
Console.ReadKey();
}
}
程序输出如下图所示:
通过上图我们可以了解到,
- 在相同或不同的作用域内,通过 AddTransient 注册的服务每次都是新创建的;
- 在相同作用域内,通过 AddScoped 注册的服务每次同一个;在不同请求作用域中,通过 AddScoped 注册的服务每次都是新创建的;
- 通过 AddSingleton 注册的服务在整个程序生命周期内是同一个;
需要注意的是,在 ASP.NET Core 中,所有与 EF 相关的服务都应该通过 AddScoped<TInterface,T> 的方式注入。此外,如果想注入泛型的话,可借助 typeof方式来注入。
构造函数注入
参数注入
public interface IBaseSender
{
void Send();
}
public class EmialSender : IBaseSender
{
private readonly string _msg;
public EmialSender(string msg) => _msg = msg;
public void Send() => Console.WriteLine($"{_msg}");
}
class Program
{
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton<IBaseSender, EmialSender>(factory => { return new EmialSender("Hello World"); })
.BuildServiceProvider();
serviceProvider.GetService<IBaseSender>().Send();
Console.ReadKey();
}
}
服务注入
public interface IBaseSender
{
void Send();
}
public class EmialSender : IBaseSender
{
private readonly IWorker _worker;
public EmialSender(IWorker worker) => _worker = worker;
public void Send() =>_worker.Run("Hello World");
}
public interface IWorker
{
void Run(string message);
}
public class Worker : IWorker
{
public void Run(string message)
{
Console.WriteLine(message);
}
}
class Program
{
private static readonly object locker = new object();
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton<IBaseSender, EmialSender>()
.AddSingleton<IWorker, Worker>()
.BuildServiceProvider();
serviceProvider.GetService<IBaseSender>().Send();
Console.ReadKey();
}
}
在传统的DotNet 框架下开发,注入是支持 参数、服务和属性的,但是在 DotNet Core 平台下目前只支持前两种注入方式。
添加日志记录
DotNet Core 中已经将 Logger
功能集成进来,只需要安装相应的 Package 即可食用。
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Console
Microsoft.Extensions.Logging.Debug
示例程序如下所示:
public interface IBaseSender
{
void Send();
}
public class EmialSender : IBaseSender
{
private readonly IWorker _worker;
private readonly ILogger<EmialSender> _logger;
public EmialSender(IWorker worker, ILogger<EmialSender> logger)
{
_worker = worker;
_logger = logger;
}
public void Send()
{
_worker.Run("Hello World");
_logger.LogInformation(MethodBase.GetCurrentMethod().Name);
}
}
public interface IWorker
{
void Run(string message);
}
public class Worker : IWorker
{
public void Run(string message)
{
Console.WriteLine(message);
}
}
class Program
{
private static readonly object locker = new object();
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton<IBaseSender, EmialSender>()
.AddSingleton<IWorker, Worker>()
.AddSingleton(new LoggerFactory().AddConsole().AddDebug())
.AddLogging()
.BuildServiceProvider();
serviceProvider.GetService<IBaseSender>().Send();
Console.ReadKey();
}
}
总结
这次做的几个小实验还是很有趣的,体验了一下 DotNet Core 中强大的 DI 功能。和传统的 DotNet Framework 相比,有很多改进的地方,这是值得每一个 DotNet 程序员 去尝试的一门新技术。
今天关于wordpress 中强大的 query_posts()函数_PHP教程和wordpress的functionsphp在哪的介绍到此结束,谢谢您的阅读,有关CSS 中强大的 EM、linux 下 php的 iconv()函数_PHP教程、MEF 插件式开发之 DotNetCore 中强大的 DI、MEF北京快乐8源码出售插件式开发 - DotNetCore 中强大的 DI等更多相关知识的信息可以在本站进行查询。
本文标签: