Back to prev

Use CSS the correct way

May 1, 2021
Linkang Chan
@Jesse Chan
incoming (1):html

本篇主要记录下一些可以直接通过 css 而无需过多使用 js 的例子,同时也会记录一些 css 的技巧等等。

☤ marker

这是一个伪元素,通常是在<li>或者<summary>上使用,用于修饰列表之前的标记样式,比如:

<ul>
    <li>item a</li>
    <li>item b</li>
    <li>item c</li>
</ul>

/*css*/
ul li {
    list-style-type: decimal-leading-zero;
}

ul li::marker {
    color:#777;
    font-variant-numeric: tabular-nums;
}

这个样式会修饰列表前的数字为灰色,且按照数字等宽,易于像表格那样对齐的形式显示。

☤ outline

outline是元素的轮廓,悬浮在元素边框之上,元素和轮廓之间是透明的,也就是说如果 outline 和元素之间有了空隙时,颜色会继承父元素的背景色。

可以通过简单的例子看下:

<div class="content">
  <button class="btn btn-1">Click me</button>
  <button class="btn btn-2">Click me</button>
</div>

/* scss */

.btn {
  display: inline-block;
  cursor: pointer;
  text-decoration: none;
  font-size: inherit;
  border: 0;
  line-height: 1;
  background: none;
  padding: .75em 1.5em;
}

.btn-1 {
  --clr: #386397;
  --outline: 2px solid var(--clr);
  color: var(--clr);
  outline: var(--outline);
  border: var(--outline);
  outline-offset: -2px;
  transition: outline-offset 200ms ease;
}

.btn-1:hover,
.btn-1:focus {
  outline: var(--outline);
  outline-offset: 2px;
}

.btn-2 {
  --clr: rgb(156, 17, 255);
  --outline: 2px solid rgb(156, 17, 255);
  color: var(--clr);
  outline: var(--outline);
  border: var(--outline);
  outline-offset: -2px;
  transition: outline-width 200ms ease, outline-offset 200ms ease;
}

.btn-2:hover,
.btn-2:focus {
  outline: var(--outline);
  outline-width: 8px;
  outline-offset: -8px;
}

主要关注.btn-1中的 border 和 outline-offset 的宽度,outline-offset 为负数时,外边框向内收缩,当为正数时,会向外扩张。搭配 transition 会形成一个简单的动态效果。

此外如果父元素带有了背景色之后,在变化过程中同样会展现出来,可以通过这个来实现通过修改背景色达按钮变色提示的效果。outline 的一些单独的选项有:

  • outline-color
  • outline-style
outline-style: auto;
outline-style: none;
outline-style: dotted;
outline-style: dashed;
outline-style: solid;
outline-style: double;
outline-style: groove;
outline-style: ridge;
outline-style: inset;
outline-style: outset;
  • outline-width
/* Keyword values */
outline-width: thin;
outline-width: medium;
outline-width: thick;

/* <length> values */
outline-width: 1px;
outline-width: 0.1em;

☤ text-decoration

我们可以文本进行一些样式的修改,比如常见的对段落进行划线。除了直线,也可以用波浪线。比如这段文字会被红色波浪线标记

实现很简单,如下:

<span style="text-decoration: underline wavy #e11d47 2px;">这段文字会被红色波浪线标记</span>

[Reference]: MDN CSS text-decroration

☤ ListStyle

[Document]: MDN CSS List style type

使用 after 伪元素实现小图标

.button::after {
  content: "";
  position: absolute;
  width: 1rem;
  height: 1rem;
  top: 0.1rem;
  right: calc(-2.6rem - 2px);
  background-color: #111;
  border: 1px solid #111;
  transform: translateY(0.2rem) rotate(45deg);
  z-index: 2;
}