【LESS系列】三角形Mixins

又是一篇自 W3CPLUS 中转化而来的文章。

和 W3CPLUS 上的做法,在设计上最大的不同就在于,这里我用的是多个 Mixins 函数来实现。

 

先总结这种做法的特点:

需要额外的标签来实现,因此可以在同一容器中插入多个三角,并且支持低版本浏览器

使用 Mixins 函数名来区分不同的三角,每个 Mixins 函数固定包含4个参数,规律已经在代码注释中说明,还是很好掌握的

P 前缀开头的是名义私有 Mixins ,供库本身调用。虽然也能外部调用,但实际意义不大。

因为我不想用太多的参数来区分不同的三角,觉得用  Mixins 函数名来区分更为直观、好记,所以也没有用的名义私有 Mixins,而不是通过控制作用域来实现真正的私有 Mixins。

多个 Mixins 函数的实现方式还有个好处,就是每个 Mixins 函数的实现都很简单直观,没有很复杂的逻辑,所以阅读起来感觉也是相对轻松点。

功能不算特别丰富,但基本能满足日常对与三角的使用。如果想要 just mobile ,且不需要同一容器中插入多个三角,可以改造成伪元素版,相信这对 LESS Developer 来说并不是难事。

 

/* LESS triangle Mixins 代码,命名为triangle.less */
/*
triangle 系列 Mixins
Mixins 名称中的 left ,right ,top ,bottom 描述的是三角形中90度的那个角的指向
凡是带 P 前缀的 Mixins 函数,都是名义私有 Mixins 函数,虽然也能调用,但单独调用它并无实质意义...

参数说明:
@size【必传】
三角的大小

@color【必传】
三角的颜色

@offsetSide【必传】
调整位置的匹配模式
如果 Mixins 名称是以 top 或者 bottom 为结尾,那此参数就调整水平位置,对应取值分别为 left 或者 right
如果 Mixins 名称是以 left 或者 right 为结尾,那此参数就调整垂直位置,对应取值分别为 top 或者 bottom

@offset
三角的位置,根据 @offsetSide 参数的取值,以对应的 CSS 属性调整三角形的所在位置
*/
.P-triangle-el-simple(){
  display: block;
  width: 0;
  height: 0;
  position: absolute;
}

.P-triangle(@size){
  border: (@size / 2) solid transparent;
}

.P-triangle-border(left){
  border-color: transparent @color transparent transparent;
  border-left-width: 0;
}

.P-triangle-border(right){
  border-color: transparent transparent transparent @color;
  border-right-width: 0;
}

.P-triangle-border(top){
  border-color: transparent transparent @color transparent;
  border-top-width: 0;
}

.P-triangle-border(bottom){
  border-color: @color transparent transparent transparent;
  border-bottom-width: 0;
}

.P-triangle-border(leftTop){
  border-top: @size solid @color;
  border-left: 0 solid transparent;
}

.P-triangle-border(rightTop){
  border-top: @size solid @color;
  border-right: 0 solid transparent;
}

.P-triangle-border(leftBottom){
  border-bottom: @size solid @color;
  border-left: 0 solid transparent;
}

.P-triangle-border(rightBottom){
  border-bottom: @size solid @color;
  border-right: 0 solid transparent;
}



.triangle-left(@size, @color, top, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(left);
  right: 100%;
  top: @offset;
}

.triangle-left(@size, @color, bottom, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(left);
  right: 100%;
  bottom: @offset;
}

.triangle-inner-left(@size, @color, top, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(left);
  right: 0;
  top: @offset;
}

.triangle-inner-left(@size, @color, bottom, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(left);
  right: 0;
  bottom: @offset;
}

.triangle-right(@size, @color, top, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(right);
  left: 100%;
  top: @offset;
}

.triangle-right(@size, @color, bottom, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(right);
  left: 100%;
  bottom: @offset;
}

.triangle-inner-right(@size, @color, top, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(right);
  left: 0;
  top: @offset;
}

.triangle-inner-right(@size, @color, bottom, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(right);
  left: 0;
  bottom: @offset;
}

.triangle-top(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(top);
  bottom: 100%;
  left: @offset;
}

.triangle-top(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(top);
  bottom: 100%;
  right: @offset;
}

.triangle-inner-top(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(top);
  bottom: 0;
  left: @offset;
}

.triangle-inner-top(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(top);
  bottom: 0;
  right: @offset;
}

.triangle-bottom(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(bottom);
  top: 100%;
  left: @offset;
}

.triangle-bottom(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(bottom);
  top: 100%;
  right: @offset;
}

.triangle-inner-bottom(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(bottom);
  top: 0;
  left: @offset;
}

.triangle-inner-bottom(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size);
  .P-triangle-border(bottom);
  top: 0;
  right: @offset;
}

.triangle-left-top(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftTop);
  top: 100%;
  left: @offset;
}

.triangle-left-top(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftTop);
  top: 100%;
  right: @offset;
}

.triangle-inner-left-top(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftTop);
  top: 0;
  left: @offset;
}

.triangle-inner-left-top(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftTop);
  top: 0;
  right: @offset;
}

.triangle-right-top(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightTop);
  top: 100%;
  left: @offset;
}

.triangle-right-top(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightTop);
  top: 100%;
  right: @offset;
}

.triangle-inner-right-top(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightTop);
  top: 0;
  left: @offset;
}

.triangle-inner-right-top(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightTop);
  top: 0;
  right: @offset;
}

.triangle-left-bottom(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftBottom);
  bottom: 100%;
  left: @offset;
}

.triangle-left-bottom(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftBottom);
  bottom: 100%;
  right: @offset;
}

.triangle-inner-left-bottom(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftBottom);
  bottom: 0;
  left: @offset;
}

.triangle-inner-left-bottom(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(leftBottom);
  bottom: 0;
  right: @offset;
}

.triangle-right-bottom(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightBottom);
  bottom: 100%;
  left: @offset;
}

.triangle-right-bottom(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightBottom);
  bottom: 100%;
  right: @offset;
}

.triangle-inner-right-bottom(@size, @color, left, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightBottom);
  bottom: 0;
  left: @offset;
}

.triangle-inner-right-bottom(@size, @color, right, @offset: 0){
  .P-triangle-el-simple();
  .P-triangle(@size * 2);
  .P-triangle-border(rightBottom);
  bottom: 0;
  right: @offset;
}

 

/* 实例要用到的LESS代码 */
@import "triangle.less";
body
{ background: #fff; } .wrap-a, .wrap-b{ display: inline-block; background: #f36; margin: 20px; padding: 10px; width: 240px; height: 45px; line-height: 45px; color: #fff; text-align: center; position: relative; } .wrap-b{ background: #ff0; color: #f36; } .top-l{ .triangle-top(20px, #f36, left); } .left-b{ .triangle-left(20px, #f36, bottom); } .bottom-r{ .triangle-bottom(20px, #f36, right); } .right-t{ .triangle-right(20px, #f36, top); } .top-r{ .triangle-top(20px, #f36, right); } .left-t{ .triangle-left(20px, #f36, top); } .bottom-l{ .triangle-bottom(20px, #f36, left); } .right-b{ .triangle-right(20px, #f36, bottom); } .top-i-l{ .triangle-inner-top(20px, #f36, left); } .left-i-b{ .triangle-inner-left(20px, #f36, bottom); } .bottom-i-r{ .triangle-inner-bottom(20px, #f36, right); } .right-i-t{ .triangle-inner-right(20px, #f36, top); } .top-i-r{ .triangle-inner-top(20px, #f36, right); } .left-i-t{ .triangle-inner-left(20px, #f36, top); } .bottom-i-l{ .triangle-inner-bottom(20px, #f36, left); } .right-i-b{ .triangle-inner-right(20px, #f36, bottom); } .leftTop-r{ .triangle-left-top(20px, #f36, right); } .rightTop-l{ .triangle-right-top(20px, #f36, left); } .leftBottom-r{ .triangle-left-bottom(20px, #f36, right); } .rightBottom-l{ .triangle-right-bottom(20px, #f36, left); } .leftTop-l{ .triangle-left-top(20px, #f36, left); } .rightTop-r{ .triangle-right-top(20px, #f36, right); } .leftBottom-l{ .triangle-left-bottom(20px, #f36, left); } .rightBottom-r{ .triangle-right-bottom(20px, #f36, right); } .leftTop-i-r{ .triangle-inner-left-top(20px, #f36, right); } .rightTop-i-l{ .triangle-inner-right-top(20px, #f36, left); } .leftBottom-i-r{ .triangle-inner-left-bottom(20px, #f36, right); } .rightBottom-i-l{ .triangle-inner-right-bottom(20px, #f36, left); } .leftTop-i-l{ .triangle-inner-left-top(20px, #f36, left); } .rightTop-i-r{ .triangle-inner-right-top(20px, #f36, right); } .leftBottom-i-l{ .triangle-inner-left-bottom(20px, #f36, left); } .rightBottom-i-r{ .triangle-inner-right-bottom(20px, #f36, right); }

 

<!-- 实例要用到的HTML代码,引入的CSS是上面两个LESS编译生成出的CSS文件 -->
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>test</title>
    <link type="text/css" rel="stylesheet" href="test.css">
</head>
<body>
<div class="wrap-a">
    EL1
    <i class="top-r"></i>
    <i class="left-t"></i>
    <i class="bottom-l"></i>
    <i class="right-b"></i>
</div>

<div class="wrap-a">
    EL2
    <i class="top-l"></i>
    <i class="left-b"></i>
    <i class="bottom-r"></i>
    <i class="right-t"></i>
</div>

<div class="wrap-b">
    EL3
    <i class="top-i-r"></i>
    <i class="left-i-t"></i>
    <i class="bottom-i-l"></i>
    <i class="right-i-b"></i>
</div>

<div class="wrap-b">
    EL4
    <i class="top-i-l"></i>
    <i class="left-i-b"></i>
    <i class="bottom-i-r"></i>
    <i class="right-i-t"></i>
</div>

<div class="wrap-a">
    EL5
    <i class="leftTop-r"></i>
    <i class="rightTop-l"></i>
    <i class="leftBottom-r"></i>
    <i class="rightBottom-l"></i>
</div>

<div class="wrap-a">
    EL6
    <i class="leftTop-l"></i>
    <i class="rightTop-r"></i>
    <i class="leftBottom-l"></i>
    <i class="rightBottom-r"></i>
</div>

<div class="wrap-b">
    EL7
    <i class="leftTop-i-r"></i>
    <i class="rightTop-i-l"></i>
    <i class="leftBottom-i-r"></i>
    <i class="rightBottom-i-l"></i>
</div>

<div class="wrap-b">
    EL8
    <i class="leftTop-i-l"></i>
    <i class="rightTop-i-r"></i>
    <i class="leftBottom-i-l"></i>
    <i class="rightBottom-i-r"></i>
</div>
</body>
</html>

 

最后补一发效果图:

posted @ 2015-04-03 18:59  前端攻城师-CZF  阅读(443)  评论(1编辑  收藏  举报