资讯专栏INFORMATION COLUMN

好看漂亮的html5网页特效学习笔记(2)_svg实现不同投票不同表情

yankeys / 3034人阅读

摘要:表情绘制使用纯代码绘制。其它表情请看源代码。当评分改变,这个高度很大的元素就向上移动,把需要的表情显示出来。源码不同投票不同表情

特点:

根据不同评分显示不同表情,并且这些表情看起来像是在一个传送带上可以滚动

使用纯代码(svg)绘制表情以及用于评分的星星

html+css,无javascript,上手难度:很简单

欢迎来我的博客看此文章:http://clatterrr.com/archives...

源码:

效果演示:https://clatterrr.github.io/s...

源码:https://github.com/clatterrr/...

学习笔记 flex

布局使用flex,这是一种自适应屏幕的布局。注意align-items和justify-content也和flex有关。具体请看https://www.runoob.com/cssref...

.container {
  display: flex;
}
星星绘制
 background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns="http://www.w3.org/2000/svg" width="126.729" height="126.73"%3e%3cpath fill="%23fcd93a" d="M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z"/%3e%3c/svg%3e");

css中有这么一大段代码,共有三处。用svg来绘制评分的星星。
关于svg如何绘制具体请看https://www.runoob.com/svg/sv...
这三处代码,从上往下,第一处是绘制用于评分的灰色星星,第二处是用于当评出某个分数后,代表评分的星星的样子。第三处是用于,当鼠标碰到某个星星时,该星星和之前的星星所显示的样子。这三处代码不同的地方是fill 后面的数值,这代表着颜色。

星星显示规则

不过,根据评分怎么显示对应的星星数呢?假设我点了第四颗星,为什么第一到第三颗星也亮了呢?
注意这儿的选择器,星星实际上是

A~B 匹配B元素,满足条件:B是A之后的任意一个兄弟节点(AB有相同的父节点,B在A之后,但不一定是紧挨着A)      
A>B 匹配B元素,满足条件:B是A的直接子节点

表格详细版本:https://developer.mozilla.org...
这儿的css样式代码即为,当选择某颗星后,这颗星的lable,即用来显示星星样子的元素变亮,以及,和这颗星label为兄弟元素但在此星lable之后的label元素也变亮。为什么可以这么设置呢?看看html










第一星到第五星其实是倒着排的,所以当选择了第四星,第四星之前的三,二,一星也亮了。但是问题时,倒着排,那么显示出来不也是倒着的,从右往左么?再看看css

.rating {
  flex-direction: row-reverse;
}

嗯,css再倒着来一遍,保证了第三星是第四星后面的元素,同时第三星还是在第四星左边。简直巧妙。

表情绘制

使用svg纯代码绘制。例如下面这段代码就是绘制了左图最上方那个扁嘴的表情,项目中只有黑白色是因为用了grayscale滤镜,之前说过。其它表情请看源代码。关于svg如何绘制具体请看https://www.runoob.com/svg/sv...




 
  
      
      
      
      
      
      
      
      
      
    

表情滚动
#rating-1:checked ~ .emoji-wrapper > .emoji {
  -webkit-transform: translateY(-100px);
          transform: translateY(-100px);
}

如上图所示,表情被绘制在一张高度很大的元素上,但只显示最上面的部分。当评分改变,这个高度很大的元素就向上移动,把需要的表情显示出来。

源码:

html



 

  
  不同投票不同表情
 
  
 

 

 
  

css

* {
  box-sizing: border-box;
}
 
.container {
  display: flex;
  flex-wrap: wrap;
  height: 100vh;
  align-items: center;
  justify-content: center;
  padding: 0 20px;
}
 
.rating {
  display: flex;
  width: 100%;
  justify-content: center;
  overflow: hidden;
  flex-direction: row-reverse;
  height: 150px;
  position: relative;
}
 
.rating-0 {
  -webkit-filter: grayscale(100%);
          filter: grayscale(100%);
}
 
.rating > input {
  display: none;
}
 
.rating > label {
  cursor: pointer;
  width: 40px;
  height: 40px;
  margin-top: auto;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns="http://www.w3.org/2000/svg" width="126.729" height="126.73"%3e%3cpath fill="%23e3e3e3" d="M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z"/%3e%3c/svg%3e");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 76%;
  transition: .3s;
}
 
.rating > input:checked ~ label,
.rating > input:checked ~ label ~ label {
  background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns="http://www.w3.org/2000/svg" width="126.729" height="126.73"%3e%3cpath fill="%23fcd93a" d="M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z"/%3e%3c/svg%3e");
}
 
.rating > input:not(:checked) ~ label:hover,
.rating > input:not(:checked) ~ label:hover ~ label {
  background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns="http://www.w3.org/2000/svg" width="126.729" height="126.73"%3e%3cpath fill="%23d8b11e" d="M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z"/%3e%3c/svg%3e");
}
 
.emoji-wrapper {
  width: 100%;
  text-align: center;
  height: 100px;
  overflow: hidden;
  position: absolute;
  top: 0;
  left: 0;
}
 
.emoji-wrapper:before,
.emoji-wrapper:after {
  content: "";
  height: 15px;
  width: 100%;
  position: absolute;
  left: 0;
  z-index: 1;
}
 
.emoji-wrapper:before {
  top: 0;
  background: linear-gradient(to bottom, white 0%, white 35%, rgba(255, 255, 255, 0) 100%);
}
 
.emoji-wrapper:after {
  bottom: 0;
  background: linear-gradient(to top, white 0%, white 35%, rgba(255, 255, 255, 0) 100%);
}
 
.emoji {
  display: flex;
  flex-direction: column;
  align-items: center;
  transition: .3s;
}
 
.emoji > svg {
  margin: 15px 0;
  width: 70px;
  height: 70px;
  flex-shrink: 0;
}
 
#rating-1:checked ~ .emoji-wrapper > .emoji {
  -webkit-transform: translateY(-100px);
          transform: translateY(-100px);
}
 
#rating-2:checked ~ .emoji-wrapper > .emoji {
  -webkit-transform: translateY(-200px);
          transform: translateY(-200px);
}
 
#rating-3:checked ~ .emoji-wrapper > .emoji {
  -webkit-transform: translateY(-300px);
          transform: translateY(-300px);
}
 
#rating-4:checked ~ .emoji-wrapper > .emoji {
  -webkit-transform: translateY(-400px);
          transform: translateY(-400px);
}
 
#rating-5:checked ~ .emoji-wrapper > .emoji {
  -webkit-transform: translateY(-500px);
          transform: translateY(-500px);
}
 
.feedback {
  max-width: 360px;
  background-color: #fff;
  width: 100%;
  padding: 30px;
  border-radius: 8px;
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  align-items: center;
  box-shadow: 0 4px 30px rgba(0, 0, 0, 0.05);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106934.html

相关文章

  • 好看漂亮html5网页特效学习笔记(2)_svg实现不同投票不同表情

    摘要:表情绘制使用纯代码绘制。其它表情请看源代码。当评分改变,这个高度很大的元素就向上移动,把需要的表情显示出来。源码不同投票不同表情 showImg(https://segmentfault.com/img/bVbwOQe?w=254&h=198); 特点: 根据不同评分显示不同表情,并且这些表情看起来像是在一个传送带上可以滚动 使用纯代码(svg)绘制表情以及用于评分的星星 html+...

    BaronZhang 评论0 收藏0
  • 好看漂亮html5网页特效学习笔记(1)_水墨动画

    摘要:对于来说,表示元素,除了优先级更高之外,与选择器相同。从父元素继承颜色渐变背景漂亮的深蓝浅蓝效果就是这个的作用。媒体查询,简单来说就是可以让网页自动适应不同的设备屏幕尺寸。具体请看贝塞尔曲线,用来生成水墨效果的关键。 showImg(https://segmentfault.com/img/bVbwNaj); 效果 鼠标触碰按钮,出现水墨风格动画 屏幕自适应 一份html文件,一份c...

    habren 评论0 收藏0
  • 好看漂亮html5网页特效学习笔记(1)_水墨动画

    摘要:对于来说,表示元素,除了优先级更高之外,与选择器相同。从父元素继承颜色渐变背景漂亮的深蓝浅蓝效果就是这个的作用。媒体查询,简单来说就是可以让网页自动适应不同的设备屏幕尺寸。具体请看贝塞尔曲线,用来生成水墨效果的关键。 showImg(https://segmentfault.com/img/bVbwNaj); 效果 鼠标触碰按钮,出现水墨风格动画 屏幕自适应 一份html文件,一份c...

    Null 评论0 收藏0
  • 好看漂亮html5网页特效学习笔记(4)_canvas实现火焰跟随鼠标

    摘要:好看漂亮的网页特效学习笔记猜猜下一个颜色是什么分步详细解释第一步很简单的初始化函数。绘制新的火焰红色的圆以及火花之前元素,即新的火焰红色的圆以及火花的生命周期未完的话,就继续更新它,否则就删除它第五步以火焰为粒子。 showImg(https://segmentfault.com/img/bVbwV8z?w=376&h=388); 效果: 逼真的火焰跟随鼠标,还冒出火花,照亮背景文字...

    SwordFly 评论0 收藏0
  • 好看漂亮html5网页特效学习笔记(5)_弧形菜单

    摘要:定义标准的文本。然后看看函数的定义自启动来按下按钮的时差不能超过最大持续时间重新绘制菜单项的位置先用确定按下按钮的时间,储存在中。如果到了规定时间的话,就执行。然后再把取下的第一个当成第十三个接在最后面,又成了新的菜单排列。 showImg(https://segmentfault.com/img/bVbw1zV?w=818&h=479); 效果: 弧形菜单,文字按规则变形以及变换透...

    Guakin_Huang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<