Подтвердить что ты не робот

Нет элемента p в области видимости, но p end tag seen.w3c validation

Мой HTML выглядит так, как показано ниже. Я открыл все элементы и закрыл их. Тем не менее, когда я проверяю его на w3c, он показывает ошибку. Я не могу понять это.

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Untitled Document</title>
    </head>

    <body>
        <p>
            <div class="inr_content clearfix">
                 <div class="col2 first fl">
                      to provide a drive-in services.
                 </div>
                 <div class="col2 last fr">
                      to provide a drive-in services.
                 </div>
            </div>
        </p>
    </body>
</html>
4b9b3361

Ответ 1

Это потому, что вы вложен элемент уровня блока внутри тега p, который является недопустимым. Вы можете вставлять только встроенные элементы, такие как span, a и img внутри тега p. Таким образом, ваша разметка недействительна, подумайте о том, чтобы сделать что-то вроде

<div class="inr_content clearfix">
   <div class="col2 first fl">
      <p>to provide a drive-in services.</p>
   </div>
   <div class="col2 last fr">
      <p>to provide a drive-in services.</p>
   </div>
</div>

Из W3C [1]:

Элемент P представляет собой абзац. Он не может содержать уровень блока элементов (включая сам P).

1 - Ссылка

Ответ 2

Поскольку синтаксис элемента p не позволяет дочернию div, а конечный тег </p> может быть опущен, валидатор (и браузер) подразумевает </p>, когда он встречает тег <div> при разборе элемента p. То есть, когда p анализируется (или "открыто" ), начальный тег элемента div неявно закрывает его, как если бы разметка имела:

<body>
    <p>
        </p><div class="inr_content clearfix">
             <div class="col2 first fl">

Это означает, что есть элемент p, в котором есть только пробелы. Тег </p>, который появляется позже, поэтому не имеет соответствующего начального тега, и он считается недействительным. Браузеры игнорируют такие бездомные конечные теги, но валидаторы должны сообщать о них.

Минимальное изменение заключается в удалении тега </p>. Является ли это адекватным, зависит от того, что вы хотите. Удаление тега <p> также приведет к удалению элемента p, и это повлияет на рендеринг. Несмотря на то, что элемент p не имеет обработанного контента (высота содержимого равна 0), он имеет верхнее и нижнее поля по умолчанию, что позволяет создать пустое вертикальное пространство.

Если вы не хотите такое пространство, просто удалите тег <p> (вместе с </p>, конечно). Если вам нужно какое-то место, обычно лучше удалить тег, но затем вы добавите в CSS некоторое подходящее значение margin-top для элемента верхнего уровня div.

Даже если элементы p, содержащие только пробелы, разрешены в HTML5, они не рекомендуются. Это часть общей рекомендации, относящейся к так называемому ощутимому контенту: "элементы, модель контента которых позволяет любому содержимому потока или фразирующему контенту иметь как минимум один node в своем содержании, который является ощутимым контентом". И текст обычно является ощутимым контентом, но не если он состоит только из пробелов.

Ответ 3

Вы не можете семантически поместить div внутри тега <p>.