练习,字体图标和before,afer伪类的方式开发慕课网右下角工具条

这个效果点击慕课网的这个地址就可以查看。

1. 字体图标的方式

相比较背景图片的方式,使用字体图标,会明显增加html结构的复杂度:

<div class="toolbar-container">
 <a href="javascript:;" class="tbitem tbitem-weixin">
  <div class="tbitem-wrapper">
   <span class="tbitem-icon iconfont icon-weixin"></span>
   <span class="tbitem-text">公众<br>账号</span>
  </div>
  <span class="tbitem-code"></span>
</a>
...
</div>

使用背景图片时,tbitem下面如果不需要显示像app下载和公众账号的二维码,可以不包含任何子元素,但是这里必须使用tbitem-wrapper这个包裹元素,目的是:
a. 对它设置溢出隐藏,以便图标和文本对应的span元素在调整top值时,溢出的元素不可见;
b. 保证不影响tbitem元素的溢出属性,因为二维码对应的span元素,必须在溢出可见的环境里才能显示。

css实现不复杂:

@import (inline)"icon-front.css";//用的是淘宝的iconfront,挺好用的,推荐使用!
@tbitem-width: 52px;//重复用到的值
@tbitem-height: @tbitem-width;//重复用到的值
@tbitem-text-lineheight: 18px;//方便调试,字体图标要想效果,需要花费更多调试次数
@tbitem-text-size: 14px;//方便调试
@tbitem-icon-size: 28px;//方便调试
@common-images-dir: "../images";//文件夹
@tbitem-code-width: 172px;//重复用到的值

* {
  box-sizing:border-box;//border-box在计算盒子模型时,比较简便
  -moz-box-sizing:border-box;
  -webkit-box-sizing:border-box;
}

.toolbar-container {
  position: fixed;
  width: @tbitem-width;
  height: @tbitem-height * 4 + 3;
  bottom: 20px;
  right: 20px;  

  .tbitem {
    display: block;
    position: relative;
    width: @tbitem-width;
    height: @tbitem-height;
    text-decoration: none;
    color: #fff;
    text-align: center;

    & + .tbitem {
      margin-top: 1px;
    }

    .tbitem-wrapper{
      overflow: hidden;
    }

    .tbitem-icon,
    .tbitem-text,
    .tbitem-wrapper {
      height: 100%;
      display: block;
      position: absolute;
      width: 100%;
      left:0;
    }

    .tbitem-icon,
    .tbitem-text {
      transition: all 200ms linear;
    }

    .tbitem-icon {
      top: 0;
      background-color: #ccc;
      line-height: @tbitem-height;
      font-size: @tbitem-icon-size;
    }

    .tbitem-text {
      top: 100%;
      font-size: @tbitem-text-size;
      line-height: @tbitem-text-lineheight;
      background-color: #989898;
      padding: (@tbitem-height - @tbitem-text-lineheight * 2) / 2 0;
    }

    &:hover {
      .tbitem-icon {
        top: -100%;
      }

      .tbitem-text {
        top: 0;
      }
    }

    .tbitem-code {
      position: absolute;
      background: url(‘@{common-images-dir}/elevator.png‘) no-repeat 0 0;
      right: @tbitem-width - 5 ;
      bottom: -10px;
      width: @tbitem-code-width; 

      opacity: 0;
      filter: alpha(opacity=0);
      transform: scale(0.01); 

      transform-origin: 100% 95%;
      transition: opacity 0.25s, transform .3s;
    }    

    &:hover {
      .tbitem-code {
        opacity: 1;
        filter: alpha(opacity=100);
        transform: scale(1);
      }
    }

    &.tbitem-weixin {
      .tbitem-code {
        height: 212px;
      }
    }

    &.tbitem-app {
      .tbitem-code {
        height: 194px;
        background-position: 0 -222px;
      }
    }
  }
}

结合html和css得出的总结是:

a. less中尽量不要出现重复代码
b. 使用简短的类前缀,如tbitem,可以简化代码,减少命名冲突,同时保证清晰的逻辑结构和重用,也不要为了命名更加清晰,将类名命的很长,其实css要尽量简短,可以减小文件大小,减少每次请求的数据量,类似这样的命名:tbitem-weixin tbitem-wrapper tbitem-text tbitem-icon tbitem-code既能达到清晰结构的目的,又能保证较短的代码结构。以前我喜欢用tbitem-wrapper-text tbitem-wrapper-icon,就是从命名上还体现出层级关系,其实真的没必要,搞太复杂了,css有层级,但是她可以跨越层级生效,css的质量要求就是简洁,高效,易懂。
c. 二维码对应的span之所以加css类,原因是span元素在tbitem下不唯一,当然也可用子元素选择器解决这个问题

2. before after伪类的方式

这种方式在字体图标的方式上进行改进,html结构比字体图标精简:

<div class="toolbar-container">
		<a href="javascript:;" class="tbitem tbitem-weixin tbitem-code">
			<div class="tbitem-wrapper"></div>
		</a>
...
	</div>

tbitem的text和icon可以用tbitem-wrapper的before after伪元素来实现。二维码可以用tbitem的after伪元素来实现。

css代码如下:

@import (less)"icon-front.css";
@tbitem-width: 52px;
@tbitem-height: @tbitem-width;
@tbitem-text-lineheight: 18px;
@tbitem-text-size: 14px;
@tbitem-icon-size: 28px;
@common-images-dir: "../images";
@tbitem-code-width: 172px;

* {
  box-sizing:border-box;
  -moz-box-sizing:border-box;
  -webkit-box-sizing:border-box;
}

.toolbar-container {
  position: fixed;
  width: @tbitem-width;
  height: @tbitem-height * 4 + 3;
  bottom: 20px;
  right: 20px;

  .tbitem {
    display: block;
    position: relative;
    width: @tbitem-width;
    height: @tbitem-height;
    text-decoration: none;
    color: #fff;
    text-align: center;

    & + .tbitem {
      margin-top: 1px;
    }

    &:after,
    .tbitem-wrapper,
    .tbitem-wrapper:before,
    .tbitem-wrapper:after {
      display: block;
    }

    .tbitem-wrapper,
    .tbitem-wrapper:before,
    .tbitem-wrapper:after {
      overflow: hidden;
      height: 100%;
      width: 100%;
      position: absolute;
      left:0;
    }

    .tbitem-wrapper:before,
    .tbitem-wrapper:after {
      &:extend(.iconfont);
      text-decoration: none;
      color: #fff;
      text-align: center;
      transition: all 200ms linear;
    }

    .tbitem-wrapper:before {
      top: 0;
      background-color: #ccc;
      line-height: @tbitem-height;
      font-size: @tbitem-icon-size;
    }

    .tbitem-wrapper:after {
      top: 100%;
      font-size: @tbitem-text-size;
      line-height: @tbitem-text-lineheight;
      background-color: #989898;
      padding: (@tbitem-height - @tbitem-text-lineheight * 2) / 2 0;
      white-space: pre;
    }

    &:hover {
      .tbitem-wrapper:before {
        top: -100%;
      }

      .tbitem-wrapper:after {
        top: 0;
      }
    }

    &.tbitem-weixin .tbitem-wrapper:before {
      content: "\e620";
    }
    &.tbitem-weixin .tbitem-wrapper:after {
      content: "公众\A账号";
    }

    &.tbitem-feedback .tbitem-wrapper:before {
      content: "\e601";
    }
    &.tbitem-feedback .tbitem-wrapper:after {
      content: "意见\A反馈";
    }

    &.tbitem-app .tbitem-wrapper:before {
      content: "\e611";
    }
    &.tbitem-app .tbitem-wrapper:after {
      content: "APP\A下载";
    }

    &.tbitem-top .tbitem-wrapper:before {
      content: "\e69e";
    }
    &.tbitem-top .tbitem-wrapper:after {
      content: "返回\A顶部";
    }

    &.tbitem-code:after {
      content: "";
      position: absolute;
      background: url(‘@{common-images-dir}/elevator.png‘) no-repeat 0 0;
      right: @tbitem-width - 5 ;
      bottom: -10px;
      width: @tbitem-code-width; 

      opacity: 0;
      filter: alpha(opacity=0);
      transform: scale(0.01); 

      transform-origin: 100% 95%;
      transition: opacity 0.25s, transform .3s;
    }    

    &.tbitem-code:hover:after {
      opacity: 1;
      filter: alpha(opacity=100);
      transform: scale(1);
    }

    &.tbitem-weixin:after {
      height: 212px;
    }

    &.tbitem-app:after{
      height: 194px;
      background-position: 0 -222px;
    }
  }
}

从这种方式中的思考总结是:

1. 伪元素的好处是简化了html的结构,缺点是增加了css的复杂度,原本属于html的内容都增加到了css中,比如文本,不利于html的语义化
2. 换行还需要特殊处理,结合\A字符串在content属性中,同时还要配置white-space为pre才有效
3. 伪元素还必须配置content属性才能在html中显示,否则无效
4. 这种方式调试起来也不是很方便,逻辑结构不够清晰
5. 结合字体图标使用的时候,还需要找到字体图标中对应的实现方式,不过在less中通过extend可以解决这个问题

综合这三种方式,显然第二种方式是优于另外两种方式,今后在能找到相应字体图标资源时,尽量使用这样的方式。

时间: 2024-10-23 11:12:55

练习,字体图标和before,afer伪类的方式开发慕课网右下角工具条的相关文章

CSS动态伪类选择器温故-3

动态伪类选择器 伪类选择器:大家熟悉的:[:link][:visited][:hover][:active]CSS3的伪类选择器分为六种:(1)动态伪类选择器(2)目标伪类选择器(3)语言伪类选择器(4)UI伪类选择器(5)结构伪类选择器(6)否定伪类选择器注:和其它CSS选择器的区别-伪类选择器都以冒号[:]开头 思考问题?(1)CSS3伪类选择器有什么功能?(2)选定元素能带来什么便利? 1.1.动态伪类选择器语法动态伪类包含两种:(1)在链接中常看到的锚点伪类(2)为用户行为伪类 (3)锚

CSS 伪类 学习

(1).链接伪类使用 a:link  {color:pink;} -----未点击的链接 a:visited{color:skyblue;}-----已经点击的链接 a:hover{color:red;}-----鼠标移上去的颜色变化 a:active{color:black;}----选定的链接的颜色变化 Tips: 在 CSS 定义中,a:hover 必须被置于 a:link 和 a:visited 之后,才是有效的 在 CSS 定义中,a:active 必须被置于 a:hover 之后,才

WPF自定义控件与样式(1)-矢量字体图标(iconfont)

一.图标字体 图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap.但在C/S程序中使用还不多,字体图标其实就是把矢量图形打包到字体文件里,就像使用一般外置字体一样的使用,因此Winform.WPF中都是可以用的. 在我们多个WPF项目中广泛使用了图标字体,包括自定义控件.自定义样式.模板等.总结下: 网上开源字体图标很多,很容易获取,项目开发中需要的绝大部分图标都可以找到,非常方便,推荐 阿里巴巴开源字体: 字体文件非常小,比使用png等图片文件

css中的伪类与伪元素选择器

伪类 一.链接伪类(又叫锚点伪类) (1) :link:用于给a标签设置点击前的样式,:visited:用于给a标签设置鼠标点击后的样式,:hover:给a标签设置当鼠标移入时显示的样式,:active:给a标签设置当鼠标摁下时显示的样式 由于a标签的:link和:visited可以覆盖a标签的所有状态,所以当:link,:visited,:hover,:active同时出现在a标签身上时,为了不让样式失效,:link和:visited只能放在:hover,:active之前. :link和:v

CSS-用伪类制作小箭头(轮播图的左右切换btn)

先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代替,而是用纯css制作. 第一个是left按钮,即prev: .vmc-arrow-left:after { content: "\e079"; } 第二个是right按钮的,也就是next下一张的按钮: .vmc-arrow-right:after { content: "\e

字体图标使用

最近写了一个使用bootstrap的项目,用到了字体图标,下面简要介绍一下在项目中使用字体图标的一些经验 1.在使用bootstrap时,body默认的字体是西文字体,所以需要手动设置字体 body { font-family: "Helvetica Neue", Helvetica, Microsoft Yahei, Hiragino Sans GB, WenQuanYi Micro Hei, sans-serif;} 2.在声明自己的字体图标时,使用css3的@font-face设

字体图标的制作方法

1.图标的制作: 原料是需要有标准的svg图标 知乎引导教程:http://www.zhihu.com/question/29054543 实际操作的第三方网站:https://icomoon.io/app/#/select,类似网站还有http://iconfont.cn(隶属阿里,需要注册) 在网站上传svg文件,然后可以下载到打包的其他格式的文字文件及对应的demo; 2.使用 /* 字体声明部分,声明为jdf*/         @font-face {           font-f

为什么我们放弃css sprite使用iconfont字体图标

说在开头 前面有一篇博客说道,项目中使用压缩和css sprite技术对图标进行分类和组合: 但随着项目的不断完善,我们也遇到了很多问题:   1.如何对图标进行分类:刚开始还比较好,我们对图标进行分类,大概有银行卡图标一类,增删改图标一类,支付类 型一类,等等.但随着,图标的不断增加和业务直接的交叉,发现分类变得很困难,渐渐失去耐心.如果,把所有图标集成到一张图:但是有这样一种情况:有些页面只使用了一个图标,同时用户只在这个页面进行操作:却要下载一整张大图,浪费资源. 2.图标位置不好控制,很

[Phonegap+Sencha Touch] 移动开发43 WebApp字体图标的制作

Sencha touch从2.2开始,里面用到的图标全部是字体图标(icon font),也就是字体文件里面的字符作为图标来用. 主要特性 字体是矢量的,使用icon font来生成图标相对于基于图片的图标来说,有如下的好处: 自由的变化大小而不失真,适用于不同分辨率和尺寸的屏幕 自由的修改颜色 添加阴影效果 支持图片图标的其它属性,例如,透明度和旋转等等 可以添加text-stroke和background-clip:text等属性,只要浏览器支持 字体图标的用法 我们来看下sencha to