Переменные в запросах мультимедиа CSS Stylus
Я пробовал все, но я не могу заставить препроцессор Stylus CSS использовать переменные в запросах мультимедиа.
например, это не работает:
t = 1000px
@media screen and (max-width: t)
    html
        background blue
кто-нибудь знает, как это сделать?
10 ответов
Это печально, но вы не можете использовать переменные или интерполяции на запросы СМИ. Вчера я наткнулся на подобную задачу и пришел с этим решением:
t = 1000px
unquote("@media screen and (max-width: " + t + ") {")
html
    background blue
unquote("}")
это не красиво, но это работает - вы можете использовать unquote чтобы обойти большинство таких проблем стилуса на самом деле.
похоже, стилус поддерживает немного более чистый способ сделать то же самое, что и это pull-запрос.
здесь, учитывая размер блока, я могу сделать стили, которые центрируют контейнер на странице, и установить размер контейнера равным 1, 2 или 3 блокам в зависимости от размера браузера.  Позволяя медиа-запросу быть переменной (вместо того, чтобы вставлять переменные внутри строки медиа-запроса), делает его немного чище, чем использование unquote метод metioned выше.
/* in app.styl */
full_block_width = 300px
three_blocks = "all and (min-width: " + 3*full_block_width + ")"
two_blocks = "all and (min-width: " +  2*full_block_width + ") and (max-width: " + (3*full_block_width - 1) + ")"
one_block = "all and (max-width: " + (2*full_block_width - 1) + ")"
.container 
  margin: auto
@media three_blocks
  .container 
    width: (3*full_block_width)
@media two_blocks
  .container 
    width: (2*full_block_width)
@media one_block
  .container 
    width: full_block_width
Это то, что работал для меня.
medium = 'screen and (min-width: 768px)'
large = 'screen and (min-width: 992px)'
xlarge = 'screen and (min-width: 1200px)'
.box
    background: #000
    @media medium
        background: #111
    @media large
        background: #222
    @media xlarge
        background: #333
с версией 0.43.0 Stylus медиа-запросы поддерживаются либо так, как у вас есть в вашем примере, либо без двоеточия, как это:
t = 1000px
@media screen and (max-width t)
    html
        background blue
Я написал миксин, хотя это тоже не совсем идеально:
// media
media(args...)
  output = null
  for arg in args
    // check for tuple
    if arg[1]
      push(output,unquote('(%s: %s)' % (arg[0] arg[1])))
    else
      push(output,unquote(arg))
  unquote(s('%s',output))
его можно использовать так:
$_media = media(screen,'and',(min-width $screen-tablet))
@media $_media
  .container
    max-width 728px
вывод CSS:
@media  screen and (min-width: 768px) {
  .container {
    max-width: 728px;
  }
}
теперь это поддерживается из коробки,фрагмент с официальной страницы:
foo = 'width'
bar = 30em
@media (max-{foo}: bar)
body
    color #fff
работает:
t = 1000px
@media screen and (max-width: t)
    html
        background blue
http://stylus-lang.com/docs/media.html
из документации:
интерполяции и переменные
вы можете использовать как интерполяции, так и переменные внутри медиа-запросов, поэтому можно делать такие вещи:
foo = 'width'
bar = 30em
@media (max-{foo}: bar)
  body
    color #fff
Это даст
@media (max-width: 30em) {
  body {
    color: #fff;
  }
}
также можно использовать выражения внутри MQ:
.foo
  for i in 1..4
    @media (min-width: 2**(i+7)px)
      width: 100px*i
даст к
@media (min-width: 256px) {
  .foo {
    width: 100px;
  }
}
@media (min-width: 512px) {
  .foo {
    width: 200px;
  }
}
@media (min-width: 1024px) {
  .foo {
    width: 300px;
  }
}
@media (min-width: 2048px) {
  .foo {
    width: 400px;
 }
}
Если я могу предоставить чистый и читаемый способ, я использую хэши в своих интересах так:
// Custom media query sizes
--query = {
    small: "screen and (min-width: 554px)",
    medium: "screen and (min-width: 768px)",
    large: "screen and (min-width: 992px)",
    extra-large: "screen and (min-width: 1200px)",
}
и как бы я это назвал, например:
.main-logo
    font-large(--font.uni-sans-heavy)
    position: relative
    top: 50px
    left: 35px
    .logo-first
        color: --color.white
        margin-right: 3px
    .logo-second
        color: --color.bright-red
    @media --query.large
        left: 70px
супер очевидный, и легкий для чтения. Пусть все будет просто и красиво.
мне нравится создавать media mixin, что делает ненужным создание именованной переменной для медиа-запроса:
media(query)
  @media query
    {block}
использование происходит следующим образом:
+media("screen and (min-width:" + width + "), print")
  .class
    foo: bar
Мне понравился ответ от Тони Тай Нгуен. Вот еще одна итерация:
sizes = {
  mobile: 0 768
  tablet: 769 1023
  desktop: 1024 1215
  widescreen: 1216 1407
  fullhd: 1408 99999999
}
query = {}
for name, pxs in sizes
  min = '(min-width:' + pxs[0] + 'px)'
  max = '(max-width:' + pxs[1] + 'px)'
  query[name] = min + ' and ' + max
  query[name + '-up'] = 'screen and ' + min
  query[name + '-down'] = 'screen and ' + max
// Usage: @media query.mobile or @media query.tablet-up etc...