Less CSS 扩展和媒体查询
Less CSS Extend and media queries
我有一些 Less 实用程序用作扩展 - 这是一个典型的场景。
.clearfix
{
&:before,
&:after {
content:"";
display:table;
}
&:after {
clear:both;
}
}
但是,我现在发现自己在使用媒体查询,而扩展并没有很好地扩展到所有这些场景。
我想做的是声明一次代码并重用它。我想出了这个有效的模式,并允许我在媒体查询中或任何适合的地方使用该实用程序。
问题是我做错了,扩展应该在媒体查询中工作,或者有更好的解决方法。
.clearfix
{
@clearfix();
}
@clearfix :
{
&:before,
&:after {
content:"";
display:table;
}
&:after {
clear:both;
}
};
提前致谢。
Extend
内部媒体查询只能扩展同一媒体查询块中定义的样式。原因很明显:由于扩展选择器附加到扩展样式选择器列表,媒体查询受限选择器全局定义样式的 extend
将意味着该媒体特定选择器泄漏到全局范围,从而违反了媒体查询块的用途。
换句话说,如果你有类似的东西:
.clearfix {
/* bla-bla-bla */
}
@media foo {
.some-div:extend(.clearfix) {
// some media specific styles
}
}
并希望获得以下内容CSS:
.clearfix,
.some-div {
/* bla-bla-bla */
}
@media foo {
.some-div {
/* some media specific styles */
}
}
您还需要通过将扩展部分移至全局范围来明确说明您的意图,例如:
.clearfix {
/* bla-bla-bla */
}
.some-div:extend(.clearfix) {}
@media foo {
.some-div {
/* some media specific styles */
}
}
或者:
.clearfix {
/* bla-bla-bla */
}
.some-div {
&:extend(.clearfix);
@media foo {
/* some media specific styles */
}
}
@seven-phases-max 确实回答了您关于媒体查询中 extend 的问题,但没有回答您关于所用解决方案的问题。
我认为您使用的是 detached ruleset where you should use a mixin。你可能想知道为什么你应该更喜欢 mixin?我认为使用混合将使您的代码更可重用(和可扩展)。
当我在我的项目中import以下代码时:
@set: {
p1: 0;
p2: 1;
p3: 2;
}
当我想为每个 @set()
调用设置 p4:3
时,由于变量的最后声明获胜规则,我需要定义:
@set: {
p1: 0;
p2: 1;
p3: 2;
p4: 3;
}
以上重复前三个属性(将来可能会更改)。
对来自我的库的 mixins 做同样的事情:
.set() {
p1: 0;
p2: 1;
p3: 2;
}
在我导入上述 mixin 的项目中,我只需要定义:
.set() {
p4: 3;
}
但是当使用媒体查询时,分离的规则集确实可以帮助您使代码更干(在一个地方定义一次媒体查询)。示例:
.large-screens(@rules) {
@media (min-width: 1200px) {
@rules();
}
}
header {
width: 600px;
.large-screens({width: 100%; max-width: 1500px;})
}
以上编译成CSS如下:
header {
width: 600px;
}
@media (min-width: 1200px) {
header {
width: 100%;
max-width: 1500px;
}
}
我有一些 Less 实用程序用作扩展 - 这是一个典型的场景。
.clearfix
{
&:before,
&:after {
content:"";
display:table;
}
&:after {
clear:both;
}
}
但是,我现在发现自己在使用媒体查询,而扩展并没有很好地扩展到所有这些场景。
我想做的是声明一次代码并重用它。我想出了这个有效的模式,并允许我在媒体查询中或任何适合的地方使用该实用程序。
问题是我做错了,扩展应该在媒体查询中工作,或者有更好的解决方法。
.clearfix
{
@clearfix();
}
@clearfix :
{
&:before,
&:after {
content:"";
display:table;
}
&:after {
clear:both;
}
};
提前致谢。
Extend
内部媒体查询只能扩展同一媒体查询块中定义的样式。原因很明显:由于扩展选择器附加到扩展样式选择器列表,媒体查询受限选择器全局定义样式的 extend
将意味着该媒体特定选择器泄漏到全局范围,从而违反了媒体查询块的用途。
换句话说,如果你有类似的东西:
.clearfix {
/* bla-bla-bla */
}
@media foo {
.some-div:extend(.clearfix) {
// some media specific styles
}
}
并希望获得以下内容CSS:
.clearfix,
.some-div {
/* bla-bla-bla */
}
@media foo {
.some-div {
/* some media specific styles */
}
}
您还需要通过将扩展部分移至全局范围来明确说明您的意图,例如:
.clearfix {
/* bla-bla-bla */
}
.some-div:extend(.clearfix) {}
@media foo {
.some-div {
/* some media specific styles */
}
}
或者:
.clearfix {
/* bla-bla-bla */
}
.some-div {
&:extend(.clearfix);
@media foo {
/* some media specific styles */
}
}
@seven-phases-max 确实回答了您关于媒体查询中 extend 的问题,但没有回答您关于所用解决方案的问题。
我认为您使用的是 detached ruleset where you should use a mixin。你可能想知道为什么你应该更喜欢 mixin?我认为使用混合将使您的代码更可重用(和可扩展)。
当我在我的项目中import以下代码时:
@set: {
p1: 0;
p2: 1;
p3: 2;
}
当我想为每个 @set()
调用设置 p4:3
时,由于变量的最后声明获胜规则,我需要定义:
@set: {
p1: 0;
p2: 1;
p3: 2;
p4: 3;
}
以上重复前三个属性(将来可能会更改)。
对来自我的库的 mixins 做同样的事情:
.set() {
p1: 0;
p2: 1;
p3: 2;
}
在我导入上述 mixin 的项目中,我只需要定义:
.set() {
p4: 3;
}
但是当使用媒体查询时,分离的规则集确实可以帮助您使代码更干(在一个地方定义一次媒体查询)。示例:
.large-screens(@rules) {
@media (min-width: 1200px) {
@rules();
}
}
header {
width: 600px;
.large-screens({width: 100%; max-width: 1500px;})
}
以上编译成CSS如下:
header {
width: 600px;
}
@media (min-width: 1200px) {
header {
width: 100%;
max-width: 1500px;
}
}