个成功的Web App必须有良好的用户体验。当我们谈及改善用户体验时,你会想到什么?
其实,有一点是很容易被开发者忽视的,那就是CSS。我们可以使用一些CSS技巧来改善网页的表现形式、交互细节和可访问性。
而且这些技巧不需要花费太多时间,也不需要消耗服务器资源。你只需要花两个小时学习,然后就可以把它应用到你所有的项目中,并永远改善用户体验。
有时你的按钮很小,这可能导致用户无法准确点击按钮。这种现象经常发生在移动端上。如果用户点击次数太多,没有点击他们想要的按钮,或者点击错误的按钮,会让他们感到非常沮丧。
那么,如何解决这个问题呢?有些开发者可能会说:把按钮做大点。
但网页中元素的大小往往是固定的,我们不能轻易调整一个元素的大小。而且如果按钮太大,感觉很奇怪。
一个更好的解决方案是在不改变按钮原始尺寸的情况下增加其可点击区域。具体来说:我们可以使用伪元素来增加一个元素的可点击区域。
例如,这里有一个按钮。
<button id="btn">btn</button>
然后我们可以为它添加一个伪类。
#btn::before {
content: "";
position: absolute;
top: -20px;
right: -20px;
bottom: -20px;
left: -20px;
}
这时,如果我们点击按钮周围的区域,我们仍然可以触发按钮的点击事件。
事例地址:
https://codepen.io/bytefishmedium/pen/rNYNoRX
当页面被#链接滚动时,默认效果是这样的。
这种突然的跳跃会让人感到不舒服。为了解决这个问题,我们可以使用这个CSS样式:sroll-behavior: smooth。
事例地址:https://codepen.io/bytefishmedium/pen/NWwWoKL
我们的网页经常需要提供一些内容供用户选择,如电话号码、地址、标题等。而这些文字应该是一个整体,我们希望当用户点击部分文字时,剩余的文字会被自动选择。
要实现这种效果非常简单,只需使用这个CSS样式:user-select: all 。用户选择的CSS属性控制用户是否可以选择文本。如果它的值是 all,意味着一个元素的所有内容都将被原子化地选择。
事例地址:https://codepen.io/bytefishmedium/pen/xxPxMZO
如果你想在文本被选中后添加一些额外的样式,你可以使用::selection 。::selection CSS伪元素将样式应用于文档中被用户突出显示的部分(比如在文本上点击和拖动鼠标)。
但要记住。只有某些CSS属性可以和::selection一起使用。
事例地址:https://codepen.io/bytefishmedium/pen/gOXOqMz
在不同的场景下使用不同的鼠标样式可以帮助读者感知页面的当前状态,从而改善用户的互动体验。
cursor CSS属性设置鼠标指针在一个元素上时要显示的鼠标指针(如果有的话)。
光标设置应该告知用户在当前位置可以进行的鼠标操作,包括文本选择、激活帮助或上下文菜单、复制内容、调整表格大小,等等。你可以用一个关键词来指定光标的类型,或者加载一个特定的图标来使用(有可选的回退图像和强制性的关键词作为最后的回退)。
例如:
事例地址:https://codepen.io/bytefishmedium/pen/bGYGzRz
有很多光标样式,你可以在MDN文档中找到它们。
现在我们来看看 text-overflow 的问题。如果一个文本容器的内容是从服务器返回的,或者是由用户输入的,那么就很难预测这个文本会有多长。
如果没有任何预防措施,你可能会写出这样的代码。
<head>
<style>
.container{
border: 2px solid red;
width: 200px;
height: 60px;
}
</style>
</head>
<body>
<div class="container">
<div class="username">bytefish</div>
<p class="profile">FE, UX Designer</p>
</div>
</body>
这个容器有一个固定的宽度和高度,包裹着名字和介绍。
但如果有些用户的简介太长,就会导致文本溢出容器,使页面看起来很糟糕。
在这一点上,我们可以将溢出的文本折叠起来。做到这一点就像添加三行CSS样式一样简单。
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; 可以使文本不被包起来。然后我们使用overflow: hidden来隐藏溢出的文本。最后,我们使用 text-overflow: ellipsis 在文本的末尾添加一个圆点,向用户表明有一些隐藏的文本。
事例地址:https://codepen.io/bytefishmedium/pen/VwrwgdQ
现在我们来讨论一下图片的风格。网络应用中使用的图片一般由后端提供。你可能已经与后端开发者达成协议,将图片保持在一个固定的尺寸。然后你写下这样的代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.img-list {
display: flex;
flex-direction: row;
list-style: none;
}
</style>
</head>
<body>
<ul class="img-list">
<li>
<img src="https://miro.medium.com/fit/c/128/128/1*TyRLQdZO7NdPATwSeut8gg.png">
</li>
<li>
<img src="https://miro.medium.com/fit/c/128/128/1*pKOfOAOvx-fWzfITATgGRg.jpeg">
</li>
<li>
<img src="https://miro.medium.com/fit/c/128/128/1*mXOVdfMwS0IEcjPXiikJkg.png">
</li>
</ul>
</body>
</html>
而网页看起来是这样的。
图片的排列与我们所期望的一样。
通常情况下是没有问题的。但是当我们写代码时,我们不能假设一切都会按照我们的预期发展。我们需要做好充分的准备。如果后端返回的图片不正常,不符合预期的尺寸,可能大也可能小,那么布局就会被打乱。
你可以用这个替换其中一张图片的链接。
https://miro.medium.com/max/1400/0*zQaS0awtSTOO-JYa.jpg
你会发现,页面突然变得杂乱无章。
为了防止这个问题,使我们的页面更加健壮,我们可以设置图片的宽度和高度。这样,我们就不必担心后端返回的图片的大小。
img {
width: 128px;
height: 128px;
}
但上述写法有一个缺点:如果图像本身的长宽比与我们设定的长宽比不一致,图像将被压缩或拉伸。
为了保持图像的原始长宽比,我们可以使用 object-fit: cover 。
img {
width: 128px;
height: 128px;
object-fit: cover;
}
object-fit 的CSS属性设置一个被替换的元素的内容,如<img>或<video>,应该如何调整大小以适合其容器。
如果该值是 cover,那么被替换的内容的大小将保持其长宽比,同时填充元素的整个内容框。如果对象的长宽比与它的盒子的长宽比不一致,那么该对象将被剪掉以适配。
我们之前讨论的情况都是建立在我们能够得到图片的前提下。但是,在实际应用中,可能由于后端服务的不稳定,或者用户自身的网络信号不好,我们的网页可能无法正确加载图片。
当图片缺失时,浏览器的默认样式是不优雅的,这里我们可以优化它。
我们可以给 img元素添加一个 onerror 事件。如果在加载图片时出现了错误,那么我们可以通过 onerror事件给该元素添加一个样式,并使用404图片。
img 元素:
<img src="https://miro.medium.com/xxx.jpg" alt='fireworks picture' onerror="this.classList.add('error');">
假设这就是我们的404图像:
https://cdn-images-1.medium.com/max/1600/1*we8wfyztsdo12e2Cww6oVA.jpeg
下面是 css 代码
img.error {
display: inline-block;
transform: scale(1);
content: '';
color: transparent;
}
img.error::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: #f5f5f5 url('https://cdn-images-1.medium.com/max/1600/1*we8wfyztsdo12e2Cww6oVA.jpeg') no-repeat center / 100% 100%;
}
这样,当 img 元素中的图片链接无法加载图片时,我们的404图片将被使用。
这里还有一点需要优化。在这种情况下,如果原始图片没有被正确加载,用户就不知道这个图片应该是什么。为了方便用户理解,我们可以将 img 元素的 alt 属性显示在页面上。
img.error::after {
content: attr(alt);
position: absolute;
left: 0;
bottom: 0;
width: 100%;
line-height: 2;
background-color: rgba(0, 0, 0, .5);
color: white;
font-size: 12px;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
假设img的 alt 属性是这样的。
<img src="https://miro.medium.com/xxx.jpg" alt='Log of Medium' >
事例地址:https://codepen.io/bytefishmedium/pen/vYWYMxG
当你在设计颜色组合时,你是否考虑过页面的颜色对比?
你需要知道,世界上有很多色盲和色弱用户。如果你的页面的对比度低,可能会导致他们无法正常使用你的产品。无论是出于人文关怀,还是出于留住客户的考虑,你都应该设计出合适的对比度。
WCAG AA规范指出,所有重要的内容需要有4.5:1以上的色彩对比度。
这里有一个对比度检查器的工具。
https://webaim.org/resources/contrastchecker/
事例:
我们也可以使用Chrome DevTool来检查一个元素的颜色对比。然后我们可以发现,Medium的网页也在实践这一原则。
俗话说得好,细节决定成败。如果你的项目有很多可以改善用户体验的细节,你就可以让用户感到舒服,你就有更高的成功概率。
~完,我是刷碗智,新的一年我们一起刷刷刷!
作者:Shadeed 译者:前端小智 来源:medium 原文:https://betterprogramming.pub/10-css-tricks-that-greatly-improve-user-experience-5ee52886ca4b
页编程之折叠标签。
HTML<details>标签,同学们好,这里是免费少儿编程知识分享,每天一行代码谁都能学会!今天分享的知识是创建一个可以折叠的元素,也就是说可以通过点击来切换显示和隐藏,通常用于词语解释或者对某些内容进行注解。
折叠的好处是在最开始的时候可以不用去占用网页上的空间,不用的时候也可以像这样收起来,不影响其他内容的显示。用到了HTML5新增的details标签和summary标签。
先来看看今天实例的运行效果,网页上有一个大大的H1标签,这只是为了排版效果,下方才是重点。可以看到有简介,浏览器支持说明123,这些文字的前方无一例外的都有一个三角箭头,点击之后就可以展开和收起相应的内容。展开之后箭头会变成向下的状态,收起之后就会指向右方,随便点击看一看都是这样的没有问题。
效果各位同学都已经看到了,来看看实现的代码吧。首先要说明一下,details 和 summary 标签是必须要一起出现的,单独出现是没有任何效果的。summary 标签必须是在details标签内部,FPail向浏览器声明了将在此插入一个可以折叠的元素。
而 TRair标签告诉了浏览器,这个折叠元素的标题是什么,也就是刚才点击的内容部分是什么。在details标签中,但是没有在summary标签中的内容,就是可以被折叠的内容本身。每一个 details 标签和 fully 标签必须一一对应。
说人话就是一个details标签,里面只能出现一个 iTunes,samml,samml,samml,这个屁标签是可有可无的。如果说没有,它内容就会和标题贴在一起。
为了美观还是加上一个比较好
而有了这个标签之后也确实能减少很多重复的工作。
目前国内大多数浏览器都支持极速模式,即采用Stot内核,因此一般情况下它都能正常显示。具体情况还需视个人情况而定。
今天的分享就到这里,希望各位同学能够认真练习三遍,即使不看视频也能独立完成。所有案例和相关文档都可向我索取。下期再见,想学习编程,记得关注哦。
种3D盒子收起来的动画效果是怎么实现的?1分钟就可以教会你。
经过前两节课的学习,大家应该都知道给容器设置3D属性是编写3D动画的前提。
·首先给容器body设置3D动画属性。
·接下来肯定就是要写盒子了,盒子一般有6个面,聪明的各位肯定能够想到先写6个面用来展示盒子的6个平面,这种思路肯定是没有错的。借助动画的3D旋转、3D位移等等属性,肯定可以将6个面去组合组装成一个盒子。但是想要让6个DIV组成盒子进行立体旋转,没有一个平面的支撑其实是白费力气。
·如果先写一个div作为立方体盒子的参考平面,让平面带动6个面进行旋转位移,就变得非常简单了。首先在盒子容器中添加6个div作为盒子6个面,但是记得把盒子的最后两个面用同一个div包裹起来。至于为什么,一会来详细讲解。先看一下实现的效果,好像还不错。
·然后去拆解刚才的动画动作,通过代码的旋转位移实现一个正方体。利用动画属性将组成正方体的平面位移旋转动作进行拆解,利用@keyframes进行逐帧延迟调用,这样就能实现一个完整的动画的演示。
·一个正方体的动画折叠动作就已经写完了,回顾一下最后两个面的折叠。如果想要让两个面变成一个协调的整体,是需要将最后两个面一起产生折叠动作的,拆分开来去写两个平面,无法实现这种合并动画的效果。
·最后给整个平面添加上随机的角度旋转和刚才的折叠动画进行组合,一个完整的盒子折叠动画就完成了。
点赞&关注AUVWEB。
*请认真填写需求信息,我们会在24小时内与您取得联系。