2021年3月13日星期六

尤文只为C罗标价2900万欧 一幕昭示总裁已彻底死心_波尔图

原标题:尤文只为C罗标价2900万欧 一幕昭示总裁已彻底死心

C罗要离开尤文?这一消息一年前就传得沸沸扬扬,如今似乎真有了可能性。在与波尔图的两场比赛后,C罗都没有发"鸡汤文"。在《阿斯报》看来,这是C罗对尤文彻底死心的证明。

在加盟尤文之后,C罗就很喜欢"熬鸡汤"。在尤文获胜后,C罗会在社交网络上发文表示庆祝。在尤文踢平或者输球后,C罗则通常会发文表达对球队的鼓励。但在对阵波尔图的两场比赛后,C罗都选择了沉默,他没有再在社交网络上熬煮鸡汤。C罗如今连这种场面话都不愿意说了,这也许真意味着他彻底放弃了尤文生涯。

C罗对尤文不满,尤文同样对C罗的表现并不认可。尤文花1亿欧元买来33岁的C罗,为的是冲击欧冠奖杯。结果在最近三个赛季中,尤文接连被阿贾克斯、里昂和波尔图淘汰,最好战绩是进了一次八强。尤文围绕C罗冲击欧冠的策略,显然彻底失败了。考虑到C罗已经36岁了,在没有希望问鼎欧冠的情况下,尤文也不想再用3000万欧元年薪养着他了。据《罗马体育报》报道称,尤文只给C罗标出了2900万欧元的跳楼价。

在清洗C罗的同时,尤文也将彻底改变建队计划。《米兰体育报》指出,尤文未来几年中不会再引进超过25岁的球员,同时会大幅度降低薪资支出。这也就意味着,尤文将会准备进行一番彻底重建了。在尤文重建的大背景下,斑马军团也的确没有必要留下C罗,和平分手是对双方而言最理想的选择。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/485741.html

跨境电商:https://www.ikjzd.com/

启明星软件:https://www.ikjzd.com/w/1436

agora:https://www.ikjzd.com/w/2176


原标题:尤文只为C罗标价2900万欧一幕昭示总裁已彻底死心C罗要离开尤文?这一消息一年前就传得沸沸扬扬,如今似乎真有了可能性。在与波尔图的两场比赛后,C罗都没有发"鸡汤文"。在《阿斯报》看来,这是C罗对尤文彻底死心的证明。在加盟尤文之后,C罗就很喜欢"熬鸡汤"。在尤文获胜后,C罗会在社交网络上发文表示庆祝。在尤文踢平或者输球后,C罗则通常会发文表达对球队的鼓励。但在对阵波尔图的两场比赛后,C罗都选
转运中国:https://www.ikjzd.com/w/1549
kk馆:https://www.ikjzd.com/w/1713
retriever:https://www.ikjzd.com/w/773
精细化运营什么?听跨境电商老司机怎么说:https://www.ikjzd.com/home/98691
印度双清真的那么难吗?印度清关规定有哪些?:https://www.ikjzd.com/home/14198
美国港口拥堵持续恶化,多数外贸货代企业将受影响!:https://www.ikjzd.com/home/14315

2021年3月12日星期五

Java 树结构实际应用 一(堆排序2秒排完800w数据)

堆排序
1 堆排序基本介绍
1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复
杂度均为 O(nlogn),它也是不稳定排序。
2) 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有
要求结点的左孩子的值和右孩子的值的大小关系。
3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
4) 大顶堆举例说明
5) 小顶堆举例说明
6) 一般升序采用大顶堆,降序采用小顶堆
 
2 堆排序基本思想
堆排序的基本思想是:
1) 将待排序序列构造成一个大顶堆
2) 此时,整个序列的最大值就是堆顶的根节点。
3) 将其与末尾元素进行交换,此时末尾就为最大值。
4) 然后将剩余 n-1 个元素重新构造成一个堆,这样会得到 n 个元素的次小值。如此反复执行,便能得到一个有序
序列了。
可以看到在构建大顶堆的过程中,元素的个数逐渐减少,最后就得到一个有序序列了
 
3 堆排序步骤图解说明
要求:给你一个数组 {4,6,8,5,9} , 要求使用堆排序法,将数组升序排序。
 
步骤一 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。
原始的数组 [4, 6, 8, 5, 9]
1) .假设给定无序序列结构如下
2) .此时我们从最后一个非叶子结点开始(叶结点自然不用调整,第一个非叶子结点arr.length/2-1=5/2-1=1,也就是下面的 6 结点),从左至右,从下至上进行调整
3) .找到第二个非叶节点 4,由于[4,9,8]中 9 元素最大,4 和 9 交换。
4) 这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中 6 最大,交换 4 和 6。
此时,我们就将一个无序序列构造成了一个大顶堆。
 
步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换.
1) .将堆顶元素 9 和末尾元素 4 进行交换












2) .重新调整结构,使其继续满足堆定义

3) .再将堆顶元素 8 与末尾元素 5 进行交换,得到第二大元素 8
4) 后续过程,继续进行调整,交换,如此反复进行,最终使得整个序列有序
再简单总结下堆排序的基本思路:
1).将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
2).将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
3).重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,
直到整个序列有序。 
 
4 堆排序代码实现
要求:给你一个数组 {4,6,8,5,9} , 要求使用堆排序法,将数组升序排序。
说明:
1) 堆排序的速度非常快,在我的机器上 8 百万数据 2 秒左右。O(nlogn)
2) 代码实现 
package com.lin.tree_0308;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class HeapSort { public static void main(String[] args) {  //  int[] arr = {4, 6, 8, 5, 9};  // 随机生成  int[] arr = new int[80000000];  for(int i = 0; i < 80000000; i++) {   arr[i] =(int)(Math.random()*8000000);  }  Date date1 = new Date();  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String format1 = simpleDateFormat.format(date1);  System.out.println("排序前时间为:" + format1);    heapSort(arr);    Date date2 = new Date();  String format2= simpleDateFormat.format(date2);  System.out.println("排序后时间为:" + format2); }  // heapSort public static void heapSort(int[] arr) {  int temp = 0;//  adjustHeap(arr, 1, arr.length);//  System.out.println("第一次:" + Arrays.toString(arr));//  //  adjustHeap(arr, 0, arr.length);//  System.out.println("第二次:" + Arrays.toString(arr));  // 将无序序列建成一个堆,根据升序需求选择大顶堆或小顶堆  for(int j = arr.length/2 -1; j >= 0; j--) {   adjustHeap(arr, j, arr.length);  }    // 将堆顶元素与尾元素交换,将最大元素沉到数组尾端  // 重新调整至堆,继续交换,反复操作直至整个序列有序  for(int j = arr.length-1; j > 0; j--) {   temp = arr[j];   arr[j] = arr[0];   arr[0] = temp;   adjustHeap(arr, 0, j);  }   }  // heap /**  *  * @Description:  * @author LinZM  * @date 2021-3-11 10:14:16  * @version V1.8  * @param arr 待调整数组  * @param i 表示非叶子节点在数组中的索引  * @param lenght 表示对多少个元素继续调整,逐渐变小  */ public static void adjustHeap(int[] arr, int i, int length) {  // 先取出当前元素的值  int temp = arr[i];  // j = 2 * i + 1 j是i节点的左节点  for(int j = i * 2 + 1; j < length; j = j * 2 + 1) {   if(j+1 < length && arr[j] < arr[j+1]) {//右子节点大于左子节点    j++;// j指向有子节点   }   if(arr[j] > temp) {// 子节点大于父节点    arr[i] = arr[j];    i = j;   } else {    break;   }  }  arr[i] = temp; }}

 

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

觉得不错的可以点一下右边的推荐哟

 













原文转载:http://www.shaoqun.com/a/623655.html

跨境电商:https://www.ikjzd.com/

刘小东:https://www.ikjzd.com/w/1853

走秀网:https://www.ikjzd.com/w/2427


堆排序1堆排序基本介绍1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。3)每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆4)大顶堆举例说明5)小顶堆举例
拍拍:https://www.ikjzd.com/w/2205
upc:https://www.ikjzd.com/w/111
002315焦点科技:https://www.ikjzd.com/w/1831
2020年如何利用Amazon Business, 获得更多销售额?:https://www.ikjzd.com/home/113688
如何入驻敦煌网?敦煌网开店流程及玩法揭秘!:https://www.ikjzd.com/home/1118
Shopify独立站如何收款专题精讲Paypal、2Checkout、Stripe的较量:https://www.ikjzd.com/home/132113

偷盗近400万!6名亚马逊员工被捕,你的货还在吗?

对于亚马逊卖家来说,货就是命根子,但最近老有人要打它的主意。

盗窃包裹金额超1.9万刀!一亚马逊员工被捕入狱

据外媒报道,近日一名亚马逊员工因涉嫌盗窃价值超过1.9万美元的商品而被捕

据悉,亚马逊的防损团队注意到一名员工在步行到自己的车辆时藏匿了一台Apple MacBook。

被发现后,该员工承认在自己的车辆和公寓中都藏有被盗商品。随后,亚马逊的防损团队从其车内搜到超过1.9万美元的商品。而萨克拉曼多县警方在该员工公寓搜到,130多件属于亚马逊的被盗商品。

根据警方发布的照片,130多件被盗的亚马逊商品包括Apple Macbook、耳机、视频游戏设备、计算机和视频游戏配件、手表、电动工具和毯子等。

萨克拉曼多县警察局没有透露这名员工的身份,不过证实了他已经因涉嫌重大盗窃和挪用公款入狱,接下来就让他去接受法律的审判吧......

亚马逊员工偷窃商品,这不是第一次了。

涉案50万欧元,5名亚马逊员工被捕

去年11月份,西班牙警察逮捕了5名位于亚马逊在西班牙最大仓库圣费尔南多德赫拿勒斯的五名雇员,原因是他们被控盗窃了50万欧元(约合人民币388万元)的手机。

据了解,这一切都始于该公司安全部门的一项内部调查,调查时发现部分价值较高的手机被掉包了。

当时,亚马逊安全部门在分发区内发现五个包裹的出口重量与该中心的进口重量不符时,于是便展开了调查。

发现包裹里装的不是客户购买的高档的手机,随后便相关便报了案,警察们利用隐藏在盗窃现场的安全摄像头成功找到了嫌疑人,在实施逮捕时搜查出10部高档手机和大量印有每台机子的独特标识的IMEI贴纸。

近年来,亚马逊员工盗窃案件频发,丢件事件此起彼伏,这不,最近又发生了亚马逊包裹集体被丢弃事件!

又有亚马逊包裹被丢路边

据外媒报道,近日,英国一男子将车停在路边时,意外发现了散落在剑桥郡圣尼奥特(St Neots)外的A1高速公路旁的数十个亚马逊包裹,并拍摄了现场照片发布到了其Facebook账号上。

据悉,亚马逊的一个物流仓库就坐落在包裹被丢处8英里外的斯蒂克利牧场。

从该男子分享在Facebook上的图片可以看到,在树木和灌木丛中有一个亚马逊员工使用的鲜红色的包裹袋。大约有20个包裹被从邮包里拿了出来,放在地上,包裹上面还显示了客户的地址。大部分包裹已被拆开了,里面什么也没有了。路边还散落着用来包装商品的薄纸。

这些包裹上的标签显示,大都是发给伦敦南部克罗伊登的顾客。

事情发生后,亚马逊就展开了调查,亚马逊的一位发言人表示:"我们正在积极调查此事。"

今年以来,亚马逊丢件事件常有发生:

2月中旬左右,一名途经布鲁克街附近的司机发现了被丢弃在树林中20多个亚马逊包裹,随后,美国马萨诸塞州一个小镇的警察展开调查此事。

2月末,一名纽约男子Kevin Harrington在路边发现了大约20件未妥投的亚马逊包裹,当他通知亚马逊后,亚马逊让他按照合适的方式处理这些包裹。


虽说做亚马逊的日子总是充满意外,但货被丢在路边,这还真有点意外,因此,卖家们在商品发货后,要随时留意商品物流跟踪信息,一旦发现异常,及时联系亚马逊客服处理。

(跨境知道网 原创/小知)

文章来源:https://www.ikjzd.com/home/143110

跨境电商:https://www.ikjzd.com/

好卖家:https://www.ikjzd.com/w/776

1号店网:https://www.ikjzd.com/w/2263

ifttt:https://www.ikjzd.com/w/956

偷盗近400万!6名亚马逊员工被捕,你的货还在吗?

​对于亚马逊卖家来说,货就是命根子,但最近老有人要打它的主意。

收入达70.4亿美元!玩具巨头乐高集团加速电商发展脚步

据悉,玩具巨头乐高集团(LEGO Group)正在加速其数字化扩张此前乐高表示其2020年实现了销售额和收入两位数增长,实现了五年来最快的增速

 

乐高表示2020年的总收入与2019年相比增长了13%,达到70.4亿美元营业利润增长了19%,达到20.8亿美元。其中,建筑套件的销售额去年增长了21%

 

在线业务成发展重心,乐高加速电商脚步

 

乐高集团首席执行官Niels B Christiansen表示"我们知道儿童和成年人都喜欢乐高积木,这将永远是我们业务的核心。但是,如今的儿童正在网络世界中成长,他们毫不费力地将在线游戏和物理游戏融为一体。"

 

所以,发展在线业务成为了乐高集团的重要发展目标和发展策略。

 

克里斯蒂安森告诉英国广播公司,每隔2.77秒,有人将乐高作品上传到他们的在线平台

 

乐高在其2020年财务业绩报告中说,涉及数字和物理游戏的乐高超级马里奥于去年8月发布成为公司最成功的主题发布活动之一。

 

乐高集团表示,今年将继续投资于将实体游戏在线游戏融合在一起的产品。据悉,2020年,乐高总共生产了98674吨乐高积木。

 

电商业务发展迅速,乐高兼顾实体业务发展

 

由于疫情期间,乐高实体店被迫暂时关闭。与上一年相比,LEGO.com网站的访问量翻了一番,同时该公司继续了其全球商店扩张计划。

 

乐高不断扩大其全球市场份额,其中在中国美洲西欧和亚太地区的增长尤其强劲。

 

2020年,乐高在中国开设了134家新零售店,其中包括91家店,使全球总数达到678家。乐高计划在2021年再开设120家店,其中80家在中国。

 

Niels B Christiansen表示:"我们将继续投资以扩大我们全球零售足迹,并提升我们的店内购物体验。这种方法增强了我们的品牌,在所有渠道上都产生了积极的影响。我们还将进一步建立我们的电子商务功能,以在我们自己和合作伙伴的平台上支持在线购物。"





原文转载:http://www.shaoqun.com/a/622668.html

跨境电商:https://www.ikjzd.com/

淘粉吧:https://www.ikjzd.com/w/1725

东西网:https://www.ikjzd.com/w/1238


据悉,玩具巨头乐高集团(LEGOGroup)正在加速其数字化扩张。此前,乐高表示其在2020年实现了销售额和收入的两位数增长,实现了五年来最快的增速。乐高表示,其2020年的总收入与2019年相比增长了13%,达到70.4亿美元;其营业利润增长了19%,达到20.8亿美元。其中,建筑套件的销售额比去年增长了21%。在线业务成发展重心,乐高加速电商脚步乐高集团首席执行官NielsBChristian
宝贝格子:https://www.ikjzd.com/w/1322
wish:https://www.ikjzd.com/w/105
上海跨境通:https://www.ikjzd.com/w/1329
卖家必看!亚马逊3c电子类选品策略概览!:https://www.ikjzd.com/home/111288
全球速卖通打破跨境壁垒,开启2020年双十一全球购物节:https://www.ikjzd.com/home/133343
秒杀要求:https://www.ikjzd.com/tl/14028

年销过$100万、从未去过美国……中国卖家特点你中了几个?

这周,来自老外何伟的一篇文章引起关注,他在《中国制造外交的兴起》中提到了一些中国亚马逊卖家的特点:从未去过美国但密切关注美国新闻、年销过100万美金、listing描述是Amazonglish(亚马逊英语)、能从销售额突然上升判断美国政府发钱、用不同的牌子卖一样的东西来提高占有率……不少卖家表示"说的就是我"。来看看你中了几项。

 

1、从未去过美国,但密切关注美国新闻

 

李先生是亚马逊上的一位鞋类卖家,且销量不低。他从没去过美国,但他的英语很好,会通过各种渠道研究美国市场,同时密切关注美国新闻。

 

中国卖家对美国新闻有直接的感受。年后美国暴风雪导致70多个FBA仓关闭、物流派送延迟;疫情期居家令使产品销售出现两极分化:行李箱、泳帽、护目镜等销量骤降,但LED灯、居家美甲、瑜伽垫、后院充气泳池、自行车等热卖;"黑人命也是命"运动导致多地掀起抗议活动,相关口号T恤等需求暴涨,同时暴乱导致部分卖家包裹被抢。

 

透过当地新闻及社交热点,卖家有机会挖掘潜力产品,及时了解可能干扰物流的因素。

 

2、年销过100万美金,借疫情销售额倍增

 

Marketplace Pulse的数据显示,亚马逊美国站年销售额超过100万美元的顶级卖家,有近一半都在中国。一位亚马逊发言人最近表示该数据不准确,但并未透露中国卖家的具体数量。

 

国内卖家也不同意"年销百万的顶级卖家"这个说法,原因是销售额太低。一位卖家表示,每年卖100万美元的卖家在中国已经算小公司了,每个月上百万的都比比皆是。另一位卖家赞同:"100万美元太少了,我的公司一年亚马逊做到6千万美元也只是中级卖家。大卖得几个亿美元(销售额),不少中国大卖都很牛。"

 

许多人认为2020年是一个好年头。亚马逊小家电大卖Vesync去年业绩大幅上升,净利润增长幅度高达6-9倍;一位卖家表示去年10月份之前销售额已增至3倍;另一位卖家也表示,公司去年三四月还没怎么干活,下半年开始爆发,利润比前年还好。卖家李先生也表示,其鞋类品牌出现了有史以来最好的假日销售,全年总收入比2019年增加了约15%。

 

目前,在美国站前100位卖家中,有17家来自中国,81家来自美国,但不少国内卖家是以美国公司身份在亚马逊销售。

 

3、listing描述是Amazonglish,"笨拙但基本易懂"

 

亚马逊上一些listing描述语言被称为Amazonglish(亚马逊英语——笨拙但基本易懂,冗余但易于搜索。通常,这类产品描述的语言准确性能够通过电脑的语法检查,例如"Your feet can breathe easy in the latest iteration of fabric upper"(最新的鞋面材料让你的脚轻松呼吸)。"

 

如今,越来越多的中国卖家开始在ins上做广告,走的都是简洁chick风,配一个购物网站页面(或者直接Etsy),别的都看不出来,但诸如英文表达、客服邮箱地址和送货渠道等细节很容易判断商家来自国内。一位卖家调侃:"一般英文里面有'my friend' 的,基本就是义乌了。"

 

国内招聘运营人员时,对英语市场运营的语言要求大多是"英语四级",因此Amazonglish十分常见。卖家和运营们还会持续优化产品图片或listing描述,虽然略显笨拙,但这种语言有利搜索。

 

4、能从销售额飙升推断美国政府发钱

 

中国卖家的亚马逊单量几乎成了美国刺激计划的感应器。

 

李先生表示,美国政府开始发钱后,第二天就看到了销量的增长。刺激计划实施两周后,其一个品牌的销售额几乎翻了一番。"只要他们有钱,他们就会花。"他说道。

 

第二天,卖家单量对美国发钱刺激的敏感度惊人。美国第一个刺激计划过后的一段时间,李先生的鞋子订单继续增加,每天出货3000双。

 

经济学家Scott R. Baker认为,李先生在内的一些卖家能够清楚地看到销量增长并不奇怪:"我们发现,大部分开支都是在收到支票后的第一周左右花出去的。虽然大多数美国人似乎都把刺激开支的支票存了起来,但银行账户内存款较少的人更有可能花钱。这些消费者倾向于购买食品、非耐用品和其他便宜的物品——而这些通常是中国商家生产的产品。"

 

受疫情影响,美国人也开始存钱了。Baker表示:"耐用品的支出减少了,人们不再买新车和冰箱。似乎大部分支票都被存起来了。"

 

5、大量申请美国商标,自创品牌名

 

在产品推广上,美国和中国卖家的打法完全不同。

 

一位匿名亚马逊员工表示,她在国外生活后回到了中国,经常要向西雅图的亚马逊同事解释中国人的思维模式。"美国企业家往往痴迷于品牌推广,想用一个伟大的品牌故事来说服客户。在中国,情况正好相反,他们先卖东西,然后才会考虑品牌。"

 

美国咨询师Zack Franklin与深圳的亚马逊卖家合作多年,他说中国电商卖家找到了扩大业务规模的另一种方式——除了扩大产品线或开拓新市场之外,他们还会在同一个地方售卖同样的东西,但用的是不同的品牌。这样可以最大程度提高货架占有率,并在消费者对商品的选择幻觉中赚钱。

 

为了进入品牌注册中心,卖家需要申请商标,所以中国的申请人大量涌向美国专利商标局,卖家李先生注册了大约70个品牌。

 

一家代处理商标申请的律所称,中国人选择的品牌名称有点奇怪,这是因为这些申请往往会更快获批,而一个与知名品牌太接近的名称可能被拒。因此,许多卖家会自创词汇,用作品牌名。

 

(问卷 多选)以上几种中国亚马逊卖家情况,你中了几点呢?

 

(选项)

1、从未去过美国,但密切关注美国新闻;

2、年销过100万美金,借疫情销售额倍增;

3、listing描述是Amazonglish,"笨拙但基本易懂";

4、能从销售额飙升推断美国政府发钱;

6、大量申请美国商标,自创品牌名





原文转载:http://www.shaoqun.com/a/621682.html

跨境电商:https://www.ikjzd.com/

海维:https://www.ikjzd.com/w/1891

patents:https://www.ikjzd.com/w/857


这周,来自老外何伟的一篇文章引起关注,他在《中国制造外交的兴起》中提到了一些中国亚马逊卖家的特点:从未去过美国但密切关注美国新闻、年销过100万美金、listing描述是Amazonglish(亚马逊英语)、能从销售额突然上升判断美国政府发钱、用不同的牌子卖一样的东西来提高占有率……不少卖家表示"说的就是我"。来看看你中了几项。1、从未去过美国,但密切关注美国新闻李先生是亚马逊上的一位鞋类卖家,且
跨境通网站:https://www.ikjzd.com/w/1329
sca:https://www.ikjzd.com/w/2424
代购公司:https://www.ikjzd.com/w/1982
实操干货!Cdiscount手动上传产品详解 :https://www.ikjzd.com/home/59745
亚马逊推出FBA库存新功能!卖家有望申请仓储扩容!:https://www.ikjzd.com/home/132136
2018年,"成人商品"市场或将成为新蓝海品类:https://www.ikjzd.com/home/600

你以为在做的是微服务?不!你只是做了个比单体还糟糕的分布式单体!

昨晚睡觉前,顺手撸了几个群聊的聊天记录。发现一个很有意思的名词"分布式单体",顺藤摸瓜看了一下之前的聊天记录,由于内容骂骂咧咧,我就不贴出来了。。。大致内容就是某公司在做微服务改造,但改的不伦不类,形式上像微服务,而本质上依然是单体,甚至连单体都不如。

这样的改造现象,其实在国内还是蛮多见的。下面就来聊聊这个有趣的话题:分布式单体。各位看官,看看你们公司是不是也犯了这样的错误?

分布式单体为什么不好

先思考一个问题:从单体改造到微服务的时候,你们是不是按这样的步骤来的?

  1. 确定业务领域,拆分存储,定义各微服务的边界
  2. 改造代码逻辑,将原来的内部service调用改成dubbo或feign这样的远程调用

通过这样的改造,我们得到了很多好处,比如:

  1. 代码库分开了,减少了麻烦的解决代码冲突的困扰
  2. CI/CD分开了,每个拆分后的服务都可以独立开发、部署、运行
  3. 数据库分开了,独立运行,不同业务模块不会互相影响

这样一顿操作,我们把一个臃肿的单体应用变成了多个精炼的分布式应用,似乎完美的实现了改造?但这样就实现了微服务的核心目标了吗?继续思考下面的问题:

  1. 代码库是分开了,但每个服务都在独立迭代吗?是不是每个需求都要协调一大堆同步接口?
  2. CI/CD是分开了,但每次发布都是自由的吗?是不是每次功能的发布都拖上了一大推的服务要一起发布?
  3. 数据库是分开了,但似乎有个服务挂了,依然导致很多功能就都不正常了?

看似我们得到了很多好处,但我们的开发效率真的得到了提升吗?虽然我们以前一个单体应用启动要3分钟,现在拆分后,一个项目启动30分钟,但每次开发调试要同时开好几个项目同时启动?这样的开发体验真的爽到了吗?

看似完成了微服务改造,实则依然是个单体应用,只是从原本的集中式实现,变成是分布式实现。原来我们只是做了一次无用功,真正的收益微乎其微。

而实际上,这样的改造,除了收益不高之外,实际上还带出了更多的坏处。如果你们公司是这样做的,有没有发现,这样做之后,好像系统故障的频率更高了?稳定性似乎比单体应用还差?(如果没有,那一定要感谢你们的运维团队真的很给力,同时建议把这篇转给运维团队,采访下这样的改造是不是他们变得更累了?!)

为什么这样的改造会导致系统更加不稳定呢?其实道理很简单,原本我们在单体应用中,未拆分的远程调用都是内部调用,这个内部调用所能引发的故障率是微乎其微的,而将这部分内容拆成了远程调用后,每一个调用都增加了网络IO的因素,每一次调用的故障率都增加了。那么系统的整体故障率是随着系统拥有多少同步远程调用的数量增加而增加的。当运维团队与开发水平没有没有支持好这部分增加的复杂度的时候,那么改造的系统,必然的稳定性会比原来的单体应用更差。

所以,这样改造的结果,不但没有得到很多的收益,反而会带来很多稳定性上的损失。本文首发不伦不类的微服务改造:分布式单体 ,禁止未经授权转载。

改造走样的元凶

那么为什么会造成上面所说的问题呢?我觉得主要有两方面:

  1. 领域拆分的不合理,引出了过多的同步远程调用

这个是最根本的问题,也是在改造过程中最常见的。这部分说实话是整个改造过程中最难的,因为需要对业务有非常深入的认识,对系统设计的领域模型、用户行为有足够的理解。在做拆分的时候,尽可能的减少同步远程调用,取而代之的是走消息的异步交互,同时根据业务需要也可以做适当的数据冗余。这样就能保证,每个被拆分后的微服务之间可以获得更低耦合度。

因为更低的耦合度,我们才能在不做任何优化的情况下,获得更少的分布式所带来的稳定性损失。对于后面要将的第2点的工作量也就越少。同时,对于真正的独立开发、部署、运行也成为可能。

  1. 简单粗暴的实现,缺少分布式的保护机制

在很多团队里,因为业务需求多与人员配置少的矛盾之下下,开发人员很容易出现对远程调用不做足够的保护机制,比如:接口提供方的限流策略(保护自己不被别人搞死),接口调用方的降级策略(保护业务更高的可用性),接口调用方的熔断策略(保护自己不被别人拖死)。只有认真对待每一个分布式环境下的依赖点,那么才能解决因为分布式改造所牵连出的诸多问题。

但要做好这一点的核心,还是对第一点的把握,只有在领域模型上做更合理的拆分规划,才能支持开发人员做好这个点,不然随意的拆分,一大堆接口调用压给本就压力很大的开发人员,那这部分的开发质量是很难保障了,自然而然的系统稳定性就开始随着接口复杂度的增加而不断下降了。最后,开发人员就会开始来我们群里吐槽了...甚至大家也开始怀疑微服务根本带不来效率的提升!

最后,思考一下:你们的微服务改在有出现这里我说的情况吗?还是有其他不一样的问题呢?加入我们的Spring技术交流群,聊聊你的观点!

推荐阅读

  • 微服务(Microservices)中文版
  • 《微服务》九大特性重读笔记
  • 云原生应用的12要素








原文转载:http://www.shaoqun.com/a/621672.html

跨境电商:https://www.ikjzd.com/

askme:https://www.ikjzd.com/w/2459

环球市场:https://www.ikjzd.com/w/1762


昨晚睡觉前,顺手撸了几个群聊的聊天记录。发现一个很有意思的名词"分布式单体",顺藤摸瓜看了一下之前的聊天记录,由于内容骂骂咧咧,我就不贴出来了。。。大致内容就是某公司在做微服务改造,但改的不伦不类,形式上像微服务,而本质上依然是单体,甚至连单体都不如。这样的改造现象,其实在国内还是蛮多见的。下面就来聊聊这个有趣的话题:分布式单体。各位看官,看看你们公司是不是也犯了这样的错误?分布式单体为什么不好先
一淘网比价平台:https://www.ikjzd.com/w/1698
lithium:https://www.ikjzd.com/w/2505
gtin:https://www.ikjzd.com/w/136
亚马逊要求订单发出30天后删除买家所有信息,8月16日生效!:https://www.ikjzd.com/home/103050
口述:女友大腿上纹着前男友的名女友前男友对象:http://lady.shaoqun.com/m/a/29710.html
亚马逊欧洲站再度下调销售佣金 / Flipkart平台采用AI机器人分拣包裹:https://www.ikjzd.com/home/97800

外国人生理期照旧喝冷饮?千万别乱学

核心提示:女人每个月都会有几天的生理期,在生理期的时候有的人就会突然很想吃冷饮,或者说误喝了冷饮。这时候,有的人就会说:反正外国人来月经,还是照样喝冷饮的,也没看出什么不好来。

女人每个月都会有几天的生理期,在生理期的时候有的人就会突然很想吃冷饮,或者说误喝了冷饮。这时候,有的人就会说:反正外国人来月经,还是照样喝冷饮的,也没看出什么不好来。


生理期真的可以喝冷饮吗?那要先从外国人为什么生理期还会喝冷饮说起了。

外国人生理期还在喝冷饮,一个原因就是他们对养生缺乏认知,经常在痛经时靠吃止痛药,掩盖疼痛。


而长期大量接触寒冷物质如冷饮、冷水等确实会对月经健康有不利影响,但是也有一定的个体差异。

另外,如果经期贪食冷饮、淋雨,经常吹空调,或者穿露脐装等,都容易导致宫寒,从而引发痛经。当冰冷的饮料进入人体胃部时,女性的子宫内膜血管也会发生强烈的收缩,从而导致月经量锐减,甚至发生闭经、痛经。

如果短期内少量接触寒冷物质,大部分情况来说不会对月经产生太多不利影响,但是一些女性比较敏感,少量寒冷刺激也可能诱发痛经。所以保护身体最好的办法就是尽量不吃冷饮。


原文转载:http://health.shaoqun.com/a/201107.html

跨境电商:https://www.ikjzd.com/

damai:https://www.ikjzd.com/w/1391

yiqu:https://www.ikjzd.com/w/210


核心提示:女人每个月都会有几天的生理期,在生理期的时候有的人就会突然很想吃冷饮,或者说误喝了冷饮。这时候,有的人就会说:反正外国人来月经,还是照样喝冷饮的,也没看出什么不好来。 女人每个月都会有几天的生理期,在生理期的时候有的人就会突然很想吃冷饮,或者说误喝了冷饮。这时候,有的人就会说:反正外国人来月经,还是照样喝冷饮的,也没看出什么不好来。生理期真的可以喝冷饮吗?那要先从外国人为什么生理期还会喝
淘粉吧返利:https://www.ikjzd.com/w/1725
洋老板:https://www.ikjzd.com/w/2779
writer:https://www.ikjzd.com/w/1280
东南亚电商平台Shopee正扩大其巴西业务规模:https://www.ikjzd.com/home/141566
被跟卖,恶意篡改竞争!船长BI教你亚马逊Listing该怎么维护:https://www.ikjzd.com/home/131941
eBay中的设置小技巧,你get了吗:https://www.ikjzd.com/tl/8045

真香!平均订单额达61美元,2020东南亚电商报告出炉

近日,iPrice Group、SimilarWeb和AppsFlyer发布2020年电子商务年终报告。报告显示,疫情期间,东南亚电商行业发展迅猛,相关数据显著增长。

 

其中,越南、菲律宾、新加坡、印尼、马来西亚、泰国六国绝对是东南亚地区的"优等生",六国的电商市场规模仍将持续扩大,预计到2025年将达1720亿美元。

 

同时,这份报告还发布了2020年东南亚电商市场的三大变化,卖家们速看!

 

1、平均订单额增长

 

疫情期间,时尚类、电子类、户外用品类等电子商务网站的流量均有所下滑,但有趣的是,以上类别的平均订单额却呈上升趋势。

 

iPrice指出,在2020年,东南亚线上消费者的平均订单额增长了32美元,相较2019年增长率为19%。其中,2020年马来西亚的平均订单额增长至41美元,新加坡的平均订单额更是达到了61美元

 

       2、电商平台流量变化

 

报告显示,在疫情期间,部分电子商务网站的流量有所下降,六个国家中化妆品、时尚类网站的流量平均分别下降了35%和14%。

 

但整体来看,东南亚电商平台的流量呈增长趋势,其中,新加坡地区相较2019年增长了35%,成为东南亚地区的"佼佼者"。其次,菲律宾增长了21%,越南增长了19%,马来西亚增长了17%,泰国增长了15%,印尼增长了6%。

 

       3、购物应用的安装率与卸载率

 

数据显示,在2020年1月至6月期间,iOS和Android的购物应用自然装机量小幅上涨了2%。

 

而影响安装率的因素无外乎有三种,分别为大促活动、行动管制令当地节日等。在行动管制令实施以后,许多购物应用的安装率便直线上升。另外,在农历新年、斋月宋干节期间,各平台推出的促销活动也吸引了不少新用户。

 

值得一提的是,目前越南、印尼、马来西亚、新加坡、泰国这五个国家的卸载率在不断增长。

 

近年来,东南亚电商行业发展速度惊人,但未来潜力仍旧巨大,这一"聚宝盆"等待更多卖家前去发掘。




原文转载:http://www.shaoqun.com/a/621669.html

跨境电商:https://www.ikjzd.com/

深兰科技:https://www.ikjzd.com/w/1517

asinseed:https://www.ikjzd.com/w/533


近日,iPriceGroup、SimilarWeb和AppsFlyer发布了2020年电子商务年终报告。报告显示,疫情期间,东南亚电商行业发展迅猛,相关数据显著增长。其中,越南、菲律宾、新加坡、印尼、马来西亚、泰国六国绝对是东南亚地区的"优等生",六国的电商市场规模仍将持续扩大,预计到2025年将达1720亿美元。同时,这份报告还发布了2020年东南亚电商市场的三大变化,卖家们速看!1、平均订单额
网络星期一:https://www.ikjzd.com/w/80
rfq:https://www.ikjzd.com/w/251
拍拍网:https://www.ikjzd.com/w/2205
如何通过热销、热搜选择利润款产品:https://www.ikjzd.com/home/15324
"亚马逊推荐"的奇葩反差:https://www.ikjzd.com/home/9300
还在为亚马逊类目分类审核头疼?大咖教你如何提交发票快速通过分类审核!:https://www.ikjzd.com/home/12184

急救专家突发心梗,他用生命给学生上了一课|成都市|急诊科

  *本文所涉及专业部分,仅供医学专业人士阅读参考

  文章来源:医学界

  老专家用生命考核院急救队伍,收到满意答卷。

  M老师(化名)是川内乃至全国有名的120急救专家。2月27日,大水冲了龙王庙,M老师突发心梗,医院接到M老师的求助,还以为M老师在搞演练抽查。成都市第一人民医院和M老师及其家属配合,医患实力上演教科书式"真实演练",成功救回心脏骤停20分钟的M老师。

  "现场抢救我的,都是我培训过的学生,是他们的硬核抢救,让我获得重生。"正在康复中的M老师表示,"这次是我用生命考核了市一医院曾经培训过的急救医护人员,证明他们确实是急救技术过硬的团队。"


  120急救专家突发心梗

  专业素养让他及时打了120

  近日,成都市第一人民医院病房内,M老师正和来访者回忆自己惊心动魄的经历。

  M老师享誉省、市急诊急救界,曾担任成都市第一人民医院急诊科主任,目前在成都市120急救中心做急救培训。多次负责省市两会等重大活动的医疗保障,病发前还在组织培训今年成都举办世界大运会医疗保障队伍。得知M老师病危后脱险,市内多家医院同仁自发前来探望。

  M老师回忆,2月27日,他在春熙路的母亲家午休,忽然感到一阵胸痛,15分钟都没缓解,多年专业素养告诉他"我好像心梗了",他让家人第一时间拨通120。成都市第二人民医院救护车在7分钟内迅速赶到。

  "快,给我拉张心电图。"这是医生进门后M老师第一句话。查看检查结果后,M老师请医生给自己用了药。上救护车后,"喉咙灼烧难忍,疼痛一直延伸到胃。"


  心电图

  由于M老师之前担任过成都市第一人民医院急诊科主任,对成都市第一人民医院有特殊的感情,坚信自己一手培养的急救医护人员水平过硬,他坚持要从春熙路到高新区万象北路18号市一医院。

  "我其实是反对的。"M老师的家人回忆,"对于心梗患者来说,时间就是生命,万一转运途中堵车,耽误个10来分钟,这条命可能就会挂在路上,但架不住他对市一医院的情怀与坚持。他声称自己生是一医院人,死是一医院鬼。"

  心脏骤停在急诊科

  是最佳救命地点

  下午四点半,M老师被送到市一医院。急诊科、心内科、重症医学科医生迅速为他会诊。

  "刚到医院,救护车的医生及时提供了心电图检查结果,为我们诊断提供了重要依据。"心内科医生刘童说,大家争分夺秒给M老师做检查,并准备做手术。M老师躺在病床上,还要参与会诊,给自己下诊断,给自己开药方。

  "我应该是得了……"话音未落,M老师忽然眼珠一翻,心电图变成一根直线,呼吸也没了,病情急转直下。

  好在心脏骤停发生在市一医院,病情演变在医生眼皮下,是最佳救命地点。

  持续胸外心脏按压,室速室颤电击除颤4次,困难气道麻醉科快速气管插管,机械通气及心肺复苏40余分钟……多学科、多专业、多团队共同完善高级生命支持治疗,M老师的心跳和呼吸终于稳定了。



  转律再次发作室颤

  "从来没有这么紧张过。"急诊科护士长胥丽事后回忆,"他是我们急诊科老主任,既然心脏骤停在我们急诊科,我们无论如何都要把他救回来。"


  死亡率极高的疾病

  医院多学科合作力挽狂澜

  M老师在昏迷中,在各种仪器设备的强力生命支持条件下,由心血管介入团队对其完成了急诊冠脉造影检查——心脏右侧冠状动脉完全堵塞,伴有大量血栓形成!这是急性心肌梗死,需要马上手术开通血管。


  堵塞的血管

  这种情况,手术风险和死亡率都很高。

  术前,医院的专家团队做好了各种应急准备工作,临时心脏起搏器、主动脉球囊反搏,连心脏外科的ECMO人工膜肺团队也作为B计划处于待命中。

  心脏介入手术持续了差不多一个小时,从M老师一根堵塞的血管中抽出了大量新鲜血栓,并在严重狭窄的部位植入了两枚支架,整个血管恢复了良好的血流。



  血管开通后

  重症医学科的医生在手术中对M老师的生命体征、镇静镇痛以及呼吸支持做出了严密细致的监测和管理,保障了手术的安全性。



  手术中

  手术成功后,M老师也被迅速转入重症医学科接受进一步的监护和治疗。


  术后继续监护治疗

  从抢救,到手术,再到进入ICU,数十位医护人员参与,令人感动。

  五大正确举措救命

  120专家是教科书式病人

  "这位老前辈,用自己的生命给医生们上了一堂'含金量'超满溢的急性心梗多科协作急救课。他得救,除了医院的精准高效抢救,还要归功于他自己,以及兄弟医院的专业急救。"心内科医生刘童总结了M老师得救的五大因素:

  一是M老师对心梗的自我了解和重视,发病后第一时间向120中心专业医疗团队求救。

  二是M老师及时在急救医护人员的严密监护下送达医院急诊科,医生得以目睹完整的发病过程,没有其它非专业因素的干扰,对于及时准确的判断病情,提供了重要依据。


  急救现场

  三是M老师选择了有重大危急重症抢救能力的医院,医院拥有专业的生命支持团队和各种先进仪器设备,能够提供最快速有效的抢救措施。


  专业的生命支持团队和各种先进的仪器设备

  四是M老师抵达市一医院后,跟救护车的医生第一时间提供了"首份"心电图检查资料,这是最为关键最为重要的疾病诊断证据,一医院医生几乎是看了一眼就准确判断出了病灶部位。

  五是M老师家人高度配合。抢救过程中,M老师家人对医生完全信任,对任何抢救措施都毫不质疑,马上同意手术,为M老师赢得最佳抢救时间。

  这五个因素环环相扣促使抢救成功。M老师及其家人的一系列正确举措,成为医生们交口称赞的教科书式病人。

  老专家用生命考核院急救队伍

  收到满意答卷

  目前,M老师已经转回普通病房,病情明显缓解,精神状态良好。


  M老师转回普通病房治疗

  M老师的家人提起一个戏剧化的事:"M老师发病后,医院救护车几分钟就到了,提供救护车医院的医护人员说,还以为是M老师在搞急救演练抽查,没想到M老师真的发病了。"

  M老师也说,这次以这种特殊的方式回到市一医院,他感到特别亲切,本人及家属都格外感激。"我都离开这么多年了,大家都还是那么熟悉,一医院确实拥有一支训练有素的急救医护队伍,聚集着一批医术精湛的专业技术人才,秉承医者仁心的精神,以人为本,持有一种待患者如亲人的医护态度。这次我是在用生命考核曾经培训过的急救医护人员,证明他们是合格的。"

  图文来源:成都市第一人民医院

  转自:四川院前急救中心站管理分会

  校对:臧恒佳

  责编:潘颖

原文转载:http://tech.shaoqun.com/a/374779.html

跨境电商:https://www.ikjzd.com/

声网agora:https://www.ikjzd.com/w/2176

盘古集团:https://www.ikjzd.com/w/1448


*本文所涉及专业部分,仅供医学专业人士阅读参考  文章来源:医学界  老专家用生命考核院急救队伍,收到满意答卷。  M老师(化名)是川内乃至全国有名的120急救专家。2月27日,大水冲了龙王庙,M老师突发心梗,医院接到M老师的求助,还以为M老师在搞演练抽查。成都市第一人民医院和M老师及其家属配合,医患实力上演教科书式"真实演练",成功救回心脏骤停20分钟的M老师。  "现场抢救我的,都是我培训过的
克雷格:https://www.ikjzd.com/w/194
巴克莱:https://www.ikjzd.com/w/2775
敏思达:https://www.ikjzd.com/w/2304
亚马逊流量运营怎么玩才能爆单?以Anker为例:https://www.ikjzd.com/home/9008
干货分享:亚马逊无货源店铺选品6大要素!:https://www.ikjzd.com/home/91620
关于英国脱欧之后的EORI,英国/欧盟FBA,国际清单,价格指导…:https://www.ikjzd.com/home/132910

2021年3月11日星期四

使用css3和javascript开发web拾色器实例

本实例中的web拾色器功能使用css3实现页面效果,即在页面上显示的元素用css3样式来实现的。再使用js生成拾色器颜色数据,并控制各元素的鼠标事件。当事件作为反应时,获取到对应的数据并显示颜色值。

拾色器的html元素分为三个部分,分别是拾色区域、色系区域和颜色显示区域,如图所示:

 web拾色器三个部分的html元素如下:

<div class="color_container"> <div class="main_wrap"> <!--拾色区域--> <div class="main_drag" id="mainDrag"></div> <div class="main_con" id="mainCon">  <div class="left_white_bg bg"></div>  <div class="bottom_black_bg bg"></div> </div> </div> <div class="side_wrap"> <!--色系区域--> <div class="side_drag" id="sideDrag"></div> <div class="side_con" id="sideCon"></div> </div> <div class="show_color" id="findColor"><!--显示区域--> <div class="color_full" id="colorFull"></div> <div class="color_text" id="colorText">  R:<input type="text" readonly>  G:<input type="text" readonly>  B:<input type="text" readonly> </div> </div></div>

加上一些css样式实现图片上的布局效果:

.color_container {width:610px;background:#333;padding:10px;font-size:0;margin:30px auto;}.color_container>div{display:inline-block;background:#fff;vertical-align:top;box-shadow:0px 0px 5px 0px #999;}.color_container .main_con{width:550px;height:430px;}.color_container .main_con .bg{position:absolute;top:0;right:0;bottom:0;left:0;}.color_container .side_con{width:50px;height:430px;}.color_container .main_wrap,.color_container .side_wrap{position:relative;}.color_container .side_wrap{margin-left:10px;}.color_container .main_drag,.color_container .side_drag{position:absolute;border:1px solid #fff;background:rgba(0,0,0,.3);cursor:pointer;}.color_container .main_drag{width:12px;height:12px;border-radius:50%;z-index:3;left:-7px;top:-7px;}.color_container .side_drag{height:6px;width:54px;border-radius:2px;left:-3px;top:-4px;}.color_container .find_color{width:60px;height:60px;position:absolute;top:0;left:-70px;background:#fff;}.color_container .show_color{display:block;margin:10px 0 0;height:auto;padding:10px;}.color_container .color_full{display:inline-block;width:58px;height:58px;border:1px solid #ccc;}.color_container .color_text{display:inline-block;margin-left:30px;height:60px;line-height:60px;text-align:center;font-size:14px;vertical-align:top;}.color_container .color_text input{width:24px;margin:0 15px 0 5px;}

接下来使用css3的 linear-gradient 线性渐变来修改色系区域元素的背景颜色。色系规则是 红>黄>绿>青>蓝>紫>红,共经过了6次变化,每次变化比例是16%-17%之间,所以可以从上至下添加这七个渐变颜色,增加的css代码如下:

.color_container .side_con{background:linear-gradient(to bottom,red 0%,#ff0 17%,lime 33%,cyan 50%,blue 66%,#f0f 83%,red 100%)}

此时效果如图所示:

 

 拾色区域一般默认颜色是红色系,所以先给拾色区域添加红色背景,代码如下:

.color_container .main_con{background:red;}

此时效果如图所示:

一般拾色器的拾色区域显示规则是,从上至下由明到暗;从左至右由浅到深。这种效果可以添加两个 linear-gradient 透明渐变实现,代码如下:

.color_container .main_con .left_white_bg{background:linear-gradient(to right,#fff 0%,transparent 100%)}.color_container .main_con .bottom_black_bg{background:linear-gradient(to bottom,transparent 0%,#000 100%);}

此时已经实现最终静态效果如图所示:

 

此时web拾色器页面效果是有了,但还缺少交互,不能改变拾色区域背景及选择颜色,接下来通过js来实现交互效果。

因为鼠标在拖动吸管选择颜色是每个像素移动的,所以需要根据色系区域高度来计算颜色值并存储备用,代码如下所示:

//色系存储数据var aColorSeries = { r:[255],g:[0],b:[0]}//色系数据变化var aColorVary = ['g','r','b','g','r','b'];//色系元素var eSeries = document.getElementById('sideCon');//每个色系颜色变化次数var nSeriesLen = Math.floor(eSeries.offsetHeight / 6);//每次变化步长值var nStep = Math.floor(255 / nSeriesLen);//步长值剩余值var nStepRemainder = 255 / nSeriesLen - nStep;//循环存储色系rgb颜色值for(let i=0;i<aColorVary.length;i++){ let add = (i % 2); //因为高度不能整除,需要使最终色系填满元素 let nFull = 0; //计算剩余的步长值 for(let j=0;j<nSeriesLen+add;j++){ nFull += nStepRemainder; let nAddStep = nStep; if(nFull>1){ //剩余步长值超过1时,每次增加步长值加1  nAddStep = nStep + 1;  nFull = nFull - 1; } //遍历色系数据对象添加颜色值 for(let k in aColorSeries){  let nVal = 0;  let nOldVal = aColorSeries[k][aColorSeries[k].length-1];  if(k==aColorVary[i]){  if(add==0){ //判断颜色值改变方向是变大还是变小   nVal = nOldVal + nAddStep;  }else{   nVal = nOldVal - nAddStep;  }  if(nVal > 255){ //限制最大值255   nVal = 255;  }else if(nVal < 0){ //限制最小值为0   nVal = 0;  }  }else{  nVal = nOldVal;  }  aColorSeries[k].push(nVal); } }}

在色系区域吸管上加上拖拽功能,代码如下所示:

//获取拾色区域var eMainCon = document.getElementById('mainCon');//获取色系吸管var eSideDrag = document.getElementById('sideDrag');//获取吸管高度var nSideDragH = eSideDrag.offsetHeight;//获取吸管限制高度var nSideH = eSeries.offsetHeight - nSideDragH / 2; //在色系吸管上绑定鼠标按下事件eSideDrag.addEventListener('mousedown',function(event){ //初始化鼠标开始拖拽的点击位置 var nInitY = event.clientY; //初始化色系吸管位置 var nInitTop = this.offsetTop; //色系吸管位置 var nY = null; //色系选择颜色 var color = null; document.onmousemove = event=>{ //鼠标移动时取消默认行为,避免选中其他元素或文字 event.preventDefault(); //根据鼠标设置色系吸管位置 nY = event.clientY - nInitY + nInitTop; //下面的条件限制色系吸管不能超出范围 if(nY >= nSideH-1){  nY = nSideH-1; } if(nY <= -nSideDragH/2){  nY = -nSideDragH/2; } //因为用的是箭头函数,所以this还是指向滑块,修改滑块位置 this.style.top = nY + 'px'; //修改拾色区背景颜色 let n = nY + nSideDragH / 2; color = {r:aColorSeries.r[n],g:aColorSeries.g[n],b:aColorSeries.b[n]}; eMainCon.style.background = `rgb(${color.r},${color.g},${color.b})`; } //鼠标释放事件 document.onmouseup = event=>{ document.onmouseup = null; document.onmousemove = null;  }});

此时色系区域的吸管拖动时,拾色区域的背景颜色就会跟着变化,效果如图所示:

 

 

在色系区域再加上点击事件,点击时可以把吸管滑动到点击的位置,并修改拾色区域颜色,代码如下所示:

//色系元素绑定点击事件eSeries.addEventListener('click',function(event){ //获取点击位置 let nY = event.offsetY - nSideDragH/2; //增加过渡样式,使吸管有滑动效果 eSideDrag.style.transition = '.1s'; //删除过渡样式 setTimeout(e=>{ eSideDrag.style.transition = 'inherit'; },100) //改变色系吸管位置  eSideDrag.style.top = nY + 'px'; //修改拾色区背景颜色 let n = nY + nSideDragH / 2; color = {r:aColorSeries.r[n],g:aColorSeries.g[n],b:aColorSeries.b[n]}; eMainCon.style.background = `rgb(${color.r},${color.g},${color.b})`;});

 

同样的,拾色区域也需要把颜色存储起来。因为每次选择色系时,拾色区域颜色都会修改,所以用一个函数实现此功能,代码如下所示:

//拾色区域颜色var aColorMainStore = [];//获取拾色区域的宽度和高度var nMainW = eMainCon.offsetWidth;var nMainH = eMainCon.offsetHeight;function fnColorSet(color){ //重置拾色区域颜色数据 aColorMainStore = []; //左侧可变颜色,默认为白色 var oLeftColor = {r:255,g:255,b:255}; //右侧可变颜色,因为color参数是字符串,所以要转换为数组 var oRightColor = JSON.parse(JSON.stringify(color)); //底部颜色固定黑色 var oBottomColor = {r:0,g:0,b:0}; //因为色块可变颜色从左上角开始,所以默认设置为白色 var oMainColor = {r:255,g:255,b:255}; //Y轴步长值 var oYStep = { lStep: Math.floor(256 / nMainH), //左侧从上至下是从白色渐变到黑色,所以固定步长值计算 lRemainder: 256 / nMainH - Math.floor(256 / nMainH), //左侧步长剩余值 lAdd:0, //渐变过程添加值 } //枚举添加右侧从下至下渐变步长值、剩余值及添加值 for(let k in oRightColor){ oYStep[k+'Step'] = Math.floor((oRightColor[k]-oBottomColor[k]+1) / nMainH); oYStep[k+'Remainder'] = (oRightColor[k]-oBottomColor[k]+1) / nMainH - Math.floor((oRightColor[k]-oBottomColor[k]+1) / nMainH); oYStep[k+'Add'] = 0; } //循环每一行色块 for(let i=0;i<nMainH;i++){ //因为每一列的颜色都是往下加深渐变,所以除第一行之外每行循环都需要修改左侧和右侧颜色 if(i>0){  oYStep.lAdd += oYStep.lRemainder;  for(let k in oLeftColor){  //修改左侧颜色  if(oYStep.lAdd>1){   oLeftColor[k] = oLeftColor[k] - (oYStep.lStep + 1);  }else{   oLeftColor[k] = oLeftColor[k] - oYStep.lStep;  }  //修改右侧颜色  oYStep[k+'Add'] += oYStep[k+'Remainder'];  if(oYStep[k+'Add']>1){   oRightColor[k] = oRightColor[k] - (oYStep[k+'Step'] + 1);   //修改添加值   oYStep[k+'Add'] = oYStep[k+'Add'] - 1;  }else{   oRightColor[k] = oRightColor[k] - oYStep[k+'Step'];  }  }  //修改添加值  if(oYStep.lAdd>1){  oYStep.lAdd = oYStep.lAdd - 1;  } }  //每一行的色块颜色单独存到一个新的数组中 aColorMainStore.push([]); //每一次循环色块都要重置为左侧颜色 oMainColor = JSON.parse(JSON.stringify(oLeftColor)); //x轴步长值 let oXStep = {} for(let k in oLeftColor){  oXStep[k+'Step'] = Math.floor((oLeftColor[k]-oRightColor[k]) / nMainW);  oXStep[k+'Remainder'] = (oLeftColor[k]-oRightColor[k]) / nMainW - Math.floor((oLeftColor[k]-oRightColor[k]) / nMainW);  oXStep[k+'Add'] = 0; }  //在每一行中循环每一列色块 for(let j=0;j<nMainW;j++){  if(j!=0&&j!=nMainW-1){ //第一个色块颜色和最后一个颜色不需要修改  //从左至右渐变颜色  for(let k in oMainColor){   //逐步修改颜色   oXStep[k+'Add'] += oXStep[k+'Remainder'];   if(oXStep[k+'Add']>1){   oMainColor[k] = oMainColor[k] - (oXStep[k+'Step'] + 1);   oXStep[k+'Add'] = oXStep[k+'Add'] - 1;   }else{   oMainColor[k] = oMainColor[k] - oXStep[k+'Step'];   }  }  }  if(j==nMainW-1){  //最后的颜色设置为右侧颜色值  oMainColor = JSON.parse(JSON.stringify(oRightColor));  }   //存储色块颜色  aColorMainStore[i].push(JSON.stringify(oMainColor)); } }}//默认颜色为红色背景fnColorSet({r:255,g:0,b:0});

再给拾色区域的吸管加上拖拽功能,拾色区域加上点击事件,并修改显示区域的颜色及 rgb 的值,代码如下所示:

//获取显示颜色块var eColorFull = document.getElementById('colorFull');var eColorText = document.getElementById('colorText');var aColorInput = eColorText.getElementsByTagName('input');function fnColorFull(color){ //颜色参数是字符串,需要转换为数组 var color = JSON.parse(color); // 修改显示颜色 eColorFull.style.background = 'rgb('+color.join(',')+')'; //修改RGB颜色值 for(let i=0;i<aColorInput.length;i++){ aColorInput[i].value = color[i]; }}//默认显示白色fnColorFull('[255,255,255]');//获取吸管元素var eMainDrag = document.getElementById('mainDrag');//aMainColorStore数组中颜色行下标var nSX = 0;//aMainColorStore数组中颜色列下标var nSY = 0;//获取吸管高度var nMainDragH = eMainDrag.offsetHeight;//获取吸管限制宽度var nMainLimitW = nMainW - nMainDragH / 2;//获取吸管限制高度var nMainLimitH = nMainH - nMainDragH / 2;eMainDrag.addEventListener('mousedown',function(event){ //初始化鼠标开始拖拽的点击位置 var nInitX = event.clientX; var nInitY = event.clientY; //初始化吸管位置 var nInitTop = this.offsetTop; var nInitLeft = this.offsetLeft; //选中吸管后,在document上绑定鼠标移动事件 document.onmousemove = event=>{ //鼠标移动时取消默认行为,避免选中其他元素或文字 event.preventDefault(); //获取鼠标位置 let nX = event.clientX - nInitX + nInitLeft; let nY = event.clientY - nInitY + nInitTop; //以下的条件用于限制吸管不能移出拾色区域 if(nY >= nMainLimitH-1){  nY = nMainLimitH-1; } if(nY <= -nMainDragH/2){  nY = -nMainDragH/2; } if(nX <= -nMainDragH/2){  nX = -nMainDragH/2; } if(nX>=nMainLimitW-1){  nX = nMainLimitW-1; } //因为用的是箭头函数,所以this还是指向吸管,修改吸管位置 this.style.top = nY + 'px'; this.style.left = nX + 'px'; //颜色赋值,因为没办法选到最后一个颜色,所以加这个公式,这样中间有些颜色选不到 nSX = nX + nMainDragH/2; nSY = nY + nMainDragH/2; //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); } //松开鼠标后释放document上的事件 document.onmouseup = event=>{ document.onmouseup = null; document.onmousemove = null; } });//拾色区域绑定点击事件eMainCon.addEventListener('click',function(event){ //获取点击位置 let nX = event.offsetX - nMainDragH/2 let nY = event.offsetY - nMainDragH/2; //增加过渡样式,使吸管有滑动效果 eMainDrag.style.transition = '.1s'; //删除过渡样式 setTimeout(e=>{ eMainDrag.style.transition = 'inherit'; },100) //改变拾色吸管位置  eMainDrag.style.top = nY + 'px'; eMainDrag.style.left = nX + 'px'; //颜色赋值,因为没办法选到最后一个颜色,所以加这个公式,这样中间有些颜色选不到 nSX = nX + nMainDragH/2; nSY = nY + nMainDragH/2; //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); });

此时已经可以拖动拾色区域吸管并选择颜色。但此时还没有完全开发完成,因为之前在修改色系的事件中,只是修改了拾色区域的背景,并没有存储拾色区域的颜色,所以需要在色系元素的事件中添加如下代码:

//在色系吸管上绑定鼠标按下事件eSideDrag.addEventListener('mousedown',function(event){ /*...*/ //鼠标释放事件 document.onmouseup = event=>{ document.onmouseup = null; document.onmousemove = null; //设置拾色区颜色 color&&fnColorSet(color); //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); }});//色系元素绑定点击事件eSeries.addEventListener('click',function(event){ //*...*/ //删除过渡样式 setTimeout(e=>{ eSideDrag.style.transition = 'inherit'; //设置拾色区颜色 color&&fnColorSet(color); //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); },100) /*...*/});

 

一个流畅的web拾色器就完成了,我在代码中都尽可能加上了详细的注释,可以帮助更清晰的理解功能实现逻辑。









原文转载:http://www.shaoqun.com/a/619650.html

跨境电商:https://www.ikjzd.com/

贝贝母婴网:https://www.ikjzd.com/w/1321

欧麦:https://www.ikjzd.com/w/2085


本实例中的web拾色器功能使用css3实现页面效果,即在页面上显示的元素用css3样式来实现的。再使用js生成拾色器颜色数据,并控制各元素的鼠标事件。当事件作为反应时,获取到对应的数据并显示颜色值。拾色器的html元素分为三个部分,分别是拾色区域、色系区域和颜色显示区域,如图所示:web拾色器三个部分的html元素如下:<divclass="color_container"
拍怕:https://www.ikjzd.com/w/2205
败欧洲运费:https://www.ikjzd.com/w/1555
五洲会海购:https://www.ikjzd.com/w/1068
中暑|中暑新闻资讯及中暑报道:http://tech.shaoqun.com/m/s/%E4%B8%AD%E6%9A%91.aspx
亚马逊应用商店:https://www.ikjzd.com/w/531
Review突然消失?后review时代还能怎么玩?:https://www.ikjzd.com/home/6406

使用css3和javascript开发web拾色器实例

本实例中的web拾色器功能使用css3实现页面效果,即在页面上显示的元素用css3样式来实现的。再使用js生成拾色器颜色数据,并控制各元素的鼠标事件。当事件作为反应时,获取到对应的数据并显示颜色值。

拾色器的html元素分为三个部分,分别是拾色区域、色系区域和颜色显示区域,如图所示:

 web拾色器三个部分的html元素如下:

<div class="color_container"> <div class="main_wrap"> <!--拾色区域--> <div class="main_drag" id="mainDrag"></div> <div class="main_con" id="mainCon">  <div class="left_white_bg bg"></div>  <div class="bottom_black_bg bg"></div> </div> </div> <div class="side_wrap"> <!--色系区域--> <div class="side_drag" id="sideDrag"></div> <div class="side_con" id="sideCon"></div> </div> <div class="show_color" id="findColor"><!--显示区域--> <div class="color_full" id="colorFull"></div> <div class="color_text" id="colorText">  R:<input type="text" readonly>  G:<input type="text" readonly>  B:<input type="text" readonly> </div> </div></div>

加上一些css样式实现图片上的布局效果:

.color_container {width:610px;background:#333;padding:10px;font-size:0;margin:30px auto;}.color_container>div{display:inline-block;background:#fff;vertical-align:top;box-shadow:0px 0px 5px 0px #999;}.color_container .main_con{width:550px;height:430px;}.color_container .main_con .bg{position:absolute;top:0;right:0;bottom:0;left:0;}.color_container .side_con{width:50px;height:430px;}.color_container .main_wrap,.color_container .side_wrap{position:relative;}.color_container .side_wrap{margin-left:10px;}.color_container .main_drag,.color_container .side_drag{position:absolute;border:1px solid #fff;background:rgba(0,0,0,.3);cursor:pointer;}.color_container .main_drag{width:12px;height:12px;border-radius:50%;z-index:3;left:-7px;top:-7px;}.color_container .side_drag{height:6px;width:54px;border-radius:2px;left:-3px;top:-4px;}.color_container .find_color{width:60px;height:60px;position:absolute;top:0;left:-70px;background:#fff;}.color_container .show_color{display:block;margin:10px 0 0;height:auto;padding:10px;}.color_container .color_full{display:inline-block;width:58px;height:58px;border:1px solid #ccc;}.color_container .color_text{display:inline-block;margin-left:30px;height:60px;line-height:60px;text-align:center;font-size:14px;vertical-align:top;}.color_container .color_text input{width:24px;margin:0 15px 0 5px;}

接下来使用css3的 linear-gradient 线性渐变来修改色系区域元素的背景颜色。色系规则是 红>黄>绿>青>蓝>紫>红,共经过了6次变化,每次变化比例是16%-17%之间,所以可以从上至下添加这七个渐变颜色,增加的css代码如下:

.color_container .side_con{background:linear-gradient(to bottom,red 0%,#ff0 17%,lime 33%,cyan 50%,blue 66%,#f0f 83%,red 100%)}

此时效果如图所示:

 

 拾色区域一般默认颜色是红色系,所以先给拾色区域添加红色背景,代码如下:

.color_container .main_con{background:red;}

此时效果如图所示:

一般拾色器的拾色区域显示规则是,从上至下由明到暗;从左至右由浅到深。这种效果可以添加两个 linear-gradient 透明渐变实现,代码如下:

.color_container .main_con .left_white_bg{background:linear-gradient(to right,#fff 0%,transparent 100%)}.color_container .main_con .bottom_black_bg{background:linear-gradient(to bottom,transparent 0%,#000 100%);}

此时已经实现最终静态效果如图所示:

 

此时web拾色器页面效果是有了,但还缺少交互,不能改变拾色区域背景及选择颜色,接下来通过js来实现交互效果。

因为鼠标在拖动吸管选择颜色是每个像素移动的,所以需要根据色系区域高度来计算颜色值并存储备用,代码如下所示:

//色系存储数据var aColorSeries = { r:[255],g:[0],b:[0]}//色系数据变化var aColorVary = ['g','r','b','g','r','b'];//色系元素var eSeries = document.getElementById('sideCon');//每个色系颜色变化次数var nSeriesLen = Math.floor(eSeries.offsetHeight / 6);//每次变化步长值var nStep = Math.floor(255 / nSeriesLen);//步长值剩余值var nStepRemainder = 255 / nSeriesLen - nStep;//循环存储色系rgb颜色值for(let i=0;i<aColorVary.length;i++){ let add = (i % 2); //因为高度不能整除,需要使最终色系填满元素 let nFull = 0; //计算剩余的步长值 for(let j=0;j<nSeriesLen+add;j++){ nFull += nStepRemainder; let nAddStep = nStep; if(nFull>1){ //剩余步长值超过1时,每次增加步长值加1  nAddStep = nStep + 1;  nFull = nFull - 1; } //遍历色系数据对象添加颜色值 for(let k in aColorSeries){  let nVal = 0;  let nOldVal = aColorSeries[k][aColorSeries[k].length-1];  if(k==aColorVary[i]){  if(add==0){ //判断颜色值改变方向是变大还是变小   nVal = nOldVal + nAddStep;  }else{   nVal = nOldVal - nAddStep;  }  if(nVal > 255){ //限制最大值255   nVal = 255;  }else if(nVal < 0){ //限制最小值为0   nVal = 0;  }  }else{  nVal = nOldVal;  }  aColorSeries[k].push(nVal); } }}

在色系区域吸管上加上拖拽功能,代码如下所示:

//获取拾色区域var eMainCon = document.getElementById('mainCon');//获取色系吸管var eSideDrag = document.getElementById('sideDrag');//获取吸管高度var nSideDragH = eSideDrag.offsetHeight;//获取吸管限制高度var nSideH = eSeries.offsetHeight - nSideDragH / 2; //在色系吸管上绑定鼠标按下事件eSideDrag.addEventListener('mousedown',function(event){ //初始化鼠标开始拖拽的点击位置 var nInitY = event.clientY; //初始化色系吸管位置 var nInitTop = this.offsetTop; //色系吸管位置 var nY = null; //色系选择颜色 var color = null; document.onmousemove = event=>{ //鼠标移动时取消默认行为,避免选中其他元素或文字 event.preventDefault(); //根据鼠标设置色系吸管位置 nY = event.clientY - nInitY + nInitTop; //下面的条件限制色系吸管不能超出范围 if(nY >= nSideH-1){  nY = nSideH-1; } if(nY <= -nSideDragH/2){  nY = -nSideDragH/2; } //因为用的是箭头函数,所以this还是指向滑块,修改滑块位置 this.style.top = nY + 'px'; //修改拾色区背景颜色 let n = nY + nSideDragH / 2; color = {r:aColorSeries.r[n],g:aColorSeries.g[n],b:aColorSeries.b[n]}; eMainCon.style.background = `rgb(${color.r},${color.g},${color.b})`; } //鼠标释放事件 document.onmouseup = event=>{ document.onmouseup = null; document.onmousemove = null;  }});

此时色系区域的吸管拖动时,拾色区域的背景颜色就会跟着变化,效果如图所示:

 

 

在色系区域再加上点击事件,点击时可以把吸管滑动到点击的位置,并修改拾色区域颜色,代码如下所示:

//色系元素绑定点击事件eSeries.addEventListener('click',function(event){ //获取点击位置 let nY = event.offsetY - nSideDragH/2; //增加过渡样式,使吸管有滑动效果 eSideDrag.style.transition = '.1s'; //删除过渡样式 setTimeout(e=>{ eSideDrag.style.transition = 'inherit'; },100) //改变色系吸管位置  eSideDrag.style.top = nY + 'px'; //修改拾色区背景颜色 let n = nY + nSideDragH / 2; color = {r:aColorSeries.r[n],g:aColorSeries.g[n],b:aColorSeries.b[n]}; eMainCon.style.background = `rgb(${color.r},${color.g},${color.b})`;});

 

同样的,拾色区域也需要把颜色存储起来。因为每次选择色系时,拾色区域颜色都会修改,所以用一个函数实现此功能,代码如下所示:

//拾色区域颜色var aColorMainStore = [];//获取拾色区域的宽度和高度var nMainW = eMainCon.offsetWidth;var nMainH = eMainCon.offsetHeight;function fnColorSet(color){ //重置拾色区域颜色数据 aColorMainStore = []; //左侧可变颜色,默认为白色 var oLeftColor = {r:255,g:255,b:255}; //右侧可变颜色,因为color参数是字符串,所以要转换为数组 var oRightColor = JSON.parse(JSON.stringify(color)); //底部颜色固定黑色 var oBottomColor = {r:0,g:0,b:0}; //因为色块可变颜色从左上角开始,所以默认设置为白色 var oMainColor = {r:255,g:255,b:255}; //Y轴步长值 var oYStep = { lStep: Math.floor(256 / nMainH), //左侧从上至下是从白色渐变到黑色,所以固定步长值计算 lRemainder: 256 / nMainH - Math.floor(256 / nMainH), //左侧步长剩余值 lAdd:0, //渐变过程添加值 } //枚举添加右侧从下至下渐变步长值、剩余值及添加值 for(let k in oRightColor){ oYStep[k+'Step'] = Math.floor((oRightColor[k]-oBottomColor[k]+1) / nMainH); oYStep[k+'Remainder'] = (oRightColor[k]-oBottomColor[k]+1) / nMainH - Math.floor((oRightColor[k]-oBottomColor[k]+1) / nMainH); oYStep[k+'Add'] = 0; } //循环每一行色块 for(let i=0;i<nMainH;i++){ //因为每一列的颜色都是往下加深渐变,所以除第一行之外每行循环都需要修改左侧和右侧颜色 if(i>0){  oYStep.lAdd += oYStep.lRemainder;  for(let k in oLeftColor){  //修改左侧颜色  if(oYStep.lAdd>1){   oLeftColor[k] = oLeftColor[k] - (oYStep.lStep + 1);  }else{   oLeftColor[k] = oLeftColor[k] - oYStep.lStep;  }  //修改右侧颜色  oYStep[k+'Add'] += oYStep[k+'Remainder'];  if(oYStep[k+'Add']>1){   oRightColor[k] = oRightColor[k] - (oYStep[k+'Step'] + 1);   //修改添加值   oYStep[k+'Add'] = oYStep[k+'Add'] - 1;  }else{   oRightColor[k] = oRightColor[k] - oYStep[k+'Step'];  }  }  //修改添加值  if(oYStep.lAdd>1){  oYStep.lAdd = oYStep.lAdd - 1;  } }  //每一行的色块颜色单独存到一个新的数组中 aColorMainStore.push([]); //每一次循环色块都要重置为左侧颜色 oMainColor = JSON.parse(JSON.stringify(oLeftColor)); //x轴步长值 let oXStep = {} for(let k in oLeftColor){  oXStep[k+'Step'] = Math.floor((oLeftColor[k]-oRightColor[k]) / nMainW);  oXStep[k+'Remainder'] = (oLeftColor[k]-oRightColor[k]) / nMainW - Math.floor((oLeftColor[k]-oRightColor[k]) / nMainW);  oXStep[k+'Add'] = 0; }  //在每一行中循环每一列色块 for(let j=0;j<nMainW;j++){  if(j!=0&&j!=nMainW-1){ //第一个色块颜色和最后一个颜色不需要修改  //从左至右渐变颜色  for(let k in oMainColor){   //逐步修改颜色   oXStep[k+'Add'] += oXStep[k+'Remainder'];   if(oXStep[k+'Add']>1){   oMainColor[k] = oMainColor[k] - (oXStep[k+'Step'] + 1);   oXStep[k+'Add'] = oXStep[k+'Add'] - 1;   }else{   oMainColor[k] = oMainColor[k] - oXStep[k+'Step'];   }  }  }  if(j==nMainW-1){  //最后的颜色设置为右侧颜色值  oMainColor = JSON.parse(JSON.stringify(oRightColor));  }   //存储色块颜色  aColorMainStore[i].push(JSON.stringify(oMainColor)); } }}//默认颜色为红色背景fnColorSet({r:255,g:0,b:0});

再给拾色区域的吸管加上拖拽功能,拾色区域加上点击事件,并修改显示区域的颜色及 rgb 的值,代码如下所示:

//获取显示颜色块var eColorFull = document.getElementById('colorFull');var eColorText = document.getElementById('colorText');var aColorInput = eColorText.getElementsByTagName('input');function fnColorFull(color){ //颜色参数是字符串,需要转换为数组 var color = JSON.parse(color); // 修改显示颜色 eColorFull.style.background = 'rgb('+color.join(',')+')'; //修改RGB颜色值 for(let i=0;i<aColorInput.length;i++){ aColorInput[i].value = color[i]; }}//默认显示白色fnColorFull('[255,255,255]');//获取吸管元素var eMainDrag = document.getElementById('mainDrag');//aMainColorStore数组中颜色行下标var nSX = 0;//aMainColorStore数组中颜色列下标var nSY = 0;//获取吸管高度var nMainDragH = eMainDrag.offsetHeight;//获取吸管限制宽度var nMainLimitW = nMainW - nMainDragH / 2;//获取吸管限制高度var nMainLimitH = nMainH - nMainDragH / 2;eMainDrag.addEventListener('mousedown',function(event){ //初始化鼠标开始拖拽的点击位置 var nInitX = event.clientX; var nInitY = event.clientY; //初始化吸管位置 var nInitTop = this.offsetTop; var nInitLeft = this.offsetLeft; //选中吸管后,在document上绑定鼠标移动事件 document.onmousemove = event=>{ //鼠标移动时取消默认行为,避免选中其他元素或文字 event.preventDefault(); //获取鼠标位置 let nX = event.clientX - nInitX + nInitLeft; let nY = event.clientY - nInitY + nInitTop; //以下的条件用于限制吸管不能移出拾色区域 if(nY >= nMainLimitH-1){  nY = nMainLimitH-1; } if(nY <= -nMainDragH/2){  nY = -nMainDragH/2; } if(nX <= -nMainDragH/2){  nX = -nMainDragH/2; } if(nX>=nMainLimitW-1){  nX = nMainLimitW-1; } //因为用的是箭头函数,所以this还是指向吸管,修改吸管位置 this.style.top = nY + 'px'; this.style.left = nX + 'px'; //颜色赋值,因为没办法选到最后一个颜色,所以加这个公式,这样中间有些颜色选不到 nSX = nX + nMainDragH/2; nSY = nY + nMainDragH/2; //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); } //松开鼠标后释放document上的事件 document.onmouseup = event=>{ document.onmouseup = null; document.onmousemove = null; } });//拾色区域绑定点击事件eMainCon.addEventListener('click',function(event){ //获取点击位置 let nX = event.offsetX - nMainDragH/2 let nY = event.offsetY - nMainDragH/2; //增加过渡样式,使吸管有滑动效果 eMainDrag.style.transition = '.1s'; //删除过渡样式 setTimeout(e=>{ eMainDrag.style.transition = 'inherit'; },100) //改变拾色吸管位置  eMainDrag.style.top = nY + 'px'; eMainDrag.style.left = nX + 'px'; //颜色赋值,因为没办法选到最后一个颜色,所以加这个公式,这样中间有些颜色选不到 nSX = nX + nMainDragH/2; nSY = nY + nMainDragH/2; //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); });

此时已经可以拖动拾色区域吸管并选择颜色。但此时还没有完全开发完成,因为之前在修改色系的事件中,只是修改了拾色区域的背景,并没有存储拾色区域的颜色,所以需要在色系元素的事件中添加如下代码:

//在色系吸管上绑定鼠标按下事件eSideDrag.addEventListener('mousedown',function(event){ /*...*/ //鼠标释放事件 document.onmouseup = event=>{ document.onmouseup = null; document.onmousemove = null; //设置拾色区颜色 color&&fnColorSet(color); //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); }});//色系元素绑定点击事件eSeries.addEventListener('click',function(event){ //*...*/ //删除过渡样式 setTimeout(e=>{ eSideDrag.style.transition = 'inherit'; //设置拾色区颜色 color&&fnColorSet(color); //获取当前位置颜色 let oColor = JSON.parse(aColorMainStore[nSY][nSX]); //填充显示颜色区域 fnColorFull(JSON.stringify([oColor.r,oColor.g,oColor.b])); },100) /*...*/});

 

一个流畅的web拾色器就完成了,我在代码中都尽可能加上了详细的注释,可以帮助更清晰的理解功能实现逻辑。









原文转载:http://www.shaoqun.com/a/619650.html

跨境电商:https://www.ikjzd.com/

贝贝母婴网:https://www.ikjzd.com/w/1321

欧麦:https://www.ikjzd.com/w/2085


本实例中的web拾色器功能使用css3实现页面效果,即在页面上显示的元素用css3样式来实现的。再使用js生成拾色器颜色数据,并控制各元素的鼠标事件。当事件作为反应时,获取到对应的数据并显示颜色值。拾色器的html元素分为三个部分,分别是拾色区域、色系区域和颜色显示区域,如图所示:web拾色器三个部分的html元素如下:<divclass="color_container"
拍怕:https://www.ikjzd.com/w/2205
败欧洲运费:https://www.ikjzd.com/w/1555
五洲会海购:https://www.ikjzd.com/w/1068
中暑|中暑新闻资讯及中暑报道:http://tech.shaoqun.com/m/s/%E4%B8%AD%E6%9A%91.aspx
亚马逊应用商店:https://www.ikjzd.com/w/531
Review突然消失?后review时代还能怎么玩?:https://www.ikjzd.com/home/6406

英国也需要注册WEEE?英国WEEE有几类?

英国也需要注册WEEE?英国WEEE有几类?

大部分卖家都知道, 欧盟有WEEE指令, 但是一般都是德国才需要注册WEEE, 那么英国需要吗?答案是需要,有部分卖家也因为没有注册英国WEEE导致产品被移除, 而且英国WEEE分为十大类,今天给大家介绍一下英国WEEE。

WEEE在英国什么时候生效?

废弃电子电气设备(WEEE)法规(2013)于2014年1月1日在英国成为法律,并取代了2006年WEEE法规

这些法规是指政府对欧盟指令2012/19 / EU的解释。该指令的目的是为整个欧洲的废弃电子电气设备的收集,回收和再循环设定目标,并从垃圾填埋场转移大量废弃电子设备。立法规定,当生产者销售到市场产生垃圾废物时,他们有责任对他们的物品负责。

英国法规要求企业:

尽量减少其电气和电子设备(EEE)产品产生的浪费并促进其重复使用

确保正确处理废品并达到废料的回收和再循环目标

通过减少材料使用并增强可重复使用性和可回收性来设计产品

英国将保留当前的14种EEE类别,从2019年开始,尽管将不再使用14种类别之一来确定电气项目是否在范围之内,但仍必须将电气产品放置在14种EEE中。

英国WEEE义务范围

制造商:

在英国以自己的品牌生产和销售EEE

购买EEE,然后进行更改以重新命名产品并转售至英国市场。(如果制造商的品牌出现在设备上,那么它们就是制造商)

以商业方式向英国进口EEE

在英国境外建立,并通过远程销售(例如在线,邮购或电话)直接向英国市场提供EEE

在英国市场(包括远程销售)上提供EEE的分销商(包括零售商)。

生产者也可以是分销商,并且通常可以是同一行业。但是,进口产品的私人个人不负责遵守规定。

所有分销商必须:

免费收回WEEE

不论是在商店,在线还是通过邮购方式进行订购,免费从提供同类产品的客户那里免费接收WEEE

保留至少四年收回的所有WEEE的记录

向客户提供有关所提供服务的书面信息以及他们应如何处理WEEE的信息

EEE的销售面积大于400平方米的零售商还必须在零售地点或其附近免费接受小型WEEE(最长边小于25厘米)的私人家庭客户,而无需购买新的EEE。

WEEE包括大多数带有插头或需要电池的产品。法规中概述了十大WEEE类别,即:

大型家用电器,例如冰箱,炊具,微波炉,洗衣机和洗碗机

小型家用电器,例如吸尘器,熨斗,烤面包机和钟表

IT和电信设备-例如个人计算机,复印设备,电话和袖珍计算器

消费类设备,例如收音机,电视,高保真设备,便携式摄录机和广告乐器

照明设备,例如直型和紧凑型荧光灯管和高强度放电灯

电动和电子工具–例如电钻,锯子和缝纫机,电动割草机

玩具,休闲和运动器材,例如电动火车,游戏机和跑步机

医疗设备,例如(未感染的)透析机,分析仪,医疗冰柜和心脏病设备

监视和控制设备,例如 烟雾探测器,恒温器和加热调节器

自动饮水机,例如热饮机和自动提款机

WEEE的处理

大型家用电器(例如烤箱,冰箱,洗衣机)目前占WEEE的40%以上,但还有大量其他设备,例如IT设备(主要是计算机),电视(每年丢弃200万以上),小型家用电器(例如水壶和吹风机),电动工具,数字手表,电子玩具和医疗设备。

此类物品包含多种材料,例如,普通电视包含6%的金属和50%的玻璃,而炊具则为89%的金属和6%的玻璃。发现的其他材料包括塑料,陶瓷和贵金属。

由于产品类型和材料的这种复杂混合,其中一些是危险的(包括砷,镉,铅和汞以及某些阻燃剂),WEEE回收带来许多健康风险,需要进行适当管理。例如,暴露于加工过程中释放的物质(例如,荧光灯管,铅和五氯化磷由于阴极射线管破裂而释放的汞)。

WEEE的注册时间长吗?

英国的WEEE注册效率暂时还是比较高的,一周左右就完成了,其原因之一了能是因为注册人数还不多。


文章来源:https://www.ikjzd.com/home/143064

跨境电商:https://www.ikjzd.com/

立刻网:https://www.ikjzd.com/w/2323

丰趣海淘:https://www.ikjzd.com/w/1716

大森林:https://www.ikjzd.com/w/2268

英国也需要注册WEEE?英国WEEE有几类?

英国也需要注册WEEE?英国WEEE有几类?大部分卖家都知道,欧盟有WEEE指令,但是一般都是德国才需要注册WEEE,那么英国需要吗?答案是需要,有部分卖家也因为没有注册英国WEEE导致产品被移除,而且英国WEEE分为十大类,今天给大家介绍一下英国WEEE。WEEE在英国什么时候生效?废弃电子电气设备(WEEE)法规(2013)于2014年1月1日在英国成为法律,并取代了2006年WEEE法规这些

跨境电商Facebook引流技巧

在全球移动应用数据和分析平台App Annie公布的2019全球月活跃用户数前十名的App中,前三名和第五名App分别是:WhatsApp、Facebook、Facebook Messenger和ins。他们全部归属于Facebook公司。

巨大的活跃用户背后,蕴含着巨大的商机。尤其是对于跨境商家而言,利用好Facebook这个渠道,可以给网站来带客观的流量和订单。但做引流也不能盲目,否则Facebook分分钟封号给你看。这里给大家分享一些需要注意的小技巧。

1.切忌直接发广告

在一个广告线上线下满天飞的时代,许多Facebook用户看到一上来就直接发广告的主页,会直接进行屏蔽(相信我们大家也都感同身受),有的甚至会对你的产品发布负面的评论。

正确的方法是加入对话,成为社区的一部分,而不是一个商业"局外人"积极地试图出售,采用硬行推销的策略,好的营销推广是看不出你是在发广告,其实你的产品信息已被浏览的用户牢牢记住。

2.把握重点,杜绝废话

我们每天都在刷屏着各种社交工具,Twitter、YouTube、Instagram等不一而足,无形中我们已经阅读了大量的文字,甚至对繁琐的文字已经产生了视觉疲劳和抗体。

所以就不要在Facebook上废话连篇了,能用简单的一句话讲出重点甚至夹带些幽默风趣的文字更能吸引人们的目光。能让用户停在你的主页上是导入流量的第一步,也是最关键的一步。

3.慎重选择图片和视频

图片和视频是Facebook一个比较有吸引力的主要元素,经常带来互动与娱乐。

在Facebook的贴文形式中,有照片或影片的贴文比没照片的贴文互动多120%,如果你的照片是很优质的且突出的,获得赞、分享、留言的数量就会提高很多。

厚图薄文的的时代更讲究图片和视频的选择,要选择那些容易吸引人同时又与你的产品相关性高的的照片和影片,这样会大大增加你的点击转换率。

4.把互动串联起来

Facebook是个交流型社区,如果每天只是一味的在上边推送广告,而没有基本的交流互动,那么能获取的流量是十分有限的,也极大的浪费了Facebook的社区交流功能。

我们可以建立一个与自己产品和品牌相关的圈子,挖掘一批对自己话题感兴趣的人,或是说对这种产品感兴趣的人,然后把这批人串联起来,有了这一群有共同话题的人互动就很容易建立起来。这样我们每一次的产品推广或是做一些营销活动就会有一传十、十传百的效果。

5.店铺链接要简单准确

当客户看到你引人注目的文字或图片后,产生了点击进入你的店铺的兴趣,却因为多次点击都没能看到自己感兴趣的品牌或产品。试想一下,有多少人客户会有那么多的耐心去乐此不疲地寻找你的店铺,很多都会直接选择离开,流量也就无从谈起了。

最好的方式是一次进入,省去主页和二次广告,直接让客户看到他感兴趣的产品属性和价格信息,这就是最简单准确的链接方式。

6.优惠券广告

Facebook早在2012年推出了"Offer"的主页选项,品牌商家可通过该选项与Facebook受众分享一些折扣券,透过消费把优惠分享给好友,从而触及更多受众。

现如今Facebook的优惠券功能有了大升级,对于品牌和商家来说,这已经不仅是优惠实用的促销卖点,还是可以通过趣味性来吸引用户的营销手段。

以上就是今天分享的全部内容,希望对大家有所帮助!



(来源:2cshop官方)

文章来源:https://www.ikjzd.com/home/143044

跨境电商:https://www.ikjzd.com/

巴士物流:https://www.ikjzd.com/w/2329

trax:https://www.ikjzd.com/w/1489

大森林:https://www.ikjzd.com/w/2268

跨境电商Facebook引流技巧

在全球移动应用数据和分析平台AppAnnie公布的2019全球月活跃用户数前十名的App中,前三名和第五名App分别是:WhatsApp、Facebook、FacebookMessenger和ins。他们全部归属于Facebook公司。巨大的活跃用户背后,蕴含着巨大的商机。尤其是对于跨境商家而言,利用好Facebook这个渠道,可以给网站来带客观的流量和订单。但做引流也不能盲目,否则Faceboo

如何正确进行直播购物

将直播购物引入您的营销组合可以帮助吸引客户。

直播购物是向观众展示您的品牌及其使命的一种很好的方式,同时可以与他们进行真实的交流。它消除了预录制视频附带的多余装饰:经过仔细审查后,可以进行编辑,演练和发布。根据Livestream的说法,这也许就是为什么80%的用户更喜欢观看直播购物而不是阅读公司的博客文章的原因。

实况视频正在获得极大的普及已经不是什么秘密了。平均而言,观看者 在直播视频上花费的时间至少是点播时间的八倍。Facebook在一篇博客文章中分享说,人们观看视频的可能性是实况的三倍。对直播的需求无处不在。

为什么要使用直播购物?

这是与观众交流的一种即时,简便的方法。

它显示出真实性。

您可以营销您的产品和服务。

您会在亲密的个人环境中认识您的客户。问他们关于自己的问题。获得有关可以改进的反馈。

它增加了收入。根据Animoto的一项调查,有76.5%的营销商表示视频对他们的业务具有直接且积极的ROI。

显然,实况视频有其好处。如果您不熟悉直播购物营销,请按照以下三个提示开始操作,以便您的业务得以扩展。

1.概述您的直播。

直播视频时,不会出现令人尴尬的错误,长时间的尴尬沉默或喃喃自语的空间。如果发生意外或故障,您的听众会看到。如果问题仍然存在,它们将迅速退出并继续进行下一步。这就是为什么提前计划如此重要的原因。

问问自己,您的企业将通过直播获得多少收益。会增加观众的参与度吗?是否鼓励他们购买您的产品和服务?是否向正确的观众展示?它如何展示您的品牌及其使命?

重要的是,在开始之前,概述实况视频的一般信息,以尽可能减少事故的发生。

谁会出现在直播中?

主题是什么?

为什么创建此直播?

什么时候播放?

2.要真实。

人们对直播购物更加感兴趣的一个重要原因是,它以其他渠道和媒体无法提供的方式展现出真实性。通过文字发布,您无法以相同的方式感受到情感。您无法通过播客阅读面部表情。只有实时流传输,观众才能以完全实时的方式观看和听到事物,而没有任何褶边或褶皱。

根据2017年消费者内容报告,有86%的消费者在决定支持哪些品牌时认为真实性很重要。根据同一份报告得出的结论,只有不到一半的品牌创建对消费者有意义的内容,因此对于现场视频而言,将真正的东西带到餐桌上是至关重要的。

通过直播购物,您的品牌可以通过多种方式对观众更具真实感:

幕后花絮

产品展示

团队成员的介绍

现场直播

问答环节

赠品 

所有这些都是观看者不仅观看公司情况的方法,而且还可以直接与之交互并感觉像是体验的一部分。 

3.使用正确的工具。

在Livestream关于直播视频的报告中,有67%的观众认为视频质量是观看直播时最重要的因素。较长的缓冲时间,无法正确加载以及听觉和视觉故障等事情一定会让观众感到沮丧,并鼓励他们从您的直播中反弹。您可以通过使用合适的工具来防止这些事情的发生。

对于初学者,您想在光线充足的地方录制。在相机内部和外部的不同区域进行测试,以了解能给您带来最佳观看体验的地方。您可能会使用手机进行录制,因此不必觉得出门购买昂贵的相机来进行直播就可以了。您需要全速运行Wi-Fi,以确保没有滞后或较长的加载时间。如果不是,请利用热点和数据来代替您的直播。 

终于要开始直播了,请确保您位于没有背景噪音或其他干扰的安静区域。确保您的外观和声音足够清晰,以使观众了解正在发生的事情,从而使体验尽可能流畅。

接下来是什么

直播购物营销策略不必太吓人。如果有的话,它应该会激发您的兴趣,因为它可以为您的业务带来潜在的利益。这是与消费者保持联系,更好地了解他们,让他们了解您并吸引他们的一种好方法。向他们表明您是真实的并关心他们想要什么。给他们提供实时直播体验,证明您的企业希望解决他们的问题并在他们的买家旅程中提供帮助。很快,您的客户群就会增长,您的业务也会随之发展。


文章来源:https://www.ikjzd.com/home/143045

跨境电商:https://www.ikjzd.com/

亚马逊 海外购:https://www.ikjzd.com/w/998

prezi:https://www.ikjzd.com/w/1751

打折网站:https://www.ikjzd.com/w/74

如何正确进行直播购物

将直播购物引入您的营销组合可以帮助吸引客户。直播购物是向观众展示您的品牌及其使命的一种很好的方式,同时可以与他们进行真实的交流。它消除了预录制视频附带的多余装饰:经过仔细审查后,可以进行编辑,演练和发布。根据Livestream的说法,这也许就是为什么80%的用户更喜欢观看直播购物而不是阅读公司的博客文章的原因。实况视频正在获得极大的普及已经不是什么秘密了。平均而言,观看者在直播视频上花费的时间至