老问题,我知道;只是觉得我会根据我正在做的事情提供一个替代方案和扩展示例。
我遇到了这个问题,因为我希望将一个 SCSS 文件用于较小的屏幕,而将一个 SCSS 文件用于较大的屏幕(桌面上的顶部菜单导航和手机的汉堡菜单)。
在没有 Bootstrap 的情况下使用 Blazor,我想根据实际的 html 使用一个菜单结构,然后使用 SCSS 在相关大小的两者之间切换。我为导航的桌面版本创建了一个 SCSS 文件,并开始为移动版本创建一个。在我意识到这个绊脚石之前,我的计划是根据 mixin(恰当地命名为mobileOrDesktop
)中的媒体查询选择性地导入 SCSS。
我的想法是使用这个 mixin 来对媒体大小进行所有基本结构操作。像这样的东西:
@mixin mobileOrDesktop {
@media (min-width: 961px) {
@import 'desktopNavbar.scss';
.container-fluid {
margin-top: 70px;
height: calc(100% - calc(60px + 70px));
}
//show the footer, maybe tweak the font size, etc
}
@media (max-width:960px) {
@import 'moblieNavbar.scss';
.container-fluid {
height: 100%;
}
//hide the footer, maybe tweak font sizes, etc
}
}
不幸的是,由于 SCSS 的工作方式,我们无法做到这一点。因此,我不只是在媒体查询中转储所有 CSS(我想让它相对分开,以便调试/更改更易于管理),而是寻找替代方案。
与 Cinnamon 类似,我发现最可行的解决方案是将 SCSS 导入到 mixin 之外,然后简单地将其包含在 mixin 中:
@import 'desktopNavbar.scss';
@import 'mobileNavbar.scss';
@mixin mobileOrDesktop {
@media (min-width: 961px) {
@include desktopNavbar;
.container-fluid {
margin-top: 70px;
height: calc(100% - calc(60px + 70px));
}
}
@media (max-width:960px) {
@include moblieNavbar;
.container-fluid {
height: 100%;
}
}
}
导入的 SCSS 文件本身就是一个 mixin,即desktopNavbar.scss
变为:
@import 'siteVariables.scss';
@mixin desktopNavbar {
#navbar {
.burgerIcon {
display: none;
}
.nav {
overflow: hidden;
background-color: $navy;
vertical-align: middle;
height: 70px;
line-height: 70px;
color: $blizzard;
position: fixed;
top: 0;
width: 100%;
display: block;
z-index: 99999999;
.leftBlock, .midBlock, .rightBlock {
display: inline-block;
vertical-align: middle;
height: 70px;
padding: 0px;
margin: 0px;
line-height: 70px;
}
.leftBlock {
width: 20%;
.imgLogo {
margin-left: 10px;
margin-top: 5px;
max-width: 120px;
}
}
.midBlock {
width: 60%;
text-align: center;
.navbar-nav {
display: inline-flex;
flex-wrap: nowrap;
flex-grow: 2;
flex-shrink: 2;
list-style: none;
vertical-align: middle;
margin: 0px;
padding: 0px;
.nav-item {
max-width: 175px;
color: $white;
display: inline-block;
vertical-align: middle;
height: 70px;
.btn-link {
font-size: 16px;
text-align: right;
color: $white;
padding: 14px;
line-height: 20px;
text-decoration: none;
vertical-align: middle;
span {
font-family: 'Font Awesome Solid';
line-height: 60px;
height: 60px;
vertical-align: middle;
padding: 5px;
}
}
&.dropdown {
font-size: 16px;
text-align: right;
line-height: 20px;
text-decoration: none;
vertical-align: middle;
.dropbtn {
font-size: 16px;
text-align: right;
line-height: 20px;
text-decoration: none;
vertical-align: middle;
span {
font-family: 'Font Awesome Solid';
line-height: 60px;
height: 60px;
vertical-align: middle;
padding: 5px;
}
}
.dropdown-content {
display: none;
position: fixed;
top: 68px;
text-align: center;
background-color: $star-command;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 99999999999;
.dropdown-header {
color: $blizzard;
}
.dropdown-item {
color: $powder;
padding: 12px 16px;
text-decoration: none;
display: block;
&:hover {
background-color: $blizzard;
color: $navy;
}
}
}
&:hover {
background-color: $star-command;
.dropdown-content {
display: block;
}
}
}
}
}
}
.rightBlock {
width: 20%;
}
}
}
}
站点 SCSS 可以简单地是:
@import '../../FontAwesome/scss/fontawesome.scss';
@import '../../FontAwesome/scss/regular.scss';
@import '../../FontAwesome/scss/solid.scss';
@import 'siteVariables.scss';
@import 'mixins.scss';
//import other stuff here
html, body {
height: 100%;
overflow: hidden;
width: 100%;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif !important;
margin: 0px;
@include mobileOrDesktop;
.container-fluid {
overflow: auto;
main {
padding: 15px;
}
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
.dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
}
}