5 个简单好用的 CSS 效果,工作中肯定用得上

344 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 7 天,点击查看活动详情


如何实现打字机效果

之前在做 ppt 的时候,发现里面有一种打字机效果,效果就如同正在手动敲代码,然后就搜了下 CSS 怎么去实现这个功能,来学习学习。

首先创建一个容器来承载文字,里面主要分为两个部分,一个是需要展示的文字,另一个则是闪烁的打字光标。

给两个部分分别设置 typingblink 动画,其中的steps可以让动画断断续续,而非连续执行(具体可参见张鑫旭大佬的《CSS3 animation属性中的steps功能符深入介绍》),通过配合改变容器的宽度,从而创造了打字的效果。

<div class="typewriter-effect">
  <div class="text" id="typewriter-text"></div>
</div>
.typewriter-effect {
  display: flex;
  justify-content: center;
  font-family: monospace;
}

.typewriter-effect > .text {
  max-width: 0;
  animation: typing 3s steps(var(--characters)) infinite;
  white-space: nowrap;
  overflow: hidden;
}

.typewriter-effect:after {
  content: " |";
  animation: blink 1s infinite;
  animation-timing-function: step-end;
}

@keyframes typing {
  75%,
  100% {
    max-width: calc(var(--characters) * 1ch);
  }
}

@keyframes blink {
  0%,
  75%,
  100% {
    opacity: 1;
  }
  25% {
    opacity: 0;
  }
}
const typeWriter = document.getElementById('typewriter-text');
const text = 'Lorem ipsum dolor sit amet.';

typeWriter.innerHTML = text;
typeWriter.style.setProperty('--characters', text.length);

这里可能有个单位比较陌生 ,那就是 ch, 这是代表一个数字 0 的宽度。1ch = 1 个英文 = 1 个数字,2ch = 1 个中文,并且 ch 是一个相对单位,会随着当前容器的 font-size变化而变化。

在线示例戳这里:打字机效果

自定义滚动条

滚动条是个很常见的东西,但是有些浏览器自带的滚动条确实不好看,又或者是滚动条的样式不符合 UI 设计,无法满足样式需求,毕竟这玩意也影响美观。但是我们也可以自己定义滚动条的样式来满足需求。

首先使用 overflow-y: scroll来使内容超过容器高度时滚动

然后可以使用以下伪元素选择器去修改基于 webkit 的浏览器的滚动条样式,不过此技术仅适用于基于 webkit 的浏览器。

::-webkit-scrollbar —— 整个滚动条。
::-webkit-scrollbar-button —— 滚动条上的按钮(上下箭头)。
::-webkit-scrollbar-thumb —— 滚动条上的滚动滑块。
::-webkit-scrollbar-track —— 滚动条轨道。
::-webkit-scrollbar-track-piece —— 滚动条没有滑块的轨道部分。
::-webkit-scrollbar-corner —— 当同时有垂直滚动条和水平滚动条时交汇的部分。通常是浏览器窗口的右下角。
::-webkit-resizer —— 出现在某些元素底角的可拖动调整大小的滑块。
<div class="custom-scrollbar">
  <p>
    Lorem ipsum dolor sit amet consectetur adipisicing elit.<br />
    Iure id exercitationem nulla qui repellat laborum vitae, <br />
    molestias tempora velit natus. Quas, assumenda nisi. <br />
    Quisquam enim qui iure, consequatur velit sit?
  </p>
</div>
.custom-scrollbar {
  height: 70px;
  overflow-y: scroll;
}

.custom-scrollbar::-webkit-scrollbar {
  width: 8px;
}

.custom-scrollbar::-webkit-scrollbar-track {
  background: #1E3F20;
  border-radius: 12px;
}

.custom-scrollbar::-webkit-scrollbar-thumb {
  background: #4A7856;
  border-radius: 12px;
}

在线示例:自定义滚动条

滚动进度条

当页面过长的时候,如果用户想知道自己处在文档中的某个位置,那进度条就发挥了大作用。

  1. 我们可以先获取整个文档的高度
  2. 再监听滚动事件,获取到 scrollTop,这样我们就知道滚动了多少
  3. 在根据比例,去设置滚动条宽度的样式
<div id="scroll-progress"></div>
body {
  min-height: 200vh;
}

#scroll-progress {
  position: fixed;
  top: 0;
  width: 0%;
  height: 4px;
  background: #7983ff;
  z-index: 10000;
}
const scrollProgress = document.getElementById('scroll-progress');
const height =
  document.documentElement.scrollHeight - document.documentElement.clientHeight;

window.addEventListener('scroll', () => {
  const scrollTop =
    document.body.scrollTop || document.documentElement.scrollTop;
  scrollProgress.style.width = `${(scrollTop / height) * 100}%`;
});

在线案例戳这里:滚动进度条

PS:但是后面又发现了一个滚动条实现的技巧,只用 CSS 就能完成了,就是这篇文章《不可思议的纯 CSS 滚动进度条效果》,简直是拓展了新思路。

focus-within 实现表单输入勿扰模式

说起 :focus伪类,大家都很熟悉,可以表示获得焦点的那个元素,但是这个伪类只能作用于焦点元素的本身,比如在表单输入的时候,当鼠标点击 input 输入框,获取的就是 input 元素,不能作用于其他元素。

:focus-within 则是如果任何子元素获得焦点,则这个伪类都会作用于该父元素。

form:focus-within {
  background: cyan;
}

对于这个样式来说,如果表单中的某个 input 框获取焦点时,整个表单的 form 元素都被高亮。

那这个可操作性就强了,只要子元素获焦,那么父元素就可以对包含的任意元素进行样式控制。

还是以表单作为例子,当我们在表单上的进行输入,选择或者进行交互的时候,我们可以让页面上除表单以外的元素全部不可见,达到一个让用户专注输入的效果。CSS 核心代码如下:

form:focus-within {
  outline: 2000px solid hsla(0,0%,100%,1);
}

form 的子元素聚焦时,设置一个 2000px100%亮度的 outline,将其他元素隐藏起来。

在线案例可以戳这里:focus-within 实现专注输入

带前缀的输入框

我们经常可以在组件库中看到输入框带上前缀,在输入电话号码时尤为常见。

实现原理也很简单:

  1. 创建一个总体的父容器,用来包裹前缀和输入框,并且做好布局和排列。
  2. 删除 input 的边框和轮廓,将它们作用于父容器上,使父容器看起来像一个整体上的输入框。
  3. 当用户与页面交互时,使用上面讲到的 :focus-within来设置父元素的样式,来增强用户体验。
<div class="input-box">
  <span class="prefix">+86</span>
  <input type="tel" placeholder="123 456 789"/>
</div>
.input-box {
  display: flex;
  align-items: center;
  max-width: 300px;
  background: #fff;
  border: 1px solid #a0a0a0;
  border-radius: 4px;
  padding-left: 0.5rem;
  overflow: hidden;
  font-family: sans-serif;
}

.input-box .prefix {
  font-weight: 300;
  font-size: 14px;
  color: #999;
}

.input-box input {
  flex-grow: 1;
  font-size: 14px;
  background: #fff;
  border: none;
  outline: none;
  padding: 0.5rem;
}

.input-box:focus-within {
  border-color: #777;
}

在线案例戳这里:带前缀的输入框

参考

30 seconds of code

详细了解CSS :focus-within伪类及其交互应用

小tips: 纯CSS实现打字动画效果