#css #fluid-layout #gradient #angle
#css #fluid-layout (текучий макет) #градиент #угол
Вопрос:
Итак, у меня есть два смежных плавных раздела, которые могут изменять свою ширину при изменении размера устройства, когда пользователь изменяет размер шрифта в браузере или при масштабировании браузера с помощью Ctrl .
Я хочу иметь диагональ, которая пересекает оба раздела, вот так:
_____
|blah|
|blah|
|blah|
| /| <--- First div or section
|__/_|
| / | <--- Second div or section
|/ |
|blah|
|blah|
|blah|
|____|
<----> fluid width
Я пытаюсь сделать это с помощью CSS, чтобы избежать загрузки изображений и выполнения дополнительных http-запросов. Итак, я использую линейные градиенты. Проблема в том, что угол диагонали должен меняться при увеличении или уменьшении ширины его контейнера, в противном случае диагональ разрывается.
Смотрите скрипку здесь: http://dabblet.com/gist/50db5e6220b5ba557b9e
Для справки, код вышеупомянутой скрипки является:
/*
* Diagonal that crosses both divs without breaking
*/
div, p{margin:0;}
div{padding:0 1em;}
.one{
background: #f06;
background: linear-gradient(170deg, #f06 80%, yellow 80%, yellow);
font-size: 200%
}
.two{
background: yellow;
background: linear-gradient(170deg, #f06 20%, yellow 20%, yellow);
font-size: 200%
}
И html:
<div class="one"><!-- foo --></div>
<div class="two"><!-- bar --></div>
Я пытался изменить размер фона, положение фона, происхождение фона, единицы измерения с em на px, px на%, цвет останавливается и т.д. У меня закончились идеи.
Мой вопрос в том … есть ли способ сделать угол в градиенте зависимым от ширины контейнера (каким-либо косвенным образом), чтобы при изменении его размера диагональ меняла свой угол? Я хотел бы чисто CSS-решение (без JavaScript).
Если это проблема, не имеющая решения, все в порядке =)
Ответ №1:
Вы могли бы использовать этот обходной путь:
<div class="wrapper">
<div class="bg"></div>
<div class="one"><!-- foo --></div>
<div class="two"><!-- bar --></div>
</div>
.wrapper {
position: relative;
}
.bg {
z-index: -1;
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
background: linear-gradient(to bottom right, #f06 50%, yellow 50%, yellow);
}
Комментарии:
1. @Eric Обходным путем является установка фона на
.bg
вместо разделения его между.one
и.two
.2. Спасибо, что нашли время попробовать! =) Разумно установить bg в другом элементе, чтобы он хорошо адаптировался. Однако вам нужно добавить дополнительный div ради оформления, что не так приятно. НО идея все равно классная, поэтому я решил попробовать использовать псевдоэлементы вместо этого (используя :before) . Проблема в том, что тогда содержимое divs должно иметь более высокий набор z-индексов. Я продолжу думать… Еще раз спасибо!
Ответ №2:
Я думаю, вы можете сделать это, используя background-size и no-repeat. ДЕМОНСТРАЦИЯ
.one{
background: #f06;
background: linear-gradient(to bottom right, #f06 50%, yellow 50%, yellow) right #f06 ;
background-size: 50% 100%; 100% 50% ;
background-repeat:no-repeat;
font-size: 200%
}
.two{
background: yellow;
background: linear-gradient(to bottom right, #f06 50%, yellow 50%, yellow) left yellow ;
background-size: 50% 100%; 100% 50% ;
background-repeat:no-repeat;
font-size: 200%
}
НО это будет выглядеть забавно, если оба div будут иметь разную высоту: DEMO
По моему собственному мнению, вам лучше установить градиент внутри родительского контейнера (body для вашего dabblet), если вы не хотите, чтобы угол градиента нарушался.
Комментарии:
1. Спасибо за ваш ответ. Это правда, я фокусировался только на ширине для адаптивных тестов, но высота также влияет на угол. Одна из проблем настройки градиента в родительском контейнере заключается в том, что там будет более двух разделов, однако ваше решение дало мне больше идей для тестирования. Я попытаюсь найти какой-нибудь обходной путь. Спасибо!