.<a href='[field:arcurl /]'><img src='[field:litpic/]' border='0' width='' height=''></a>
2.[field:imglink /]
3.<a href='[field:arcurl /]'> [field:image/]</a>
说明:
[field:imglink /]与<a href='[field:arcurl /]'>[field:image/]</a> 是完全等价的,只不过后者更灵活一点,可以在 <a>中添加 title=""
即
<a href='[field:arcurl /]' title="[field:title function='htmlspecialchars(@me)'/] ">[field:image/]</a>
以下代码则更为灵活,不仅可以添加title="",还可以添加 alt="",但是虽然灵活了,缺少了图片的宽度和高度的控制,所以要在CSS中控制图片的大小,适合对CSS有一点了解的人。
<a href='[field:arcurl /]' title="[field:title function='htmlspecialchars(@me)'/] "><img src='[field:litpic/]' border='0' width='' height='' alt="[field:title function='htmlspecialchars(@me)'/] "></a>
在文章内容页加入图片标签:<img src="{dede:field name="litpic"/}" border="0">
在系统还原后,重新更新栏目或文件的时候,会出现一些错误提示:没有该栏目数据可能缓存文件。
基本做法:
1.把inc_catalog_base.inc缓存文件删掉;
2.更新系统缓存,点“生成—>更新系统缓存—>开始执行”;
3.然后重新生成栏目,
如果以上解决不了。
尝试一般性的解决方案:
在网站后台,点击左侧“核心”—“网站栏目管理”;
登录ftp,找到data/cache目录,删掉inc_catalog_base.inc文件
打开dede目录,找到config.php文件打开,查找
$fp1Header = "<{$phph}php\r\nglobal$_Cs;\r\n$_Cs=array();\r\n";修改为:
$fp1Header = "<{$phph}php\r\nglobal$cfg_Cs;\r\n$cfg_Cs=array();\r\n";
fwrite($fp1,"$_Cs[{$row->id}]=array({$row->reid},{$row->channeltype},{$row->issend});\r\n");修改为:
fwrite($fp1,"$cfg_Cs[{$row->id}]=array({$row->reid},{$row->channeltype},{$row->issend});\r\n");
4.最后更新系统缓存,一键生成HTML文件。
丽炫酷的动画特效总能够让人心旷神怡,不能自已。艳羡之余,如果还能够探究其华丽外表下的实现逻辑,那就是百尺竿头,更上一步了。本次我们使用图片、SCSS样式以及SVG图片动画来实现“点赞”按钮的动画特效,并比较不同之处。
最简单,也最容易理解的实现方式就是使用图片。曾几何时,几乎所有前端特效都需要借助图片来完成。
实现原理很简单,通过不同的关键帧来“拼接”一段完整的动画影片,每一帧即该动画的每一个瞬间“状态”。
首先声明必要的盒子模型:
<div class="heart"></div>这里以div为例子,声明伪类对象heart。
随后通过样式对heart伪类进行控制:
.heart {
cursor: pointer;
height: 50px;
width: 50px;
background-image:url( 'https://abs.twimg.com/a/1446542199/img/t1/web_heart_animation.png');
background-position: left;
background-repeat:no-repeat;
background-size:2900%;
}
.heart:hover {
background-position:right;
}
.is_animating {
animation: heart-burst .8s steps(28) 1;
}
@keyframes heart-burst {
from {background-position:left;}
to { background-position:right;}
}这里指定背景图片位置,只显示最左侧的背景元素,鼠标悬停时则只显示最右侧背景元素,然后当鼠标点击div时,触发@keyframes heart-burst动画,从左侧移动至右侧,一共进行28帧的侧移动作:
这样就完成了一段流畅的动画特效:
需要注意的是,这里需要借助JavaScript绑定单击事件,所以需要引入zepto.min.js文件
https://cdnjs.cloudflare.com/ajax/libs/zepto/1.2.0/zepto.min.js通过zepto.min.js库就可以很方便的操作页面节点:
$(".heart").on('click touchstart', function(){
$(this).toggleClass('is_animating');
});
$(".heart").on('animationend', function(){
$(this).toggleClass('is_animating');
});逻辑是单击事件触发动画,动画执行过程中再次点击则移除动画效果。
此种方式依赖多帧背景图、CSS动画以及JavaScript事件绑定,显然成本有些高,同时多帧图片平铺导致体积过大,也会占用系统带宽,得不偿失。
使用纯CSS样式也可以完成这样的特效,但CSS3原生语法太过复杂,这里我们使用SCSS语法,SCSS是 CSS3的超集,在保证兼容性的前提下,允许使用变量、 嵌套、 混合、导入等特性, 在编写逻辑复杂的CSS代码时,可以简化逻辑,提高CSS的代码可读性。
首先还是创建基本盒子模型:
<input id="toggle-heart" type="checkbox"/>
<label for="toggle-heart">❤</label>这里通过复选框和标签元素来控制点赞按钮的状态。
随后编写SCSS逻辑:
$bubble-d: 4.5rem; // bubble diameter
$bubble-r: .5*$bubble-d; // bubble-radius
@mixin bubble($ext) {
transform: scale(1);
border-color: #cc8ef5;
border-width: $ext;
}
body {
display: flex;
justify-content: center;
margin: 0;
height: 100vh;
}
[id='toggle-heart'] {
position: absolute;
left: -100vw;
&:checked + label {
color: #e2264d;
will-change: font-size;
animation: heart 1s cubic-bezier(.17, .89, .32, 1.49);
&:before, &:after {
animation: inherit;
animation-timing-function: cubic-bezier(.21, .61, .35, 1);
}
&:before {
will-change: transform, border-width, border-color;
animation-name: bubble;
}
}
}
[for='toggle-heart'] {
align-self: center;
position: relative;
color: #aab8c2;
font-size: 2em;
cursor: pointer;
&:before, &:after {
position: absolute;
z-index: -1;
top: 50%; left: 50%;
border-radius: 50%;
content: '';
}
&:before {
box-sizing: border-box;
margin: -$bubble-r;
border: solid $bubble-r #e2264d;
width: $bubble-d; height: $bubble-d;
transform: scale(0);
}
}
@keyframes heart {
0%, 17.5% { font-size: 0; }
}
@keyframes bubble {
15% { @include bubble($bubble-r); }
30%, 100% { @include bubble(0); }
}这里首先将复选框按钮移出界面,随后定义bubble对象,这里bubble指的是点击后膨胀的紫色(#cc8ef5)泡泡,直径是4.5rem,并且圆角修饰:$bubble-r: .5*$bubble-d
随后通过id选择器toggle-heart状态判断元素状态,触发heart和bubble动画,在一秒内动态的改变heart元素以及bubble元素的位置、大小以及边框透明度,从而完成动态特效。
接着添加烟花特效:
body {
display: flex;
justify-content: center;
margin: 0;
height: 100vh;
background: linear-gradient(135deg, #121721, #000);
font: 1em verdana, sans-serif;
}
[id='toggle-heart'] {
position: absolute;
left: -100vw;
}
[id='toggle-heart']:checked + label {
color: #e2264d;
filter: none;
will-change: font-size;
-webkit-animation: heart 1s cubic-bezier(0.17, 0.89, 0.32, 1.49);
animation: heart 1s cubic-bezier(0.17, 0.89, 0.32, 1.49);
}
[id='toggle-heart']:checked + label:before, [id='toggle-heart']:checked + label:after {
-webkit-animation: inherit;
animation: inherit;
-webkit-animation-timing-function: ease-out;
animation-timing-function: ease-out;
}
[id='toggle-heart']:checked + label:before {
will-change: transform, border-width, border-color;
-webkit-animation-name: bubble;
animation-name: bubble;
}
[id='toggle-heart']:checked + label:after {
will-change: opacity, box-shadow;
-webkit-animation-name: sparkles;
animation-name: sparkles;
}
[id='toggle-heart']:focus + label {
text-shadow: 0 0 3px white, 0 1px 1px white, 0 -1px 1px white, 1px 0 1px white, -1px 0 1px white;
}
[for='toggle-heart'] {
align-self: center;
position: relative;
color: #888;
font-size: 2em;
filter: grayscale(1);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
cursor: pointer;
}
[for='toggle-heart']:before, [for='toggle-heart']:after {
position: absolute;
z-index: -1;
top: 50%;
left: 50%;
border-radius: 50%;
content: '';
}
[for='toggle-heart']:before {
box-sizing: border-box;
margin: -2.25rem;
border: solid 2.25rem #e2264d;
width: 4.5rem;
height: 4.5rem;
transform: scale(0);
}
[for='toggle-heart']:after {
margin: -0.1875rem;
width: 0.375rem;
height: 0.375rem;
box-shadow: 0.32476rem -3rem 0 -0.1875rem #ff8080, -0.32476rem -2.625rem 0 -0.1875rem #ffed80, 2.54798rem -1.61656rem 0 -0.1875rem #ffed80, 1.84982rem -1.89057rem 0 -0.1875rem #a4ff80, 2.85252rem 0.98418rem 0 -0.1875rem #a4ff80, 2.63145rem 0.2675rem 0 -0.1875rem #80ffc8, 1.00905rem 2.84381rem 0 -0.1875rem #80ffc8, 1.43154rem 2.22414rem 0 -0.1875rem #80c8ff, -1.59425rem 2.562rem 0 -0.1875rem #80c8ff, -0.84635rem 2.50595rem 0 -0.1875rem #a480ff, -2.99705rem 0.35095rem 0 -0.1875rem #a480ff, -2.48692rem 0.90073rem 0 -0.1875rem #ff80ed, -2.14301rem -2.12438rem 0 -0.1875rem #ff80ed, -2.25479rem -1.38275rem 0 -0.1875rem #ff8080;
}
@-webkit-keyframes heart {
0%, 17.5% {
font-size: 0;
}
}
@keyframes heart {
0%, 17.5% {
font-size: 0;
}
}
@-webkit-keyframes bubble {
15% {
transform: scale(1);
border-color: #cc8ef5;
border-width: 2.25rem;
}
30%, 100% {
transform: scale(1);
border-color: #cc8ef5;
border-width: 0;
}
}
@keyframes bubble {
15% {
transform: scale(1);
border-color: #cc8ef5;
border-width: 2.25rem;
}
30%, 100% {
transform: scale(1);
border-color: #cc8ef5;
border-width: 0;
}
}
@-webkit-keyframes sparkles {
0%, 20% {
opacity: 0;
}
25% {
opacity: 1;
box-shadow: 0.32476rem -2.4375rem 0 0rem #ff8080, -0.32476rem -2.0625rem 0 0rem #ffed80, 2.1082rem -1.26585rem 0 0rem #ffed80, 1.41004rem -1.53985rem 0 0rem #a4ff80, 2.30412rem 0.85901rem 0 0rem #a4ff80, 2.08305rem 0.14233rem 0 0rem #80ffc8, 0.76499rem 2.33702rem 0 0rem #80ffc8, 1.18748rem 1.71734rem 0 0rem #80c8ff, -1.35019rem 2.0552rem 0 0rem #80c8ff, -0.60229rem 1.99916rem 0 0rem #a480ff, -2.44865rem 0.22578rem 0 0rem #a480ff, -1.93852rem 0.77557rem 0 0rem #ff80ed, -1.70323rem -1.77366rem 0 0rem #ff80ed, -1.81501rem -1.03204rem 0 0rem #ff8080;
}
}
@keyframes sparkles {
0%, 20% {
opacity: 0;
}
25% {
opacity: 1;
box-shadow: 0.32476rem -2.4375rem 0 0rem #ff8080, -0.32476rem -2.0625rem 0 0rem #ffed80, 2.1082rem -1.26585rem 0 0rem #ffed80, 1.41004rem -1.53985rem 0 0rem #a4ff80, 2.30412rem 0.85901rem 0 0rem #a4ff80, 2.08305rem 0.14233rem 0 0rem #80ffc8, 0.76499rem 2.33702rem 0 0rem #80ffc8, 1.18748rem 1.71734rem 0 0rem #80c8ff, -1.35019rem 2.0552rem 0 0rem #80c8ff, -0.60229rem 1.99916rem 0 0rem #a480ff, -2.44865rem 0.22578rem 0 0rem #a480ff, -1.93852rem 0.77557rem 0 0rem #ff80ed, -1.70323rem -1.77366rem 0 0rem #ff80ed, -1.81501rem -1.03204rem 0 0rem #ff8080;
}
}新增sparkles对象,通过动态的控制元素的彩色阴影来表现点击后的烟花动态效果:
这里为了增加效果对比度,将背景设置为深色,同时为点赞按钮增加亮色边框:
[id='toggle-heart']:focus + label {
text-shadow:
0 0 3px #fff,
0 1px 1px #fff, 0 -1px 1px #fff,
1px 0 1px #fff, -1px 0 1px #fff;
}大体上,利用transform属性控制元素的绝对定位、颜色、边框以及盒子模型阴影来完成此种特效,带宽资源占用层面,明显比图片更具优势。
SVG是矢量图形,不受像素的影响,从而使得它在不同的平台或者媒体下表现出的兼容性更好,与此同时,SVG对动画的支持较好,其DOM结构可以被其特定语法或者CSS控制,从而轻松的实现动画效果。
首先依然声明盒子模型:
<label class="like">
<input type="checkbox"/>
<div class="hearth"/>
</label>随后定义样式:
:root {
--size: 100px;
--frames: 62;
}
html {
background-color: #15202B;
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
user-select: none;
}
input {
display: none;
}
.like {
display: block;
width: var(--size);
height: var(--size);
cursor: pointer;
border-radius: 999px;
overflow: visible;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-tap-highlight-color: transparent;
}
.hearth {
background-image: url('https://assets.codepen.io/23500/Hashflag-AppleEvent.svg');
background-size: calc(var(--size) * var(--frames)) var(--size);
background-repeat: no-repeat;
background-position-x: calc(var(--size) * (var(--frames) * -1 + 2));
background-position-y: calc(var(--size) * 0.02);
width: var(--size);
height: var(--size);
}
input:checked + .hearth {
animation: like 1s steps(calc(var(--frames) - 3));
animation-fill-mode: forwards;
}
@keyframes like {
0% {
background-position-x: 0;
}
100% {
background-position-x: calc(var(--size) * (var(--frames) * -1 + 3));
}
}
@media (hover: hover) {
.like:hover {
background-color: #E1255E15;
.hearth {
background-position-x: calc(var(--size) * (var(--frames) * -1 + 1));
}
}
}和普通图片如出一辙,通过background-image来控制背景SVG图片的顺序,对背景的横坐标进行侧移动画操作,只不过帧数提高到62帧:
可以看到这里通过input:checked状态就可以触发@keyframes like横移动画,并不需要单独撰写JavaScript逻辑。
三种动画特效实现方式各有千秋,但从可维护性以及成本控制角度上看,SCSS显然是最优解。
源:【人民日报中央厨房-商海观潮工作室】
珠江岸边,琶洲会展中心再次迎来八方宾客。第133届中国进出口商品交易会(广交会)全面恢复线下展,于4月15日起分3期举办至5月5日,同时全年常态化线上运营。
从家用电器、五金建材、化工产品等传统展品,到新增设的工业自动化及智能制造展区、新能源及智能网联汽车展区和智慧生活专区等,行走广交会场馆,目不暇接的精彩展品和持续火热的旺盛人气,彰显着中国经济的活力和韧性。
这是历史上规模最大的一届广交会。本届广交会启用新展馆,第一期展览面积由原来的40万平方米增加到50万平方米。4月19日,本届广交会一期闭幕,截至19日下午6时,进馆126.1万人次。展览面积和进馆人次均创历史新高。同时,常态化运营线上平台,线上参会境外采购商31.1万人。
广交会琶洲会展中心里人流涌动。(新华社记者 刘大伟 摄)
这是洽谈火热、下单积极的一届广交会。本届广交会一期到会境外采购商6.6万人,出口成交128亿美元。不少参展企业表示,尽管境外采购商还在恢复之中,但到会采购商采购意愿强、下单更快。从订单数量看,3个月以上的中长单占比接近六成。除现场下单外,很多客商还向参展企业预约实地看厂,未来有望达成更多合作。
几名来自哥伦比亚的采购商在广交会上了解中国汽配产品。(新华社记者 刘大伟 摄)
这是新题材新展品众多的一届广交会。本届广交会一期新设工业自动化及智能制造、新能源及智能网联汽车、智慧生活等题材,共吸引762家企业参展。举办新品首发首展首秀活动150场,涉及工业制造、电子家电、建材家装等行业,线上线下吸引3万人次观看。第一期线上展品78.4万件,其中新产品接近15.1万件、绿色低碳产品14.3万件、智能产品9.6万件、自主知识产权产品9.5万件。
采购商在广交会新设置的新能源及智能网联汽车展区了解中国新能源汽车产品。(新华社记者 刘大伟 摄)
这是绿色发展引领潮流的一届广交会。电动汽车、光伏、动力电池等“新三样”产品集中亮相,吸引了大批采购商询价洽谈。展出零碳源空调、光伏储能设备等低碳环保展品约50万件。
“发展经济最重要的是人来人往。规模盛大的广交会呈现供需两旺的态势,一方面展示了中国经济复苏的强劲势头,另一方面也印证了世界各国对于中国经济发展的坚定信心。”辽宁大学校长余淼杰表示。
广交会现场的火热氛围也让不少外贸企业感到振奋。在新宝股份总裁曾展晖看来,众多海外客商来往交流,正是海外市场逐步恢复的一个表现,他对今年的外贸行业发展充满期待和信心。“欧美市场的需求逐步在恢复,同时我们拓展了很多新品类,做了很多布局,从未来的国际市场来看,今年到明年的市场增长预期很大。”
今年一季度,我国货物贸易进出口总值9.89万亿元,同比增长4.8%,也让曾展晖感慨,“看到了一个复苏的曙光”。
在这场万商云集盛会里,无数外贸人步履坚定再出发。
(人民日报中央厨房—商海观潮工作室)
本文来自【人民日报中央厨房-商海观潮工作室】,仅代表作者观点。全国党媒信息公共平台提供信息发布传播服务。
ID:jrtt
*请认真填写需求信息,我们会在24小时内与您取得联系。