#css #gradient
#css #градиент
Вопрос:
Итак, я хотел бы иметь градиент, который заполняет 100% фона веб-страницы. Для браузеров, которые не могут с этим справиться, подойдет сплошной цвет.
вот мой текущий css:
html {
height: 100%;
}
body {
height: 100%;
margin: 0;
padding: 0;
background-repeat: no-repeat;
background: #afb1b4; /* Old browsers */
background: -moz-linear-gradient(top, #afb1b4 0%, #696a6d 100%) no-repeat; /* FF3.6 */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#afb1b4), color-stop(100%,#696a6d)); /* Chrome,Safari4 */
background: -webkit-linear-gradient(top, #afb1b4 0%,#696a6d 100%); /* Chrome10 ,Safari5.1 */
background: -o-linear-gradient(top, #afb1b4 0%,#696a6d 100%); /* Opera11.10 */
background: -ms-linear-gradient(top, #afb1b4 0%,#696a6d 100%); /* IE10 */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#AFB1B4', endColorstr='#696A6D',GradientType=0 ); /* IE6-9 */
background: linear-gradient(top, #afb1b4 0%,#696a6d 100%); /* W3C */
}
Казалось, что это сработало, пока на странице было мало контента, но поскольку я дополнил страницу дополнительным контентом, навигацией и так далее, внизу теперь немного белого. может быть, 100 пикселей или около того. Я делаю это неправильно? Нужно ли мне где-то компенсировать некоторые отступы?
Комментарии:
1. похоже, отсюда вы получили вот это: colorzilla.com/gradient-editor
2. @Jason, я сделал, это довольно полностью кроссбраузерно, что мне нравится. Однако мне еще предстоит протестировать браузеры, отличные от FF. Эта часть скоро появится.
3. я часто им пользуюсь. он очень кросбраузерный и работает действительно хорошо.
4. Если вас не волнует обратная совместимость (возврат к плоскому цвету), почему бы не избавиться от 6 строк кода и использовать градиент SVG через
background-image: url()
? Он работает в IE9 , FF4, Webkit с незапамятных времен и Opera 10.5. Потому что дополнительные несколько строк кода заставляют меня использовать множество старых браузеров. Я не буду беспокоиться о старых браузерах, но если я могу заставить его работать в большинстве браузеров, это определенно мое предпочтение.
Ответ №1:
Избавьтесь от своих height: 100%
объявлений. Похоже, что установка высоты на 100% просто устанавливает ее равной 100% области просмотра, а не на самом деле 100% самой страницы.
Комментарии:
1. Спасибо, это помогло! Приведенный ниже код, даже с добавлением значения height: 100%, также работал. Тем не менее, удаление высоты кажется правильным способом сделать это.
2. @Jason : Что случилось со скрипкой?
Ответ №2:
Вот расширение моего комментария, чтобы использовать SVG вместо префикса поставщика и проприетарных расширений. Это уменьшает размер CSS и, при использовании некоторых тактик ingenius, может позволить вам использовать один SVG-файл в качестве пакета спрайтов для градиентов (уменьшая общее количество HTTP-запросов).
Сначала создайте свой SVG-файл и градиент (в соответствии со спецификациями вашего вопроса):
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="1" height="500" version="1.1" xmlns="http://www.w3.org/2000/svg">
<g>
<defs>
<linearGradient id="ui-bg-grad" x1="0%" x2="0%" y1="0%" y2="100%">
<stop offset="0%" stop-color="#afb1b4" />
<stop offset="100%" stop-color="#696a6d" />
</linearGradient>
</defs>
<rect fill="url(#ui-bg-grad)" x="0" y="0" width="100%" height="500"/>
</g>
</svg>
Далее, вот ваше новое объявление:
html {
height: 100%;
}
body {
height: 100%;
margin: 0;
padding: 0;
background-repeat: no-repeat;
background-color: #afb1b4; /* Old browsers: anything not listed below */
background-image: url("grad.svg"); /** Browsers that support SVG: IE9 , FF4 , Safari 4 (maybe 5), Opera 10
}
Теперь, если вы хотите поддерживать старые браузеры с изображениями в формате png, вы можете внести одно небольшое изменение. Поскольку любое свойство, которое использует url()
, не поддерживает отображение подсказок (например, свойство @font-face
‘s src
), вам придется немного изменить правило.
html {
height: 100%;
}
body {
height: 100%;
margin: 0;
padding: 0;
background-repeat: no-repeat;
background-color: #afb1b4; /* Image fails to load, or FF3.5 */
background-image: url("grad.png"); /* Old browsers: anything not listed below or above */
}
body:not(foo) { /* most browsers that support :not() support SVG in url(), except FF3.5 */
background-image: url("grad.svg"); /* Browsers that support SVG: IE9 , FF4 , Safari 4 (maybe 5), Opera 10 */
}
Если вы хотите сойти с ума от глупости, вы могли бы закодировать SVG-файл в base64encode, чтобы вам не приходилось загружать другой файл с сервера, а затем добавлять его в качестве класса для повторного использования (предотвратите повторное использование base64 в нескольких местах).
.svg-sprite:not(foo)
{
background-size: 100% 100%;
background-image: url("data:image/svg xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSI1MDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Zz48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InVpLWJnLWdyYWQiIHgxPSIwJSIgeDI9IjAlIiB5MT0iMCUiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjYWZiMWI0IiAvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzY5NmE2ZCIgLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCBmaWxsPSJ1cmwoI3VpLWJnLWdyYWQpIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSI1MDAiLz48L2c PC9zdmc ");
}
html {
height: 100%;
}
body {
height: 100%;
margin: 0;
padding: 0;
background-repeat: no-repeat;
background-color: #afb1b4; /* Image fails to load, or FF3.5 */
background-image: url("grad.png"); /* Old browsers: anything not listed below or above */
}
Затем обновите свой body
тег, чтобы включить .svg-sprite
класс.
Комментарии:
1. Я бы проголосовал за это, если бы у меня была репутация 15. Фантастический, подробный ответ. Очень признателен!
2. @К сожалению, np. У меня просто проблема с тем фактом, что идеально переносимая и стабильная спецификация не оказывает такого большого влияния, как градиенты css (которых все еще очень много в разработке).
Ответ №3:
Я также обнаружил, что добавление ‘fixed’ в конец, похоже, помогло:
body {
margin: 0;
padding: 0;
background-repeat: no-repeat;
background: #afb1b4; /* Old browsers */
background: -moz-linear-gradient(top, #afb1b4 0%, #696a6d 100%) fixed no-repeat; /* FF3.6 */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#afb1b4), color-stop(100%,#696a6d)) fixed; /* Chrome,Safari4 */
background: -webkit-linear-gradient(top, #afb1b4 0%,#696a6d 100%) fixed; /* Chrome10 ,Safari5.1 */
background: -o-linear-gradient(top, #afb1b4 0%,#696a6d 100%) fixed; /* Opera11.10 */
background: -ms-linear-gradient(top, #afb1b4 0%,#696a6d 100%) fixed; /* IE10 */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#AFB1B4', endColorstr='#696A6D',GradientType=0 ); /* IE6-9 */
background: linear-gradient(top, #afb1b4 0%,#696a6d 100%) fixed; /* W3C */
}
Комментарии:
1. Обратите внимание, что это резко снизит производительность даже в более новых браузерах!
2. Полезно знать! Действительно ли изображение лучший способ сделать это?
3. Зависит от того, что вы вызываете better…as Я вижу проблему с производительностью (это, безусловно, должно быть ошибкой) большое дело, я бы так сказал, да! Если бы не это, метод css3, безусловно, был бы лучше.