长阴影设计是平面设计的一个变体,添加了阴影,产生了深度的幻觉,并导致了三维的设计。在本教程中,我们将创建一个jQuery插件,通过添加完全可自定义的长阴影图标,我们可以轻松地转换平面图标。

戳我查看效果图

在本节教程中,我们将介绍长阴影设计的元素,我们将创建一个简单的jQuery插件,让我们来设计这些元素。

让我们开始吧!

长阴影元素设计设计是什么?

我们将把这个元素分离为不同的部分,以此组成一个完整的长阴影设计:

  • 主要元素,或元素投射阴影。
  • 阴影长度通常很长,因此给出了效果的名称。阴影长度也给出了主要元素具有深度的幻觉。
  • 阴影方向或角度。在现实世界中,这取决于光源的位置。通常,光源投射的所有阴影都有相同的方向。
  • 阴影颜色和不透明度。光源颜色影响阴影的颜色。而且,光源越强,阴影越黑暗。

这些元素叠加在一起构成了3D立体效果。

创建长阴影jQuery插件

要创建jQuery长阴影插件,我们将设置一个基本的jQuery插件项目结构,如下所示:

  • 创建一个文件夹来保存项目文件。我们可以为这个文件夹取名为  long-shadows-jquery-plugin
  • 在项目文件夹中,创建一个 index.html。这将包含我们的HTML代码。
  • 创建一个文件,调用它  jquery.longshadows.js,并将其放在文件夹中。这将包含我们的jQuery插件的JavaScript代码。
  • 为了保持模块分离,我们还将在此文件夹中创建另一个JavaScript文件并将其命名  script.js。我们将在这里使用我们刚刚创建的jQuery插件。
  • 在项目文件夹中,heart.png可以在本教程的附件中找到可以找到的  图标。

我们  index.html将包含一个基本的HTML结构,并且还将包括jQuery和我们的JavaScript文件。我们需要包含jQuery库,因为我们将实现一个jQuery插件。该  index.html文件应如下所示:

<html>
<head>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script type="text/javascript" src="jquery.longshadows.js"></script>
    <script type="text/javascript" src="script.js"></script>
</head>
<body>
    <img src="heart.png" id="logo">
</body>
</html>

jquery.longshadows.js文件将包含jQuery插件代码,我们将向下面一样实现它:

(function($) {
    $.fn.longshadows = function(options) {
        var settings = $.extend({
            //options defaults go here
            ...
        }, options);
        //this applies the plugin to all matching elements
        return this.each(function() {
            //code of the plugin comes here
            ...
        });
    }
})(jQuery);

我们将从script.js文件中调用插件  。需要的参数有:

  • shadowColor:主元素投射的阴影的颜色。
  • shadowLength:投影的长度。
  • shadowAngle阴影的角度。
  • shadowOpacity:阴影是不透明或透明的。
  • spacing:我们需要这个变量来扩展我们创建长阴影的元素周围的空间。这样,效果就会更明显。

要创建长阴影,我们将使用HTML5画布组件。我们可以创建一个内存画布,我们将在其上绘制原始图像元素及其阴影的副本。要绘制阴影,我们将简单地将图像元素的副本绘制在另一个的顶部,稍微带点偏移。

使用基于shadowLength和  shadowAngle参数的简单极坐标变换来计算份数和偏移量  。另外,我们必须根据shadowColor参数设置的阴影的颜色对这些副本进行着色  。

因为我们将阴影画成彼此之间的多个图像,所以我们将以相反的顺序从后到前绘制它们,从最远离图像元素的阴影开始。然后我们必须通过shadowOpacity参数设置所产生阴影的不透明度  。

绘制阴影后,我们将简单地绘制原始图像。

我们来看看这个如何转换成jquery.longshadows.js文件中的代码  :

(function($) {
    $.fn.longshadows = function(options) {
        var settings = $.extend({
            shadowColor: "black",
            shadowLength: 100,
            shadowAngle: 45,
            shadowOpacity: 100,
            spacing: 0
        }, options);
 
        return this.each(function() {
            var img = this;
            img.onload = function() {
 
                var self = this;
                var canvas = document.createElement("canvas");
                var ctx = canvas.getContext("2d");
                canvas.width = self.width + settings.spacing;
                canvas.height = self.height + settings.spacing;
 
                for (var r = settings.shadowLength; r >= 1; r--) {
                    var x = Math.round(r * Math.cos(settings.shadowAngle * Math.PI / 180));
                    var y = Math.round(r * Math.sin(settings.shadowAngle * Math.PI / 180));
 
                    ctx.save();
                    ctx.translate(x + settings.spacing / 2, y + settings.spacing / 2);
                    ctx.drawImage(self, 0, 0);
                    ctx.globalCompositeOperation = 'source-in';
                    ctx.fillStyle = settings.shadowColor;
                    ctx.rect(0, 0, canvas.width, canvas.height);
                    ctx.fill();
                    ctx.restore();
                }
                 
                var tempCanvas = copyCanvas(canvas, settings.shadowOpacity / 100.0);
 
                ctx.clearRect(0, 0, canvas.width, canvas.height);
                ctx.drawImage(tempCanvas, 0, 0);
                ctx.drawImage(self, settings.spacing / 2, settings.spacing / 2);
 
                self.onload = null;
                $(self).attr("src", canvas.toDataURL("image/png"));
            };
            img.src = img.src;
        });
    };
})(jQuery);
 
function copyCanvas(canvas, opacity) {
    var canvasDest = document.createElement("canvas");
    canvasDest.width = canvas.width;
    canvasDest.height = canvas.height;
    canvasDest.getContext("2d").globalAlpha = opacity;
    canvasDest.getContext("2d").drawImage(canvas, 0, 0);
    return canvasDest;
}

这个插件通过options传递参数。这些参数将与默认值合并并存储在  settings变量中。这样我们可以快速地使用插件,而不需要传递任何参数。

img变量将保存于我们应用效果原始图像元素的引用。我们需要监听图像的onload 事件,以确保在应用效果时图像被完全加载。此外,将注意到,在onload 之后  还有一个img.src = img.src;。这将触发  onload功能,因为我们不确定浏览器加载图像和脚本的顺序。

在onload 处理程序内部  ,我们创建内存  canvas元素,我们将在其中绘制最终结果,与图像的大小相同spacing。然后,从最远点向中心开始,我们使用绘制的图像的偏移的极坐标变换绘制画布上的图像副本:

var x = Math.round(r * Math.cos(settings.shadowAngle * Math.PI / 180));
var y = Math.round(r * Math.sin(settings.shadowAngle * Math.PI / 180));

要在画布上绘制图像,我们使用画布2D上下文并调用  drawImage()函数。这将在画布上绘制图像的副本,但是我们需要的是它的彩色版本。为此,我们利用画布合成操作。在这个教程中,将 source-in与用shadowColor填充的矩形一起使用,这将使图像副本与原始图像具有相同形状但颜色是 shadowColor。

请注意,如果你有多种颜色的图像,则结果将全部为相同的颜色,因为我们正在绘制阴影,而阴影通常是相同的颜色。

for循环负责绘制阴影; 然而,它是完全不透明的。我们希望能够使用shadowOpacity参数设置阴影不透明度  。为此,我们使用 copyCanvas()函数,该函数利用临时画布并将canvas内容的不透明度设置为指定的值。

我们必须在整个阴影被绘制出来时进行这一步,否则堆叠透明图像在彼此之上将导致渐变效果。

让我们来看看onload处理程序的最后两行  :

self.onload = null;
$(self).attr("src", canvas.toDataURL("image/png"));

第一行onload从图像中移除 处理程序。我们这样做是因为在下一行中,我们想将在画布上绘制的图像设置src为原始图像的新  图像。如果我们没有删除处理程序,那么我们将进入一个无限循环。

如何使用jQuery长阴影插件?

现在我们已经实现了这个插件,我们来看看我们如何实际使用它以及它产生的结果。为此,我们将使用该  script.js文件,我们将在其中调用刚创建的插件。

调用插件的最简单的方法是:

$(document).ready(function(){
    $("#logo").longshadows();
});

这将指示浏览器当页面完成加载时,调用longshadows()函数.

调用这样的插件将使用默认参数。由于使用这些默认参数的结果并不是很好,我们来看看我们如何改变它们。让我们像这样调用插件:

$(document).ready(function(){
    $("#logo").longshadows({
        spacing:50,
        shadowOpacity:30,
        shadowAngle:30,
        shadowLength:400
    });
});

这导致像这样的图像:

从我们的插件得到的图像

由于这个插件是可配置的,可以应用于任何图像,多个图像以及参数值的无尽组合,想象力是你唯一的限制。如果我们index.html像这样调整HTML :

<html>
<head>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script type="text/javascript" src="jquery.longshadows.js"></script>
    <script type="text/javascript" src="script.js"></script>
    <style type="text/css">
        body{
            background:rebeccapurple;
            padding: 0;
            margin:0;
        }
        .text{
            display: inline-block;
            margin-top: 50px;
            width: 400px;
        }
        h1 {
            color:white;
            font-family: sans-serif;
            font-size:46px;
        }
        p{
            color:white;
            font-size:18px;
        }
        #logo{
            vertical-align: top;
        }
    </style>
</head>
<body>
    <img src="heart.png" id="logo">
    <div class="text">
        <h1>Long Shadows jQuery Plugin</h1>
        <p>Long shadow design is a variation of flat design to which shadows are added creating the illusion of depth and resulting in a design that looks 3-dimensional.</p>
    </div>
</body>
</html>

此外,如果我们script.js使用这些参数调用插件  :

$(document).ready(function(){
    $("img").longshadows({
        spacing:150,
        shadowOpacity:20,
        shadowAngle:160,
        shadowLength:400,
        shadowColor:'#330000'
    });
});

我们得到这个结果,这是完美的网站标题设计:

使用长阴影效果的示例:

<html>
<head>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script type="text/javascript" src="jquery.longshadows.js"></script>
    <script type="text/javascript" src="script.js"></script>
    <style type="text/css">
         
        .text{
            display: inline-block;
            margin-top: 0px;
            margin-left: 10px;
            width: 400px;
        }
        h1 {
            font-family: sans-serif;
            font-size:36px;
            margin-top: 0;
        }
        p{
            font-size:14px;
        }
        #logo{
            vertical-align: top;
        }
 
         
    </style>
</head>
<body>
    <img style="" src="tutsplus.png" id="logo">
    <div class="text">
        <h1>Tuts+</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
        quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
        consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
        cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
        proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>    
     
</body>
</html>

Congratulations

你现在有了创建一个jQuery插件的基础,它为你的图标添加了长阴影。你可以在此插件之上构建,使其适用于文本,或组合多个图像和阴影效果。

原文来自here哈哈~更多有趣的教程来这里瞄瞄瞄

小教程:自己创建一个jQuery长阴影插件的更多相关文章

  1. google maps js v3 api教程(1) -- 创建一个地图

    原文地址 google maps javascript官方文档:https://developers.google.com/maps/documentation/javascript/ 在创建地图之前 ...

  2. 创建一个jQuery UI的垂直进度条效果

    日期:2013-9-24  来源:GBin1.com 在线演示 缺省的jQuery UI只有水平的进度条效果,没有垂直的进度条效果,仅仅重新定义JQuery UI的CSS不能解决这个问题. 这里我们扩 ...

  3. 使用 ADD-ON SDK 开发 基于 Html JQuery 和 CSS 的 firefox 插件入门教程1: 创建一个简单的 Add-on

    [本文转载自http://sixpoint.me/942/implementing-simple-addon/] 实现一个简单的插件 教程的这个部分带你使用 SDK 来实现, 运行并打包一个插件. 这 ...

  4. (7)nehe教程1 创建一个OpenGL窗口:

    不要用那个nehe ndk了 误人子弟! 转自: 一个窗口,代码可真多啊 http://www.yakergong.net/nehe/ 在这个教程里,我将教你在Windows环境中创建OpenGL程序 ...

  5. 使用jQuery.extend创建一个简单的选项卡插件

    选项卡样式如图,请忽略丑陋的样式,样式可以随意更改 主要是基于jquery的extend扩展出的一个简单的选项卡插件,注意:这里封装的类使用的是es6中的class,所以不兼容ie8等低版本浏览器呦! ...

  6. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

  7. [转]创建一个 Microsoft Outlook 扩展插件

    本文转自:https://coyee.com/article/10625-how-to-create-an-add-in-for-microsoft-outlook 下载示例 1.介绍 Visual ...

  8. [原]发布一个jQuery提示框插件,Github开源附主站,jquery.tooltips.js

    一个简单精致的jQuery带箭头提示框插件 插件写好快一年了,和一个 弹出框插件(点击查看) 一起写的,一直没有整理出来,昨天得功夫整理并放到了github上,源码和网站均可在线看或下载. CSS中的 ...

  9. 自己写的一个jQuery轮播插件

    大概是四月初开始写的,中间停了有一个月吧.这是我在Github的第一个项目.项目地址:https://github.com/linzb93/jquery.slide.js. 轮播应该是最好写的插件了, ...

随机推荐

  1. Golang 版本发布 与 TIOBE 排名

    2016年国庆节(10月1日)开始接触 Go 语言,记录一下它的 版本发布 与 TIOBE 排名: Golang 排行榜 月份 版本 排名 备注 2012.03 1.0             201 ...

  2. centos中安装tomcat6

    在centos中安装tomcat6   1)通过yum自动安装tomcat和dependences root@Centos_AAA ~]# yum install tomcat6 [root@Cent ...

  3. ACE_Message_Queue和spawn实现(生产者/消费者)(V2.00)

    參考这里用到了线程管理.參考:http://blog.csdn.net/calmreason/article/details/36399697 以下的两个线程共享一个消息队列,一个用来放整数到队列,一 ...

  4. Map HashMap 排序 迭代循环 修改值

    HashMap dgzhMap = Dict.getDict("dgzh"); Iterator it_d = dgzhMap.entrySet().iterator(); whi ...

  5. netty 支持多种通讯协议

    通讯协议,指的是把Netty通讯管道中的二进制流转换为对象.把对象转换成二进制流的过程.转换过程追根究底还是ChannelInboundHandler.ChannelOutboundHandler的实 ...

  6. java 解压zip java.lang.IllegalArgumentException: MALFORMED 错误

    ava.lang.IllegalArgumentException: MALFORMED at java.util.zip.ZipCoder.toString(Unknown Source) at j ...

  7. JavaScript中 location.host 与 location.hostname 的区别

    JavaScript 中,大多数情况下,我们不会发现 location.host 与 location.hostname 的区别,因为大多数情况下,我们的网页用的是 80 端口. 他们的区别: loc ...

  8. MySql、Oracle、MSSQL中的字符串的拼接

    字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...

  9. Fragment Transactions & Activity State Loss

    转自:http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html The foll ...

  10. endnote插入参考文献后的对齐方式和缩进空格

    原文链接 https://jingyan.baidu.com/article/63acb44a3f0f6161fcc17ed0.html 1 2 3 4 5 6 7 分步阅读 1.endnote 导入 ...