Как стилизовать элементы HTML с границами, тенями и контурами в CSS

Автор выбрал Фонд разнообразия в технологиях для получения пожертвования в рамках программы Напиши ради пожертвований.

Введение

Работа с тенями, границами и контурами является ключевым компонентом веб-разработки и может обеспечить визуальное определение вокруг элементов HTML и текстовых элементов. Внешний вид границ и теней можно изменять с помощью пяти основных свойств CSS: border, border-radius, box-shadow, text-shadow и outline. Тени придают глубину и помогают выделить элементы, в то время как свойства border могут выполнять множество различных визуальных функций, от создания линейного разделителя между содержимым до определения пространства сетки. Свойство border-radius создает закругленные углы у прямоугольников и даже может создать круглую форму. Наконец, outline – это часто пренебрегаемое свойство, которое предоставляет многофункциональность, аналогичную свойству border, не нарушая при этом поток содержимого.

В этом руководстве вы будете работать с этими свойствами, чтобы создать уведомление о легальности для вымышленной космической туристической компании. На протяжении демонстрации вы создадите визуально насыщенные контейнеры, используя краевые свойства. Кроме того, вы учтете тонкости более сложных значений, таких как множественные тени, и то, как разные браузеры могут реализовывать определенные свойства по-разному.

Предпосылки

Настройка базового HTML и CSS

В этом разделе вы настроите базовый HTML для всех визуальных стилей, которые вы будете описывать в течение учебного пособия. Вы также создадите файл styles.css и добавите стили, которые определят макет содержимого.

Начните с открытия файла index.html в вашем текстовом редакторе. Затем добавьте следующий HTML-код в файл:

index.html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Travel Disclosure - Destination: Moon</title>
    <link href="styles.css" rel="stylesheet" />
  </head>
  <body>
  </body>
</html>

Есть много настроек страницы, определенных внутри элемента <head>. Первый элемент <meta> определяет набор символов, который будет использоваться для текста. Таким образом, большинство специальных символов, таких как ударения, будут отображаться без специальных HTML-кодов. Второй элемент <meta> сообщает браузерам, и в частности мобильным браузерам, как обрабатывать ширину содержимого; в противном случае браузер будет имитировать ширину рабочего стола 960px. Элемент <title> предоставляет браузеру заголовок страницы. Элемент <link> загружает файл CSS, в котором вы будете писать свои стили на протяжении этого руководства.

Странице также понадобится контент для стилизации. Для юридического текста вы будете использовать образцовый контент из Legal Ipsum в качестве заполнителя, предназначенного только для стилей.

Вернитесь к файлу index.html в вашем текстовом редакторе и добавьте выделенный HTML из следующего блока кода:

index.html
<!doctype html>
<html>
  ...
  <body>
    <section class="disclosure-alert">
      <header class="disclosure-header">
        <h2  class="disclosure-title"><em>Destination: Moon</em> Travel Disclosure</h2>
      </header>
      <div class="disclosure-content">
        <p>Although space travel is routine practice, there are many unknown possibilities that any traveller must be aware of before traveling with <em>Destination: Moon</em>. Agreeing to this disclosure of knowns is required prior to purchase of tickets with <em>Destination: Moon</em>. PLEASE, READ AND AGREE TO THE FOLLOWING DISCLOSURE OF TRAVEL UNKNOWNS BEFORE PROCEEDING TO PURCHASE.</p>
        <div class="legal-contents">
          <p>Effect of Termination. Upon termination, You agree not to use it under the terms of Sections 4(a) through 4(e) for that Covered Code, or any third party. Description of Modifications.<p>
          <p>You must make sure that you know you can do these things. To make sure the requirements of this Agreement. REQUIREMENTS A Contributor may participate in any way. Notwithstanding the foregoing, if applicable law or agreed to in writing, the Copyright Holder, but only to the terms applicable to Covered Code. Inability to Comply Due to Statute or Regulation.</p>
          <p>If it is impossible for You to the Recipient retains any such Additional Terms. Versions of This License. If you are re-using, b) a hyperlink (where possible) or URL to the terms of Sections 4(a) through 4(e) for that Work shall terminate if it fails to comply with the exception of content that is granting the License. License Terms 1.</p>
          <p>Grant of Patent Infringement. If you have knowledge of patent infringement litigation, then the only applicable Base Interpreter is a "commercial item" as defined in 48 C.F.R. Consistent with 48 C.F.R.</p>
          <p>U.S. Government End Users acquire Covered Code (Original Code and/or as part of a Larger Work; and b) allow the Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Distributor in writing of such Contributor, if any, to grant more extensive warranty protection to some or all of these conditions: (a) You must make it clear that any Modifications made by such Respondent, or (ii) withdraw Your litigation claim is resolved (such as Wikimedia-internal copying), it is Recipient's responsibility to secure any other exploitation. Program, and in any of the provisions set forth in Section 4(b), you shall terminate if it fails to comply with.</p>
          <p>Please note that these licenses do allow commercial uses of your company or organization, to others outside of this License Agreement), provided that You meet the following terms which differ from this License) and (b) You must duplicate the notice in Exhibit A in each changed file stating how and when you changed the files and the definitions are repeated for your past or future use of the Original Code; or 3) for infringements caused by: i) third party against the drafter will not be used as a handle): 1895.22/1011. This Agreement shall be held by the terms of this agreement. If any provision of this license which gives you legal permission to modify NetHack, or otherwise using this software in source and binary forms, with or without modification in printed materials or in related documentation, stating that you provide a service, including but not limited to the terms under which you distribute, wherever you describe the origin or ownership of such termination, the Recipient a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6b1 or any part of Derivative Works. If You initiate litigation by asserting a patent infringement against You in that instance.</p>
          <p>Effect of New York and the like. While this license document the following disclaimer in the Work contain all the conditions listed in Clause 6 above, concerning changes from the Work. If you created a Modification, you may at your option offer warranty protection to some or all of the Licensed Program as a product of your Modifications available to others outside of this License.</p>
          <p>Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted to Licensor for inclusion in the documentation and/or other rights consistent with this program; if not, write to the modified files to carry prominent notices stating that You distribute, all copyright, patent, trademark, and attribution notices from the Public Domain or from the Original Code; 2) separate from the Public Domain or from the Work, you may distribute a Compiled Work on their system exactly as it is being maintained, then ask the Current Maintainer to update their communication data within one month. If the program is free software; you can change the License will not have to defend and indemnify every other Contributor to control, and cooperate with the Source Code version of the Licensed Program, or any Contributor.</p>
        </div>
        <div class="button-group">
          <a href="#" class="button button-primary">
            Agree
          </a>
          <a href="#" class="button button-secondary">
            Disagree
          </a>
        </div>
      </div>
    </section>
  </body>
</html>

Сохраните изменения в файле index.html, а затем откройте свой веб-браузер. Выберите пункт меню File, а затем выберите пункт Open и загрузите файл index.html в браузер. Следующее изображение демонстрирует, как этот HTML будет отображаться в браузере:

Создайте новый файл с именем styles.css в той же папке, что и index.html, затем откройте его в текстовом редакторе. В этом файле будут содержаться все стили, используемые во время учебного пособия. Первый набор стилей будет применять общую эстетику, которую вы будете развивать. Примените CSS из следующего блока кода к вашему файлу styles.css:

styles.css
html, body {
  height: 100%;
}

body {
  display: flex;
  margin: 0;
  font: 100% / 1.5 sans-serif;
  background: url("images/moon-bg.jpg") no-repeat fixed center / cover black;
}
.disclosure-alert {
  background-color: hsl(0, 0%, 95%);
  width: 85%;
  max-width: 48rem;
  margin: auto;
  color: hsl(0, 0%, 20%);
}
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
}
.disclosure-title {
  margin: 0;
  font-size: 2rem;
  line-height: 1.25;
}
.disclosure-content {
  margin: 1.5rem;
}
.legal-contents {
  margin-top: 1.5rem;
  background-color: white;
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
.button-group {
  margin-top: 1.5rem;
  display: flex;
  justify-content: center;
}
.button {
  display: inline-block;
  text-align: center;
  padding: 0.5rem 1rem;
  background: black;
  text-decoration: none;
  color: white;
  width: 50%;
  max-width: 8rem;
}
.button + .button {
  margin-left: 1.5rem;
}
.button-primary {
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
}
.button-primary:hover {
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
}
.button-secondary {
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
}
.button-secondary:hover {
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
}

Стили в этом файле устанавливают начальный макет страницы с центрированным юридическим уведомлением, кнопками с интервалами и отображаемыми с помощью линейного градиента, а также изображением луны, используемым в качестве фона. Прежде чем продолжить, убедитесь, что сохранены файл styles.css.

Чтобы отобразить изображение, связанное с свойством background в правилах body, вам понадобится изображение фона Луны. Сначала создайте каталог images в той же папке, что и ваш файл index.html:

  1. mkdir images

Используйте свой браузер, чтобы загрузить этот файл в ваш недавно созданный каталог images, или воспользуйтесь следующей командой curl, чтобы загрузить его через командную строку:

  1. curl -sL https://assets.digitalocean.com/articles/68102/moon-bg.jpg -o images/moon-bg.jpg

Затем вернитесь и обновите свой браузер. Теперь браузер будет рендерить и применять стили к содержимому страницы. Ниже показано, как рендерится вся страница:

Длина содержимого делает страницу очень длинной. Поскольку это предполагается как юридический текст, содержимое .legal-contents может стать областью с прокруткой. Это достигается с помощью комбинации свойств height, max-height и overflow.

Чтобы создать область с прокруткой, откройте файл styles.css в вашем текстовом редакторе. Затем отрегулируйте высоту юридического контента с помощью следующего кода:

styles.css
...
.legal-contents {
  height: 50vh;
  max-height: 20rem;
  overflow: auto;
  margin-top: 1.5rem;
  background-color: white;
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
...

В этом коде вы создали свойство height в блоке селектора .legal-contents, затем установили его значение на 50vh, что означает 50% высоты видимой области окна. Вы также создали свойство max-height со значением 20rem. Наконец, вы добавили свойство overflow со значением auto, которое создает полосу прокрутки, если содержимое выходит за пределы контейнера.

Сохраните эти дополнения в вашем файле styles.css, затем вернитесь в браузер и обновите index.html. Полная высота страницы и основного контейнера сократилась. Теперь текст Legal Ipsum можно прокручивать внутри его назначенного контейнера, как показано на следующей анимации:

На протяжении этого раздела вы настроили основной HTML, который будет использоваться в остальной части учебного пособия. Вы также настроили прокручиваемое пространство с помощью свойства overflow. В следующем разделе вы будете работать со свойством border, чтобы применить границу к этим контейнерам.

Использование свойства border

Свойство border является одним из первоначальных способов применения стилей к краям элементов. Оно применяет линию любого цвета к внешнему периметру контейнера. Значение свойства состоит из трех компонентов: толщины, стиля и цвета. Свойство border применяет эти значения ко всем четырем сторонам элемента. Вы можете указать отдельные стороны с помощью вариаций направления для border, таких как свойство border-top, которое будет применяться только к верхней части элемента.

Для начала работы со свойством border откройте файл styles.css в вашем текстовом редакторе и перейдите к селектору класса .disclosure-alert. Внутри блока селектора добавьте свойство border со значением, установленным на 1px solid hsl(0, 0%, 0%), как показано в следующем блоке кода:

styles.css
...
.disclosure-alert {
  background-color: hsl(0, 0%, 95%);
  width: 85%;
  max-width: 48rem;
  margin: auto;
  color: hsl(0, 0%, 20%);
  border: 1px solid hsl(0, 0%, 0%);
}
...

Это свойство border является сокращенным свойством, что означает, что его значение является комбинацией других значений. В этом случае толщина 1px представляет собой значение свойства border-width. Это значение может быть любым числовым значением с единицей измерения вместе с несколькими именованными значениями: thin, medium и thick. Далее, solid – это значение свойства border-style, которое определяет, как будет выглядеть линия вокруг элемента, в данном случае как сплошная непрерывная линия. Другие значения для border-style включают dotted, dashed, double и none. Последнее значение определяет свойство border-color, которое может быть любым допустимым значением цвета.

Сохраните ваши изменения в styles.css, затем откройте index.html в веб-браузере. Основной контейнер содержимого теперь будет иметь тонкую черную границу вокруг него, что особенно заметно, когда он наложен на фоновое изображение луны. Ниже показано, как border выглядит на основной области контента:

Затем вы можете использовать свойство border, чтобы создать ощущение глубины, применяя свет и тени к элементу. Это можно сделать, используя направленный border на одной стороне, который светлее фонового цвета, а затем более темный цвет на соседней стороне.

Вернитесь к styles.css в вашем текстовом редакторе, затем перейдите к блоку селектора класса .disclosure-header. linear-gradient() на свойстве background определяет темно-пурпурный градиент, переходящий в немного более темный оттенок. Чтобы создать большую глубину, чем просто градиент, отрегулируйте границу с помощью следующего кода:

styles.css
...
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
}
...

Вы добавили свойство border-top со значением 1px solid hsl(300, 50%, 35%), который светлее начального значения градиента. Затем вы создали свойство border-bottom со значением 1px solid hsl(300, 50%, 5%), который немного темнее конца градиента.

Сохраните ваши изменения в styles.css, затем вернитесь в браузер и обновите index.html. Теперь у пурпурного заголовка есть слабое освещение пурпурного цвета вдоль верхней части заголовка и слегка тень снизу. Ниже показано, как это будет выглядеть в браузере:

Поскольку border является свойством shorthand, вы можете добавить дополнительные longhand свойства. Для двух классов кнопок можно применить border, который определяет ширину и стиль, а также border-color, который может быть применен к отдельным классам.

Для начала работы с border-color откройте файл styles.css в вашем текстовом редакторе. В блоке селектора для .button добавьте свойство border со значением 1px solid, затем добавьте свойство border-color для .button-primary и .button-secondary:

styles.css
...
.button {
  ...
  border: 1px solid;
}
...
.button-primary {
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
  border-color: hsl(200, 100%, 15%);
}
.button-primary:hover {
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
  border-color: hsl(200, 100%, 10%);
}
.button-secondary {
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
  border-color: hsl(200, 10%, 15%);
}
.button-secondary:hover {
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
  border-color: hsl(200, 10%, 10%);
}

Это определяет границу стиля 1px шириной solid для обеих кнопок. Затем вы добавили свойство border-color, чтобы настроить цвета для .button-primary, .button-secondary и их соответствующих селекторов :hover.

Сохраните эти изменения в файле styles.css, затем обновите страницу в вашем веб-браузере. Как показано на следующем изображении, кнопки теперь имеют более четкое определение благодаря сочетанию темного цвета границы:

Наконец, каждое направление border также является сокращением. Это означает, что -width, -style и -color могут быть применены к свойствам направления. Например, longhand свойство border-right-color применит цвет только к правой границе.

Для работы с этими направленными свойствами border вернитесь к файлу styles.css в вашем текстовом редакторе. Перейдите к блоку селектора .legal-contents и установите ширину и стиль для всех четырех сторон границы, затем настройте цвета каждой стороны:

styles.css
...
.legal-contents {
  height: 50vh;
  max-height: 20rem;
  margin-top: 1.5rem;
  overflow: auto;
  background-color: white;
  border: 1px solid;
  border-top-color: hsl(0, 0%, 65%);
  border-bottom-color: hsl(0, 0%, 100%);
  border-right-color: hsl(0, 0%, 80%);
  border-left-color: hsl(0, 0%, 80%);
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
...

В этом коде вы добавили border: 1px solid в конец файла. После этого вы также создали свойства border-top-color, border-bottom-color, border-right-color и border-left-color. Для значений вы использовали различные значения hsl() для оттенков серого.

Сохраните ваши изменения в файле styles.css, затем перезагрузите страницу в браузере. Теперь у контейнера прокрутки содержимого есть темно-серая граница сверху, слегка более светлая серая сбоку и белая граница снизу. Это создает впечатление, что содержимое вдавлено за светлый фон, что вызывает эффект, когда подсветка находится на нижнем крае, как показано на следующем изображении:

В этом разделе вы использовали свойство border и его различные расширенные варианты. Вы создали несколько границ, которые применялись к разным сторонам по мере необходимости. В следующем разделе вы будете работать со свойством border-radius, которое позволяет закруглять углы контейнеров.

Применение border-radius

Углы с закруглениями были частью веб-дизайна задолго до появления свойства border-radius, предназначенного для выполнения этой задачи. Это свойство может принимать любые числовые значения или процентные значения и является сокращенным свойством, подобно свойствам margin или padding. Это означает, что каждый угол может быть отрегулирован по отдельности, при необходимости.

Для начала работы со свойством border-radius откройте файл styles.css в вашем текстовом редакторе. Перейдите к блоку селектора .disclosure-alert и свойству border-radius. Затем установите значение 1.5rem, которое будет применено ко всем четырем углам свойства. Выделенный CSS в следующем блоке кода показывает, как это записывается:

styles.css
...
.disclosure-alert {
  ...
  border: 1px solid hsl(0, 0%, 0%);
  border-radius: 1.5rem;
}
...

Сохраните это дополнение в файл styles.css, затем откройте или обновите файл index.html в веб-браузере. Только нижние два угла будут округленными, в то время как верхние два останутся острыми. Ниже приведено изображение, иллюстрирующее, как это отображается в браузере:

Причина того, что видны только два скругленных угла, заключается в том, как взаимодействуют между собой дочерние элементы на веб-странице. Браузер склоняется к тому, чтобы сохранить видимое содержимое. У класса `.disclosure-alert` есть четыре скругленных угла, но из-за того, что класс `.disclosure-header` находится внутри элемента и не имеет скругленных углов, он перекрывает скругленные углы. Быстрое исправление состоит в добавлении `overflow: hidden` к классу `.disclosure-alert`, что заставляет контейнер обрезать любые вложенные контейнеры и содержимое. Однако этот подход может привести к тому, что необходимое содержимое станет нечитаемым или невидимым. Лучшей практикой является применение `border-radius` к классу `.disclosure-header` для соответствия кривизне угла его предка.

Для коррекции перекрывающихся углов вернитесь к файлу `styles.css` в вашем текстовом редакторе. Перейдите к блоку селектора `.disclosure-header` и добавьте свойство `border-radius`. Поскольку нужно только корректировать верхние два угла, значение будет `1.5rem 1.5rem 0 0`:

styles.css
...
.disclosure-header {
  ...
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
  border-radius: 1.5rem 1.5rem 0 0;
}
...

Расширенный формат этого значения применит кривизну `1.5rem` к верхнему левому и верхнему правому углам.

Сохраните ваши изменения в файле `styles.css` и обновите `index.html` в браузере. Теперь фиолетовый заголовок имеет скругленный угол и не перекрывает основной контейнер. Однако появилась новая проблема: белый край родительского контейнера заглядывает из-за фиолетового заголовка, как показано на следующем увеличенном изображении:

Углы как для .disclosure-alert, так и для .disclosure-header имеют одинаковый размер 1.5rem, но их ширина различается. Это различие в размере вызвано границей слева и справа от элемента .disclosure-alert. Поскольку ширина границы составляет 1px с обеих сторон, разница в размере составляет 2px или 0.125rem. Чтобы сделать кривые одинаковыми, значение border-radius для .disclosure-header должно быть на 0.125rem меньше, чем в настоящее время. Измените значения border-radius с 1.5rem на 1.375rem, как показано в следующем блоке кода:

styles.css
...
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
  border-radius: 1.375rem 1.375rem 0 0;
}
...

Сохраните этот изменение в файле styles.css, а затем обновите страницу в веб-браузере. Теперь полоска белого цвета исчезла, и кривые двух элементов соединяются в нужном месте. На следующем увеличенном скриншоте показано, как эти кривые выравниваются:

Наконец, вы примените закругленный угол к кнопкам внизу основного контейнера. Эти кнопки будут иметь форму таблетки, с длинной, плоской верхней и нижней частями и полностью закругленными боками. Для этого значение border-radius должно быть единицей измерения, превышающей высоту элемента.

Чтобы создать кнопку в форме таблетки, откройте файл styles.css в вашем текстовом редакторе. В блоке селектора .button добавьте свойство border-radius и установите значение 2rem. Это может быть произвольное число, лишь бы оно было больше вычисленной высоты, комбинации font-size, line-height, padding и border-width, которые могут влиять на общую высоту элемента. Выделенный CSS в следующем блоке кода показывает, где добавить это свойство:

styles.css
...
.button {
  ...
  border: 1px solid;
  border-radius: 2rem;
}
...

Есть две важные вещи, которые следует отметить в этом подходе. Первое – это то, что значение height не устанавливается для этого элемента. Установка значения height следует избегать, так как содержимое может выходить за границы контейнера. Избегая установки значения height, кнопка может увеличиваться, чтобы соответствовать общему содержимому. Второе – это то, что это не будет работать правильно с процентным значением. Процентные значения свойства border-radius изгибают процент от высоты и ширины, что вызывает овальную форму вместо закругленного угла.

Сохраните ваши изменения в файле styles.css, затем вернитесь в браузер и обновите файл index.html. Теперь на странице будут отображаться две длинные кнопки в форме таблетки, как показано на следующем изображении:

В этом разделе вы использовали свойство border-radius для применения закругленных углов к нескольким элементам, обнаружив, что border-radius не предотвращает выход потомков из закругленного пространства. Вы также изменили значение border-radius, чтобы соответствовать ширине элемента, когда несколько закругленных элементов наложены друг на друга. В следующем разделе вы будете использовать свойство text-shadow для применения теней к текстовому содержимому.

Использование свойства text-shadow

Применение теней к тексту имеет множество применений в повседневной веб-разработке. Тени могут создавать глубину, эффект свечения или помогать тексту выделяться на местах, где его легко можно пропустить. На протяжении этого раздела вы будете применять text-shadow к нескольким элементам для создания различных визуальных эффектов.

Свойство text-shadow состоит из до четырех значений: смещение по оси X, смещение по оси Y, радиус размытия и цвет. В качестве примера значения могут выглядеть так: 2px 4px 10px red. Из этих четырех значений требуются только значения смещения. Цвет тени по умолчанию – это color текста.

Для начала работы с text-shadow вы начнете с создания эффекта свечения в заголовке. Откройте файл styles.css в вашем текстовом редакторе и перейдите к селектору класса .disclosure-header. Внутри блока селектора добавьте следующее свойство text-shadow:

styles.css
...
.disclosure-header {
  ...
  border-radius: 1.375rem 1.375rem 0 0;
  text-shadow: 0 0 0.375rem hsl(300, 50%, 50%);
}
...

A glow effect means the color will emanate from every edge of the text, so the x- and y-axis offset values here are set to 0. You set the blur for the glow to 0.375rem (equivalent to 6px) to give a subtle halo of color to the text. Lastly, the color value was set to a bit darker than the color property: hsl(300, 50%, 50%).

Сохраните этот дополнение в ваш файл styles.css. Затем откройте index.html в веб-браузере. Теперь жирный заголовок на фиолетовом градиентном фоне имеет свечение среднего фиолетового цвета вокруг него. На следующем изображении показано, как этот эффект отображается в браузере:

Затем на текстовых элементах можно разместить несколько теней, что позволяет создать тиснение на тексте. Этот эффект достигается путем размещения светлой тени под объектом и темной тени над ним.

Чтобы создать эффект тиснения, вернитесь к файлу styles.css в вашем текстовом редакторе. Эффект будет добавлен к кнопкам внизу контейнера. Для селекторов .button-primary, .button-primary:hover, .button-secondary и .button-secondary:hover добавьте свойство text-shadow. Просмотрите выделенный CSS в следующем блоке кода для значений:

styles.css
...
.button-primary {
  border: 1px solid hsl(200, 100%, 5%);
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
  text-shadow: 0 1px hsl(200, 100%, 50%),
               0 -1px hsl(200, 100%, 5%);
}
.button-primary:hover {
  border: 1px solid hsl(200, 100%, 0%);
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
  text-shadow: 0 1px hsl(200, 100%, 45%),
               0 -1px hsl(200, 100%, 0%);
}
.button-secondary {
  border: 1px solid hsl(200, 10%, 5%);
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
  text-shadow: 0 1px hsl(200, 10%, 50%),
               0 -1px hsl(200, 10%, 5%);
}
.button-secondary:hover {
  border: 1px solid hsl(200, 10%, 0%);
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
  text-shadow: 0 1px hsl(200, 10%, 45%),
               0 -1px hsl(200, 10%, 0%);
}

Первая тень – это светлый внутренний подсветочный эффект. Это достигается смещением 0 1px, затем используется более светлая версия оттенков фонового градиента. Затем вы создали тень над текстом с смещением 0 -1px, которое поднимает тень на 1px и использует более темные вариации цветов фона.

Сохраните эти изменения в файл styles.css, затем обновите страницу в вашем веб-браузере. Теперь текст внутри кнопок имеет слегка выделенный ниже текста и слегка затененный выше текста. Комбинация этих значений text-shadow создает эффект тиснения, как показано на следующем изображении:

В этом разделе вы применили свойство text-shadow к нескольким элементам. Вы создали эффект свечения на заголовке и тиснение с несколькими тенями на кнопках. В следующем разделе вы будете применять тени к HTML-элементам с помощью свойства box-shadow.

Добавление box-shadow к элементам

Так же как свойство text-shadow позволяет тексту иметь тени, свойство box-shadow позволяет элементам и контейнерам также иметь тени. У свойства box-shadow есть две дополнительные функции, которые вы будете исследовать в этом разделе, включая возможность управлять размытием и устанавливать тень внутри элемента.

Чтобы начать работу со свойством box-shadow, откройте файл styles.css в вашем текстовом редакторе. В блоке селектора .disclosure-alert добавьте свойство box-shadow. Как и в случае с text-shadow, значения смещения по оси x и y обязательны, и если цвет не указан, используется значение свойства color. Для этой первой box-shadow установите смещения на 0, размытие на 0.5rem и цвет на темный hsl(300, 40%, 5%), как показано в следующем коде:

styles.css
...
.disclosure-alert {
  ...
  border-radius: 1.5rem;
  text-shadow: 0 0 0.375rem hsl(300, 50%, 50%);
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%);
}
...

Сохраните изменения в styles.css и обновите страницу в вашем веб-браузере. Теперь у контейнера есть почти черная тень, распространяющаяся от него. Обратите внимание, что тень также следует за кривизной, которую вы создали с помощью свойства border-radius. На следующем изображении показано, как это отображается в браузере:

Затем вернитесь к styles.css и начните создавать более сложный эффект, добавив два дополнительных больших свечения к box-shadow. Добавьте запятую между каждой новой тенью, установив для каждой смещение по оси Y равное 0.5rem. Затем установите большие размытия и используйте более светлые варианты синего и фиолетового цветов из цветовой палитры, как показано в следующем блоке кода:

styles.css
...
.disclosure-alert {
  ...
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%),
              0 0.5rem 6rem hsl(200, 40%, 30%),
              0 0.5rem 10rem hsl(300, 40%, 30%);
}
...

Порядок этих теней имеет значение. Первая тень с почти черным цветом будет отображаться над новыми тенями, и каждая последующая тень добавляется за следующей.

Сохраните ваши изменения в styles.css и обновите страницу в вашем браузере. Как показано на следующем изображении, комбинация нескольких теней создает уникальный эффект:

Функция размытия тени свойства box-shadow может использоваться для создания ощущения глубины. Значение размытия принимает как положительные, так и отрицательные значения. Отрицательное значение размытия в сочетании с сильным смещением и размытием создает тень, которая кажется отдаленной и далекой от исходного контейнера.

Чтобы начать, вернитесь к styles.css в вашем текстовом редакторе. Между темной маленькой тенью и большей синей тенью в селекторе .disclosure-alert добавьте следующий выделенный CSS из блока кода:

styles.css
...
.disclosure-alert {
  ...
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%),
              0 6rem 4rem -2rem hsl(300, 40%, 5%),
              0 0.5rem 6rem hsl(200, 40%, 30%),
              0 0.5rem 10rem hsl(300, 40%, 30%);
}
...

Это дополнение к набору теней сохраняет смещение по оси x на 0, но существенно перемещает ось y на 6rem. Затем размытие не такое большое, как свечение, но имеет приличный размер 4rem. Затем идет значение распространения размытия, которое в этом случае установлено на -2rem. Значение по умолчанию для распространения равно 0, что равно контейнеру. При -2rem распространение будет сжиматься внутрь контейнера, создавая визуальный эффект глубины.

Сохраните ваши изменения в styles.css, затем обновите index.html в браузере. Тень имеет глубокий фиолетовый цвет, создавая ощущение, что главный контентный блок парит над поверхностью луны, как показано на следующем изображении:

Еще одно применение box-shadow – это создание легкого эффекта выделения и тени на фаске, как вы делали ранее с помощью свойства border в заголовке. Преимущество использования box-shadow вместо border состоит в том, что это не влияет на модель блока, что вызывает сдвиги в потоке содержимого. Он также может использоваться совместно с border. При использовании этого эффекта с border значение inset должно быть добавлено к box-shadow, чтобы тень была внутри контейнера.

Чтобы начать использовать значение inset для box-shadow, откройте styles.css в вашем текстовом редакторе. Этот эффект будет добавлен к кнопкам, поэтому вы примените эти стили к .button-primary, .button-primary:hover, .button-secondary и .button-secondary:hover. Подобно text-shadow, это будет состоять из комбинации смещения 0 1px и 0 -1px. Отличие заключается в том, что слово inset может быть добавлено в начало или в конец значения, как показано в следующем блоке кода:

styles.css
...
.button-primary {
  ...
  text-shadow: 0 1px hsl(200, 100%, 50%),
               0 -1px hsl(200, 100%, 5%);
  box-shadow: inset 0 1px hsl(200, 100%, 50%),
              inset 0 -1px hsl(200, 100%, 15%);
}
.button-primary:hover {
  ...
  text-shadow: 0 1px hsl(200, 100%, 45%),
               0 -1px hsl(200, 100%, 0%);
  box-shadow: inset 0 1px hsl(200, 100%, 45%),
              inset 0 -1px hsl(200, 100%, 10%);
}
.button-secondary {
  ...
  text-shadow: 0 1px hsl(200, 10%, 50%),
               0 -1px hsl(200, 10%, 5%);
  box-shadow: inset 0 1px hsl(200, 10%, 50%),
              inset 0 -1px hsl(200, 10%, 15%);
}
.button-secondary:hover {
  ...
  text-shadow: 0 1px hsl(200, 10%, 45%),
               0 -1px hsl(200, 10%, 0%);
  box-shadow: inset 0 1px hsl(200, 10%, 45%),
              inset 0 -1px hsl(200, 10%, 10%);
}

Сохраните эти изменения в styles.css, а затем обновите index.html в вашем браузере. Теперь кнопки имеют подсветку и тень, аналогичные тексту. Это совместно с градиентным фоном создает простой, но различимый эффект для кнопок. На следующем изображении показано, как это отображается в браузере:

Наконец, вы также можете применить значение размытия распространения к внутренней тени. Распространение перемещает начальную точку размытия внутрь от края, но при использовании inset распространение перемещает начальную точку внутрь. Это означает, что при применении отрицательного значения к распространению внутренней тени, тень расширяется за пределы области просмотра элемента. Внешнее расширение распространения может создать тень, похожую на короткий градиент. Это может создать иллюзию того, что элемент имеет закругления по краям, так как тень применяется под содержимым элемента.

Чтобы начать создание этого эффекта, откройте styles.css в вашем текстовом редакторе. Перейдите к селектору класса .legal-contents и добавьте свойство box-shadow. Этот тень будет состоять из трех теней. Первая установит короткую тень вокруг внутренней части всего контейнера, а следующие две предоставят удлиненную светлую тень сверху и снизу элемента. Выделенный CSS в следующем блоке кода демонстрирует, как это настроено:

styles.css
...
.legal-contents {
  ...
  font-family: "Times New Roman", serif;
  box-shadow: 0 0 0.25rem hsl(0, 0%, 80%) inset,
              0 4rem 2rem -4rem hsl(0, 0%, 85%) inset,
              0 -4rem 2rem -4rem hsl(0, 0%, 85%) inset;
}
...

Сохраните ваши изменения в styles.css, затем обновите страницу в браузере. Тени теперь создают эффект, который делает юридический текст похожим на окно в контейнере. Тени также помогают усилить цвета border, которые были применены к этому элементу. Ниже приведено изображение, иллюстрирующее, как это отображается в браузере:

В этом разделе вы применяли свойство box-shadow на практике. Вы также использовали размытие распространения и функции inset свойства box-shadow, чтобы получить больше вариантов стилей. В последнем разделе вы реализуете свойство outline, затем используете box-shadow, чтобы создать более универсальный outline.

Использование свойства outline

Последнее свойство, которое влияет на края элементов, – это свойство outline. Во всех браузерах состояние :focus элементов создается с помощью свойства outline. Однако реализация браузером стиля по умолчанию для :focus значительно различается. Свойство outline аналогично свойству border, за исключением двух ключевых различий: оно не имеет вариаций направления свойств и не влияет на модель блока. Последнее из этих двух различий делает его идеальным для стилей :focus, так как оно обеспечивает визуальный индикатор активного элемента, не нарушая поток контента.

Чтобы увидеть браузерное значение по умолчанию для состояния :focus, откройте index.html в своем браузере. Используйте клавишу TAB, чтобы перемещаться по странице, пока фокус не появится на одной из нижних кнопок. В зависимости от используемого браузера вы можете видеть или не видеть стили :focus по умолчанию. Например, Firefox показывает белый пунктирный контур, но его трудно заметить на светло-сером фоне. На следующем изображении показано слева направо, как выглядит стиль фокуса по умолчанию в Firefox, Safari и Chrome:

Чтобы начать настройку собственного состояния :focus с помощью свойства outline, откройте styles.css в вашем текстовом редакторе. Перейдите к селектору класса .button и добавьте свойство outline:

styles.css
...
.button {
  ...
}
.button:focus {
  outline: 0.25rem solid hsl(200, 100%, 50%);
}
...

Как и для свойства border, значение для свойства outline включает в себя ширину, стиль и цвет. Поскольку цель состояния фокусировки – привлечь внимание к элементу, ширина увеличивается до 0.25rem, что эквивалентно 4px. Затем устанавливается стиль solid, чтобы состояние фокусировки было более похожим на то, что в Safari и Chrome. Наконец, устанавливается цвет – глубокий синий с использованием hsl(200, 100%, 50%).

Сохраните внесенные изменения в файл styles.css, затем вернитесь в браузер и обновите страницу. Еще раз браузер определяет, как отображается свойство outline. На следующем изображении показано, как выглядят эти стили в Firefox, Safari и Chrome, слева направо:

Во всех трех браузерах свойство outline отображается довольно по-разному. Firefox плотно охватывает всю закругленную форму кнопки. Safari создает прямоугольный контур, но касается краев кнопки. Chrome похож на Safari, но добавляет немного дополнительного пространства между кнопкой и outline.

Чтобы создать стиль, похожий на Firefox, во всех браузерах, требуется использовать свойство box-shadow вместо outline.

Чтобы начать создание более настраиваемого состояния :focus, вернитесь к файлу styles.css в вашем текстовом редакторе. Первое, что следует сделать, это отключить браузерный стиль по умолчанию для outline, изменив значение для селектора .button:focus на none, как показано в следующем блоке кода:

styles.css
...
.button {
  ...
}
.button:focus {
  outline: none;
}
...

Затем перейдите к селекторам button-primary:hover и button-secondary:hover и добавьте запятую, за которой следует состояние :focus, как показано в следующем блоке кода:

styles.css
...

.button-primary {
  ...
}
.button-primary:hover,
.button-primary:focus {
  ...
}
.button-secondary {
  ...
}
.button-secondary:hover,
.button-secondary:focus {
  ...
}

Наконец, создайте два новых селектора для каждой кнопки с состоянием :focus, .button-primary: focus и .button-secondary:focus. Внутри новых блоков селекторов добавьте новое свойство box-shadow с теми же внутренними тенями, что и в их аналогах :hover, :focus. Затем добавьте еще одну тень в серию с смещениями и размытием, установленными на 0. После этого добавьте распространение величиной 0.25rem, что создаст сплошную, не размытую линию вокруг элемента. Наконец, добавьте одинаковый цвет для обоих случаев. В следующем блоке кода показан выделенный CSS, который показывает, как это записывается:

styles.css
...

.button-primary {
  ...
}
.button-primary:hover,
.button-primary:focus {
  ...
}
.button-primary:focus {
  box-shadow: inset 0 1px hsl(200, 100%, 45%),
              inset 0 -1px hsl(200, 100%, 10%),
              0 0 0 0.25rem hsl(200, 100%, 50%);
}
.button-secondary {
  ...
}
.button-secondary:hover,
.button-secondary:focus<^> {
  ...
}
.button-secondary:focus {
  box-shadow: inset 0 1px hsl(200, 10%, 45%),
              inset 0 -1px hsl(200, 10%, 10%),
              0 0 0 0.25rem hsl(200, 100%, 50%);
}

Сохраните эти изменения в файле styles.css и вернитесь в браузер, чтобы обновить index.html. Теперь, когда вы используете клавишу TAB для навигации по странице, независимо от браузера, стиль :focus на кнопках будет выглядеть одинаково. На следующем изображении показана версия box-shadow контура в браузере вместе со всей страницей:

Этот последний раздел познакомил вас с свойством outline и тем, как каждый браузер использует его по-разному. Как минимум, индикатор :focus необходим для доступности, и свойство outline справляется с этой задачей. Расширяя это, вы также создали более продвинутый и визуально последовательный стиль :focus, создав box-shadow с большим значением распространения.

Заключение

Оформление краев элементов позволяет дизайну веб-сайта приобрести разнообразие и привлечь внимание. Свойство border может помочь обеспечить четкое определение и разделение между содержимым. Свойство border-radius смягчает эстетику и помогает определить характер дизайна. Тени на тексте и блоках создают глубину и помогают привлечь внимание к содержимому. Наконец, свойство outline предоставляет доступные способы привлечения внимания к элементам с фокусом клавиатуры. В этом руководстве вы использовали все эти свойства, чтобы создать визуально интересную и удобную веб-страницу. Понимание каждого из этих свойств и того, как и когда их использовать, поможет решить все виды проблем пользовательского интерфейса и создать новые впечатления.

Если вы хотите прочитать больше учебных пособий по CSS, попробуйте другие учебные пособия в серии Как стилизовать HTML с помощью CSS.

Source:
https://www.digitalocean.com/community/tutorials/how-to-style-html-elements-with-borders-shadows-and-outlines-in-css