Используйте абсолютное позиционирование и z-index для создания липкого нижнего колонтитула с любым разрешением, используя следующие шаги:
position: absolute; bottom: 0;
и желаемая высота div
, который обертывает содержимое тела с помощью позиции : relative; min-height: 100%;
div
, равное высоте и дополнению нижнего колонтитула z [] d4] больше, чем контейнер div
, если нижний колонтитул обрезается
Вот пример: [ ! d15]
& lt;! doctype html & gt; & Lt; & HTML GT; & Lt; & головка GT; & lt; title & gt; Липкий нижний колонтитул & lt; / title & gt; & lt; meta charset = "utf-8" & gt; & Lt; & стиль GT; .wrapper {position: relative; мин-высота: 100%; } .footer {position: absolute; внизу: 0; ширина: 100%; высота: 200 пикселей; padding-top: 100px; background-color: серый; } .column {height: 2000px; padding-bottom: 300px; фон-цвет: зеленый; } / * Установите `html`,` body` и container `div` в` height: 100% `для IE6 * / & lt; / style & gt; & Lt; / головка & GT; & Л; тело & GT; & lt; div class = "wrapper" & gt; & lt; div class = "column" & gt; & Lt; & диапазона GT; Привет & л; / & продолжительность GT; & Lt; / дел & GT; & lt; div class = "footer" & gt; & lt; p & gt; Это испытание. Это всего лишь тест ... & lt; / p & gt; & Lt; / дел & GT; & Lt; / дел & GT; & Lt; / тело & GT; & lt; / html & gt;
Синтаксис [e1, e2 .. e3]
- действительно синтаксический сахар для enumFromThenTo e1 e2 e3
, который является функцией в Enum
typeclass.
Стандарт Haskell определяет его семантику следующим образом :
Для типов
Int
иInteger
функции перечисления имеют следующее значение:blockquote>
- Последовательность
enumFrom e1
- это список[e1,e1 + 1,e1 + 2,…]
].- Последовательность
enumFromThen e1 e2
- это список[e1,e1 + i,e1 + 2i,…]
, где приращениеi
равноe2 − e1
. Инкремент может быть нулем или отрицательным. Если приращение равно нулю, все элементы списка одинаковы.- Последовательность
enumFromTo e1 e3
- это список[e1,e1 + 1,e1 + 2,…e3]
. Список пуст, еслиe1 > e3
.- Последовательность
enumFromThenTo e1 e2 e3
- это список[e1,e1 + i,e1 + 2i,…e3]
, где приращениеi
равноe2 − e1
. Если приращение положительное или ноль, список заканчивается, когда следующий элемент будет больше, чемe3
; список пуст, еслиe1 > e3
. Если приращение отрицательное, список заканчивается, когда следующий элемент будет меньшеe3
; список пуст, еслиe1 < e3
.Это в значительной степени то, что вы ожидаете, но экземпляры
Float
иDouble
определяются по-разному:Для
blockquote>Float
иDouble
семантика семействаenumFrom
задана правилами дляInt
выше, за исключением того, что список заканчивается, когда элементы становятся большеe3 + i∕2
для положительного приращенияi
или когда они становятся меньшеe3 + i∕2
для отрицательныхi
.Я не совсем уверен, что оправдание для этого, поэтому единственный ответ Я могу дать вам то, что это так, потому что он определен таким образом в стандарте.
Вы можете обойти это, перечислив использование целых чисел и преобразовывая его в
Float
.Prelude> map fromIntegral [1, 3 .. 10] :: [Float] [1.0,3.0,5.0,7.0,9.0]
Хорошо, Хеннинг Махольм уже сказал это в своем комментарии, но он не объяснил, почему это на самом деле является лучшим решением.
Прежде всего, чтобы сказать: имея дело с плавающей точкой, мы должны всегда знать о возможных ошибках округления. Когда мы пишем [0.0, 0.1 .. 1.0]
, мы должны знать, что все эти числа, кроме первого, не будут в точном месте десятых. Где нам нужна эта определенность, мы вообще не должны использовать поплавки.
Но, конечно, существует много приложений, в которых мы довольны разумным определенным, скорость. Вот где поплавки великолепны. Одним из возможных применений такого списка было бы простое трапецеидальное числовое интегрирование:
trIntegrate f l r s = sum [ f x | x<-[l,(l+s)..r] ] * s - (f(l)+f(r))*s/2
давайте проверим это: trIntegrate ( \x -> exp(x + cos(sqrt(x) - x*x)) ) 1.0 3.0 0.1
=> 25.797334337026466 по сравнению с 25.9144 ошибка меньше, чем один процент. Конечно, не точно, но это присуще методу интеграции.
Предположим теперь, что диапазоны float были определены так, что они всегда заканчиваются при пересечении правой границы. Тогда было бы возможно (но мы не можем быть уверены в этом!), Что в сумме вычисляются только 20 значений, а не 21, потому что последнее значение x
оказывается равным 3.000000. Мы можем имитировать этот
bad_trIntegrate f l r s = sum [ f x | x<-[l,(l+s)..(r-s)] ] * s - (f(l)+f(r))*s/2
, после чего получим
bad_trIntegrate ( \x -> exp(x + cos(sqrt(x) - x*x)) ) 1.0 3.0 0.1
=> 21.27550564546988 urgh!
Это не имеет ничего общего со скрытием проблем с плавающим точка. Это всего лишь способ помочь программисту легче обойти эти проблемы. Фактически, противоположный результат [1, 3 .. 10] :: Float
помогает запомнить эти проблемы!
Integral
. - В интервале дробных чисел (в отличие от целочисленного) всегда можно выбрать размер шага, размер интервала которого является интегральным кратным. В этом случае диапазоны Rational
s и диапазоны Float
s ведут себя так, как можно было бы интуитивно ожидать, поэтому мы должны просто убедиться, что это условие всегда выполняется.
– leftaroundabout
14 February 2012 в 16:03
sum [dx * sqrt (1 - x) | x <- [0.0, dx .. 1]]
возвращает NaN
для dx = 0.001
, потому что «перерегулирование» оставляет область интегрированной функции. Я не уверен, что это того стоит.
– undur_gongor
26 April 2018 в 19:26
sqrt (1 - 1)
, это не имеет значения. Опять я утверждаю, что явно неверный i> NaN менее плох, чем разумно звучащий, но неточно-точный номер с плавающей запятой. - Чтобы быть действительно уверенным в таких вещах, использование плавающих элементов, которые могут касаться границ домена, является принципиально неправильным подходом; следует вычислять средние точки ячейки i> вместо этого или использовать только синтаксис диапазона для межклеточных границ, но отдельно устанавливать внешние границы.
– leftaroundabout
26 April 2018 в 19:32
[0.0, 0.1 .. 1.0]
, работать более или менее, как то, что наивно ожидало бы, не зная о неточности с плавающей запятой. – Henning Makholm 3 September 2011 в 02:21e3
будет в последовательности[e1, e1+i ..]
, игнорируя неточности. В примере OPe3
находился на полпути между двумя значениями, что в некотором смысле является наихудшим сценарием для этого предположения. – hammar 3 September 2011 в 02:39enumFromThenTo
будет продолжать добавлять приращение и принимать элементы, пока они равны & lt; = верхняя граница. Получение элемента над верхней границей очень сбивает с толку. – augustss 5 September 2011 в 11:21