个网站要在各大搜索引擎中位于前面的位置,需要对其SEO进行优化,搜索不同关键词下的搜索排名,从而获客。本文以图库网站为例,谈谈优化思路,希望对你有所启发。
我司主营素材版权代理销售业务,包括图片、视频、音乐、字体,主要面向大B端客户。现为提高销售数据,需要从多方面入手完成网站产品优化,整体方向是“开源节流”,即增加访问网站的用户量,同时提高关键路径上各个重要环节的转化率从而提高整体指标的数据表现。
通过对历史多年数据分析,60%用户访问设备为PC端Windows系统,18%来自于安卓,13%来自于Mac OS。并对来源渠道进行分析,2022年全年数据43%用户来源于SEO(自然搜索流量),29%来源于直接访问域名,24%来自于SEM投放。
综上,想要进行开源,重点是从SEO、SEM着手(直接访问域名多为老客户,指直接在浏览器输入域名后访问网站)。而SEM投放的广告费用每年水涨船高,主要方向为投放策略的优化,在我其他文章中会有描述,这里不赘述。那么SEO是本文主要讨论的流量获取方式。
本文主要讲我们是如何在1年的时间内容,通过针对网站的SEO优化,提高网站在搜索引擎各关键词下的搜索排名从而获得流量、商机数量提升的,作为一种免费的流量获取方式,需要的同学感兴趣可以参考。
目标:
SEO的目标是提高网站在各大搜索引擎中,搜索不同关键词下的搜索排名,从而获客。
SEO本质上是优化网站结构、体验,让网站页面被搜索引擎爬虫更好的爬取、收录,同时借助搜索引擎的投票评分机制、用户体验检测机制获得一个很好的网站搜索引擎评分,从而在用户搜索某些关键词时自己的网站能够得到搜索引擎提供的不错排序位置,提高曝光量从而实现获客。
搜索引擎工作原理其实很简单,各大搜索引擎公司会定期/不定期的派出多个爬虫爬取互联网上的所有网站页面,对于符合标准,有收录价值的页面会进行收录(一般除明显作弊网站、违法违规网站以外都会有所收录)。并对收录的页面进行评分,在用户通过搜索引擎搜索相关内容时,搜索引擎根据命中的关键词返回相关页面给用户,返回结果的排序(不考虑投放SEM广告情况下)主要取决于被召回结果与用户搜索内容的关联度、被召回结果各自的评分权重。
做SEO最重要的一点莫过于关键词的优化,搜索引擎会根据页面中各关键词出现的频次、位置、重要程度给予评分,这个关键词将会用于与搜索引擎用户的搜索需求匹配。因此如何让你希望用户搜到的关键词正确、合适的出现在页面中,帮助页面在对应关键词下获得不错排名,是个非常重要的SEO工作。
首先堆词,要确保关键词与页面内容是匹配的,不能出现风马牛不相及的情况。
其次,页面中关键词是有重要层级的,例如从上至下,上方权重更高。H1(标题)标签内的内容权重比p(段落)标签内的高。
页面中核心关键词最好合理的多出现几次,注意,需要合理。因为搜索引擎经过多年的发展,是有一套反作弊的算法机制的,当发现页面中有恶意堆词的情况,可能会降低页面评分、不收录,甚至Ban掉整个域名。
以我们做图库网站为例,我们希望图片详情页被收录,同时我们希望用户在百度搜索“图片”时我们的页面有不错的排名。那么我们的标题可以从原来的“一个女人”,经过代码逻辑拼装成“一个女人的图片”。而下方关键词,可以从人、女人、人类,扩展为:人图片、女人图片、人类图片。这样一方面保证关键词、标题和页面内容是匹配的,另一方面提高了图片这一主题在页面出现的频次,从而搜索引擎会判定这个页面是主要讲“图片”的。在搜索引擎的用户搜索“图片”时,可能我们的页面会有不错的权重。
元标签优化,又称为TDK优化。做过前端开发的同学可能比较清楚,或者你打开浏览器,点击F12或者开发者工具可以看到。我们所看到的网页是一堆HTML代码渲染得来的。HTML代码是用来描述页面的,正如一篇文章,HTML中也有Title(标题)、Description(描述)、Keyword(关键词)三个关键的页面描述。
TDK必须要简洁、精准的描述当前页面的主要内容,搜索引擎在收录页面时,会给到TDK中出现的内容极高的权重,就像你读一篇文章,往往是从文章的标题入手,文章的标题通常是文章的核心内容。
例如,我们图片详情页的Title可能是“一个美丽模特的图片”,Description可能是“XXXX,正版图片购买”,而Keyword可能是“图片,素材,正版图片,模特,美丽”。
页面的地址,也就是URL也是搜索引擎收录的重要内容。我们需要尽可能的保证URL层级明晰、简介,如果可以,尽量包含页面的关键词。
例如我们的首页www.xxx.com,图片搜索页(搜索关键词城市时)是www.xxx.com/image-search/chengshi,而图片详情页是www.xxx.com/image/123513,是很明确的层级结构,可读性很强,并且包含了关键词或者图片ID。
搜索引擎给页面评分有一个很重要的机制,叫投票评分机制。比如A页面搜索引擎给到了很高的评分,而A页面中给到了超链接到B页面,那么搜索引擎会认为“A页面这么重要,都链到了B页面,那么B页面一定也很重要”。而A页面、C页面、D页面…都链到了B页面,搜索引擎给到B页面的评分则会更高。
这就是为什么,很多网站会在不同文章、页面、栏目之间给到便捷的超链接。
而导航,则是方便爬虫爬取使用的。爬虫爬取页面有深度优先和广度优先两种形式。一种是在页面发现一个页面就往下爬,然后找到下级页面再往下,爬到一定深度再回到最初页面。广度优先呢,则是把一个页面所有链接都访问了,再往下一层爬取。但是两种方式都有一个特点,就是需要页面之间有链接,作为蜘蛛爬行的路径。而网页的导航则是最适合干这个事的。
因此需要非常清晰的导航设置,比如图片首页、视频首页、音乐首页等等,都在网站的大首页有明确的导航。
并且由于所有网站的首页权重都是最高的,所以尽可能的把想要被搜索引擎爬到、收录到的页面挂到首页。
我们的实现方式是在大首页,会放很多精选专题的推荐,精选图片的链接,用户下载最多的图片的展示和链接,最新上传入库的图片的展示和链接。通过首页给他们投票,而这些子页面之间又互相有链接互相投票的方式,达到提高相关页面搜索引擎评分和权重的目的。
上文中所谓的投票逻辑,不仅是站内会有,站外到站内的外链也是一个重要的评分机制。例如A站搜索引擎权重更高,如果A站首页挂了B站的链接,会认为B站也是优质网站(是在这一维度上给到较高评分)。因此往往会有站长联盟,大家互相交换有价值的网站外链,互相投票从而提高SEO。
我们在实际SEO过程中没有进行这一项的优化,因为作为一个行业内头部的产品,在选择外链上会很谨慎,因此无法纯从SEO考虑出发去做友链交换。
搜索引擎召回网站结果之后,实际会有逻辑去监控每个网站的打开率、跳出率。例如百度提供了免费的百度统计功能,相当于0埋点的页面数据统计,网站站长只需要在HTML的头部引入百度统计的代码,则可以方便统计站内用户的访问数据,免费相应的交换,就是每个页面的跳出率对方也就知道了。
搜索引擎监控网页的打开率,是指用户搜索关键词召回10个结果,更多的用户点击了其中的哪一个,则是搜索/点击转换率,即点击率。点击率较高,则认为网页和用户搜索词的相关度较高,会获得更好的排位。
而跳出率,则是搜索引擎判断一个网页用户体验的重要依据,如果跳出率(用户打开之后,没有进行同域名下下个页面访问,直接关闭页面则算作挑出)高,则一定程度上证明要么这个页面和搜索内容不符合,要么这个页面的体验特别差。如果跳出率高,搜索引擎会降低这个页面在对应关键词下的搜索权重评分,使排名下降。
另外一方面,搜索引擎的爬虫爬取页面时,也会评估页面的加载速度(实际的渲染)。按理说搜索引擎的爬虫不会像浏览器一样加载页面资源,因此不会直接测量页面的加载速度。但是搜索引擎有一些从侧面评估页面加载速度的方式方法,例如可以评估HTML下载时间、评估页面资源(JS、HTML、CSS、图片)大小从而推测加载时间、一些内部测试页面加载速度的工具等。
简而言之,页面速度影响两个方面搜索引擎的工作。
一是搜索引擎的爬虫,爬取每个网站的时间往往是固定的,比如只给你2小时,2小时爬到多少内容可能评估、收录多少内容,那么加载速度越快,被爬到、收录的到页面就会越多。
二是评估网站体验,如果网站体验较差,可能会降低网站的权重和收录可能。
在这方面,我们产品重点的工作从以下几方面入手:
前文提到,20%左右的流量来自于移动端。搜索引擎的桌面端和移动端权重是分开评分的。移动端有一套单独的评分标准。
由于移动端的网络、设备限制,移动端对于页面的大小、加载速度有更为严苛的评分标准。因此移动端优化主要是针对移动端,简化页面功能,更好的适配屏幕满足移动端的交互需求。
爬虫会来网站爬取、收录,但是光被动等着肯定是不合适的,把整个网站上所有主要、次要页面收录制作成站点地图然后提交给搜索引擎,是一个非常高效的方式。
首先确定好网站结构,例如我们产品有首页、二级首页、搜索页、详情页、专题页,这些页面是主要的内容呈现页面。然后通过站点地图生成工具,生成XML形式的站点地图。到百度、Google等搜索引擎的站长工具中提交制作好的站点地图。
站点地图需要定期的更新,尤其是如果有新的页面增加、旧的页面删除,都需要及时更新。大量页面突发性的删除变成404,如果没有主动上报,被搜索引擎发现,会被视为非常严重的情况,搜索引擎会降低对站点的信任,导致降权。
对于删除页面,我们主要做了以下的措施:
在页面被收录之后,其实重要的工作有两个点:
本质上,都是需要对落地页(进站后访问的第一个页面)进行优化。落地页需要有符合用户预期的高质量内容,同时还通过相关图片、相关专题推荐的形式,去扩展用户的浏览边界,让用户沉浸的持续的在站内各页面流转。
放删除实例开发。
创建拖放删除html文件,快速生成文档结构。
·通过ul li元素创建若干拖放元素,并设置相应样式。
·通过div delete元素创建回收站元素。
·在JS中声明变量items获取所有拖放元素,声明变量del获取回收站元素,声明变量dragEl备用。
·通过循环为每个拖放元素添加draggable属性,值为true。
·然后为每个拖放元素添加ondragstart事件,并将当下正在被拖放的元素赋值到变量dragEl中。
·为回收站元素del添加ondragover事件。
·当被拖放元素进入回收站元素范围时,清除浏览器中的样式,消除不至播放效果。
·最后当拖放释放鼠标按键时,将被拖放元素移除。
到这里一个将元素拖到回收站时会移除当前元素的拖放删除效果就做好啦。
总结一下,今天我们了解了draggable属性、ondragover事件、ondragstart事件以及ondrop事件。
·其中draggable属性的属性值设置为true,可以使目标元素成为可拖动元素。
·ondragover事件可以在开始拖动元素时触发。
·ondragover事件可以在被拖动的元素在被放置容器范围内拖动时触发。
·ondrop事件可以在拖动时释放鼠标按键时触发。
你学会了吗?
端开发人员在构建网站时需要做的一个决定是引入图片的方式。它可以是<img>标签,或者是通过CSS background 属性,还可以使用 SVG<image>。选择正确的方式是很重要的,它对性能和可访问性有很大的影响。
在本文中,我们会学习引入图像的各种方式,以及每种方式的优点和缺点,以及何时使用和为什么使用它们。
最简单的情况下,img元素必须包含src属性:
<img src="cool.jpg" alt="">
在页面加载时,它们会在页面图像加载时发生一些布局变化。为了避免这种情况,我们可以为它设置width和height属性:
<img src="cool.jpg" width="200" height="100" alt="">
虽然对某些人来说,这可能看起来太过简单了,但它是有用的。我们用图例的方式来理清这个概念:
我们看到到右侧图片即使尚未加载仍保留了空间?那是因为设置了宽度和高度。
图像可以用 CSS 隐藏。但是,它仍将加载在页面中。因此,在执行此操作时请小心。如果一个图像应该被隐藏,那么它可能是出于装饰的目的。
img {
display: none;
}
同样,上面的方法也不能阻止浏览器加载图像,即使它在视觉上是隐藏的。原因是<img>被认为是一个被替换的元素,所以我们无法控制它所加载的内容。
通过将alt属性设置为有意义的描述,用来访问 HTML 图像,这对于屏幕阅读器用户非常有帮助。
然而,如果一个alt描述是不需要的,请不要删除它,如果你这样做,图像src将被读出,这对可访问性非常不利。
不仅如此,如果图像因为某种原因没有加载,并且它有一个清晰的alt,它将作为一个回退显示。同样通过图例来演示一下。
假设我们有以下图片:
<img class="food-thumb" width="300" height="200" src="cheescake.jpg">
<img class="food-thumb" width="300" height="200" src="cheescake.jpg" alt="">
当src无效,图片没有加载时。第一个没有alt属性,而第二个是空的alt属性,下面是它们的视觉效果:
没有alt的图片仍然保留了它的空间,这很混乱,而且不利于访问。而另一个alt为空的图片,会折叠起来看起来像一个小点,这里因为它有边框。
但是,当alt属性有值,它看起来是这样的:
这不是一个很好的反馈吗?此外,当图像源失败时,可以向它们添加伪元素。
<img>的优点在于可以针对特定视口大小将其扩展为具有多个版本的照片。我们有两种不同的方式来生成一组响应式图像:
1.srcset属性
<img src="small.jpg" srcset="medium.jpg 500w, large.jpg 800w" alt="">
这很简单。对我来说,srcset可以根据屏幕宽度显示多个图像尺寸,这并不是一种完美的解决方案。它让浏览器选择合适的图像,而我们对此无能为力。
2.picture 标签
另一种选择是使用<picture>元素。我更喜欢这种方式,因为它更容易预测。
事例源码:https://codepen.io/shadeed/pen/d703aee137f38c138f2323a0252548ac?editors=1100
对于<img>,我们还可以使用的一组很好的特性object-fit和object-position。它们可以控制<img>的大小和定位,就像CSS背景图像。
object-fit 值有:fill, contain, cover, none, scale-down。例如:
img {
object-fit: cover;
object-position: 50% 50%;
}
使用CSS背景显示图像时,它需要一个具有内容或特定宽度或高度的元素。通常,背景图像的主要用途应该是用于装饰目的。
首先,我们需要一个元素
// html
<div class="element">Some content</div>
// css
.element {
background: url('cool.jpg');
}
使用CSS背景图片的好处是可以设置多个背景。考虑以下示例:
.element {
background: url('cool-1.jpg'), url('cool-2.jpg');
}
我们可以在特定视口中隐藏和显示图像,如果未使用CSS设置图片,则不会下载该图片。与使用<img>相比,这是一个额外的好处。
在上面的示例中,我们有一个背景图像,仅在视口宽度大于700px时显示。
如果使用不当,背景图像可能会影响可访问性。例如,将其用于文章主题,这对于文章至关重要。
普通人知道,如果要保存图像,只需单击鼠标左键,然后选择保存即可。CSS 背景图片并非如此,我们必须先检查元素,然后在DevTools中的url中打开链接,然后才能下载随CSS添加的图像。
可以将伪元素与CSS背景图像一起使用,例如在图像顶部显示覆盖图。对于<img>这是不可能的,直到我们为叠加层添加单独的元素。
SVG被认为是一种图像,它最大的功能是在不影响质量的情况下进行缩放。此外,使用SVG,我们可以嵌入JPG、PNG或SVG图像。参见下面的 HTML:
你是否注意到了prepareAspectRatio?它的作用是可以让图像占据SVG的整个宽度和高度,而不会被拉伸或压缩。
当<image>宽度较大时,它将填充其父级(SVG)宽度而不会拉伸。
这非常类似于 CSS 中的object-fit: cover或background-size: cover。
关于SVG 的可访问性,这使我想起了<title>元素。例如,我们可以像下面这样添加它:
我们还可以使用<desc>元素
必须先检查元素并复制图像的URL,然后才能下载嵌入SVG的图像。但是,如果我们要防止用户下载特定的图像,这可能是一件好事。
在构建hero section时,有时我们需要在标题和其他内容下方的图像。参见下图:
一些要求:
在开始解决方案之前,让我们先问问自己这种背景的性质。这是一些入门问题:
通过使用多个CSS背景,我们可以将一个背景作为叠加层,将另一个背景作为实际图像。请看下面的CSS:
.hero {
background-image: linear-gradient(rgba(0, 0, 0, 0.4),
rgba(0, 0, 0, 0.4)), var('landscape.jpg');
background-repeat: no-repeat;
background-size: 100%, cover;
}
虽然此解决方案有效,但可以使用 JavaScript 动态更改背景图片。见下面:
<section class="hero"
style="background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('landscape.jpg');">
<!-- Hero content -->
</section>
这里添加了一个内联样式。虽然这是可行的,但它看起来很丑,而且不实用。
也许我们可以使用CSS变量?让我们来探索一下。
<section class="hero" style="--bg-url: url('landscape.jpg')">
<!-- Hero content -->
</section>
现在,我们可以轻松地更新--bg-url变量来动态更改背, 这比内联的东西好一百万倍。
小结:
事例源码:https://codepen.io/shadeed/pen/17978a2d824fd51a3b27c2c2d099a522
该方案是可以使用一个 img 标签:
<section class="hero">
<h2 class="hero__title">Using Images in CSS</h2>
<p class="hero__desc">An article about which and when to use</p>
<img src="landscape.jpg" alt="">
</section>
在CSS中,我们需要将图片绝对定位在内容下方,并且还需要使用伪元素作为叠加层。
此解决方案的优点在于,可以轻松更改图片的src属性。同样,如果图像很重要,它将会更加有用。
另外,我喜欢使用HTML <img>的功能是能够在未加载图片的情况下添加回退。回退至少可以使内容保持可读性。
.hero img {
/* Other styles */
background: #2962ff;
}
在图片源路径不对时,背景颜色是一个代替方面。
事例源码:https://codepen.io/shadeed/pen/73a2ca78141fcab39d6db9d5bd982728?editors=1100
网站 Logo是很重要的,因为它可以将网站与其他网站区分开。要嵌入徽标,我们有一些选择:
接下来,我们来看看哪种方式更合适。
当徽标具有许多细节或形状时,将其用作嵌入式SVG可能没有好处。我建议使用<img>,图像类型可以是png,jpg或svg。
我们有一个简单的logo ,其中包含形状和文字。悬停时,形状和文本需要更改颜色。怎么做?对我来说最好的解决方案是使用嵌入式SVG。
HTML
CSS
.logo rect,
.logo text {
transition: 0.3s ease-out;
}
.logo:hover rect,
.logo:hover text {
fill: #4a7def;
}
事例源码:https://codepen.io/shadeed/pen/4005077cc543647148007f4834c0585c?editors=0100
这让我想起了Smashing Magazine的logo。我喜欢它从一个小图标变成一个完整的徽标。参见下面的模型:
完美的解决方案是使用<picture>元素,可以在其中添 加logo 的两个版本。如下所示:
<a class="logo" href="/">
<picture>
<source media="(min-width: 1350px)" srcset="sm-logo--full.svg">
<img src="sm-logo.svg" alt="Smashing Magazine">
</picture>
</a>
在CSS中,我们需要将视口的宽度更改为等于或大于1350px。
.logo {
display: inline-block;
width: 45px;
}
@media (min-width: 1350px) {
.logo {
width: 180px;
}
}
这是简单而直接的解决方案。
事例源码:https://codepen.io/shadeed/pen/6cf55d4e87b7c443820bd5f8694587a8?editors=1100
当 logo 具有渐变时,从Illustrator或Sketch等设计应用程序将其导出的过程可能并不完美,有时会中断。
使用SVG,我们可以轻松地为logo添加渐变。我添加了<linearGradient>并将其用作文本填充。
事例源码:https://codepen.io/shadeed/pen/9bf3bee3d08a40411effb5d65f25b5c1?editors=1100
对于用户头像,它们具有很多形状,但最常见的是矩形或圆形。在此用例中,会介绍一个对你有用的重要技巧。
首先,让我们看下面的模型。请注意,我们有一个完美的化身,并且100%清晰。
但是,当用户上传半白色头像或非常浅的头像时,这个设计就不太好了。
请注意,在上面的模型中,除非真正专注看,否则尚不清楚其中是否有一个圆圈。这是一个问题。为了解决这个问题,我们应该在头像内添加边框,以防图像太亮看不清除。
我们有几个选择
哪一个最好?我们来探索探索。
你可能首先想到的是添加一个边框,对吧?让我们来探讨一下这个问题。
.avatar {
border: 2px solid #f2f2f2;
}
我们的目标是使内部边框与图像融合在一起,这种不太实用。
现在的问题是,要添加内部边框,我们不能使用box-shadow,因为它无法在图像上使用。解决方案用<div>包裹 头像中,并添加专用于内部边框的元素。
HTML
<div class="avatar-wrapper">
<img class="avatar" src="shadeed2.jpg" alt="A photo of Ahmad Shadeed">
<div class="avatar-border"></div>
</div>
CSS
.avatar-wrapper {
position: relative;
width: 150px;
height: 150px;
}
.avatar-border {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border-radius: 50%;
border: 2px solid rgba(0, 0, 0, 0.1);
}
通过在<div>上使用透明度10%黑色的边框,我们可以确保边框与深色图像融合,并且只有在图像较亮的情况下才可见。参见下面的模型:
事例地址:https://codepen.io/shadeed/pen/da23d9a18dac14692a97e1bc6e86a5ff?editors=1100
如果我要使用<div>来显示头像,则可能表示该图像具有装饰性。我记得一个用例,它是分散在页面中的随机头像。
HTML
<div class="avatar" style="--img-url: url(shadeed2.jpg)"></div>
CSS
.avatar {
background: var(--img-url) center/cover;
width: 150px;
height: 150px;
border-radius: 50%;
box-shadow: inset 0 0 0 2px rgba(#000, 0.1);
}
事例地址:https://codepen.io/shadeed/pen/39eb9dac364ec15b9ab9bae7fe3a7148?editors=0100
对我来说,这是最有趣的解决方案。我在检查Facebook的新设计时注意到了它。
先对其进行剖析,它包含以下内容:
circle {
stroke-width: 2;
stroke: rgba(0, 0, 0, 0.1);
fill: none;
}
事例地址:https://codepen.io/shadeed/pen/b17d34b5c23cc90fdc4573779544c8c7?editors=0100
作者:ahmad shadeed 译者:前端小智
原文:https://developers.google.com/web/fundamentals/design-and-ux/responsive/images
*请认真填写需求信息,我们会在24小时内与您取得联系。