Написание расширения для плагина У меня есть возможность изменить все атрибуты элемента HTML с помощью PHP.
$attributes["style"] .= 'padding-left:10px;';
array_push($attributes["class"], "long-container");
array_push($attributes["class"], "super smooth");
$attributes["data-whatever"] = "great";
Теперь я хочу дать пользователю возможность динамически вводить соотношение ширины / высоты div (решение о том, как это сделать, описано в ответе @Web_Designer здесь: Поддерживать соотношение сторон div с CSS).
В функции, где я могу изменить вывод стороннего плагина, я написал следующий код для вычисления отношения высоты к ширине в соответствии с вводом. Как высота моих ящиков:
if( !empty( $args['stretchy-desktop'] ) ) {
$sd = array_map('trim',explode(":",$args['stretchy-desktop']));
if(count($sd)==2) {
$sd[0] = floatval(str_replace(",",".",$sd[0]));
$sd[1] = floatval(str_replace(",",".",$sd[1]));
if($sd[0]>0 && $sd[1]>0) {
$padding = ($sd[1] / $sd[0])*100;
array_push($attributes['class'], 'stretchy-desktop');
$attributes['style'] .= 'padding-bottom:'.$padding.'%;';
}
}
}
Отлично верно? Однако теперь пользователь хочет ввести различное соотношение веса и роста для мобильных устройств, а также различная динамическая минимальная высота для мобильных устройств и это там я застрял.
1) Невозможно дать встроенные запросы @media прямо сейчас, иначе мое решение было бы таким (Можно ли встроить правила CSS @media?):
$attributes['style'] .= '@media (min-width:540px) {padding-bottom:'.$padding.'%;}@media (max-width:539px) {padding-bottom:'.$padding_mobile.';}';
2) В настоящее время невозможно использовать значения атрибутов HTML в CSS (Значения CSS с использованием атрибута данных HTML5) в противном случае мое решение будет таким:
$attributes['data-desktoppadding'] = $padding;
$attributes['data-mobilepadding'] = $padding_mobile;
В CSS:
@media (min-width:540px) {
.long-container {
padding-bottom: attr(data-desktoppadding);
}
}
@media (max-width:539px) {
.long-container {
padding-bottom: attr(data-mobilepadding);
}
}
3) Поскольку значения являются динамическими числами, я не могу определить класс CSS для каждого возможного существующего числа с плавающей точкой.
Конечно, я мог бы использовать JavaScript, но мы все знаем о существенных недостатках (включая ужасную загрузку страницы).
Можете ли вы придумать какое-нибудь решение CSS для этой дилеммы?
Вот решение, которое я придумал. Это включает создание div-оболочки вокруг целевого элемента. По сути, способ, которым это работает, заключается в том, что внешнему блоку назначаются встроенные стили для мобильного режима, а внутреннему блоку назначаются встроенные стили для режима рабочего стола. Когда размер окна браузера изменяется ниже порогового значения для представления на рабочем столе, оно сбрасывает Внутренний div (рабочий стол) встроенные стили по умолчанию, поэтому внешний div (мобильный) встроенные стили вступают во владение. Когда размер окна браузера изменяется выше порога, он сбрасывает внешний div (мобильный) встроенные стили по умолчанию, поэтому Внутренний div (рабочий стол) встроенные стили вступают во владение. Он переопределяет встроенные стили с помощью !important
ключевое слово в наборах правил в медиазапросах CSS.
Я думаю, что само собой разумеется, что встроенные стили в фрагменте ниже будут заменены вашими $attributes['style']
, Но так как у вас будут разные стили для мобильных и настольных компьютеров, я думаю, это будет $attributes['style-mobile']
а также $attributes['style-desktop']
,
@media (min-width:540px) {
.padding-mobile {
padding-bottom:0 !important;
width: auto !important;
}
}
@media (max-width:539px) {
.padding-desktop {
padding-bottom:0 !important;
width: auto !important;
}
}
<div class="padding-mobile" style="width:100%;background-color:red;padding-bottom:100%;">
<div class="padding-desktop" style="width:50%;background-color:red;padding-bottom:25%;"></div>
</div>
Элегантный подход, который работает в большинство основных браузеров это использование пользовательские свойства. Они в основном переменные в CSS. На момент написания статьи (2017-03-27), только IE и Edge не поддерживают это, хотя работают над поддержкой Edge.
Вы бы добавили переменные к $attributes['style']
и фактически применять их в таблице стилей внутри медиа-запроса. Затем они динамически используются браузером.
Я реализовал демонстрацию в виде фрагмента, но потому что легче изменить размер области просмотра на JSFiddle, также копия демо там. Обратите внимание, что отзывчивая точка останова определяется здесь в CSS, а переменные определяются во встроенных стилях элемента.
.container {
width: 200px;
}
.block {
position: relative;
display: block;
box-sizing: border-box;
width: 100%;
height: 0;
padding: 10px;
padding-bottom: var(--desktop-ratio);
background: #bada55;
color: #444;
}
@media (min-width: 540px) {
.mobile {
display: none;
}
}
@media (max-width: 539px) {
.desktop {
display: none;
}
.block {
padding-bottom: var(--mobile-ratio);
}
}
<div class="container">
<div class="block" style="--desktop-ratio: 56.25%; --mobile-ratio: 200%;";>
My aspect ratio is set via custom properties. It is <span class="mobile">1:2</span><span class="desktop">16:9</span>.
</div>
</div>
По крайней мере, на данный момент невозможно установить точку останова с помощью переменной. То есть,
@media (min-width: var(--breakpoint)) { ... }
является по-видимому не поняли по крайней мере Firefox и Chrome на данный момент.
В качестве альтернативы, опираясь на Кодос Джонсонответ: если у вас есть только одна точка останова, вы можете использовать padding-bottom
а также padding-top
, Один из них определяет соотношение сторон на маленьких экранах, а другой — на больших экранах. Это избавляет от необходимости добавлять элемент-обертку. Вот пример, основанный на одном из Ответ Кодоса.
@media (min-width:540px) {
.block {
padding-top: 0 !important;
}
}
@media (max-width:539px) {
.block {
padding-bottom: 0 !important;
}
}
<div class="block" style="width: 50%;
padding-bottom: 25%;
padding-top: 100%;
background-color: red;">
</div>