作为初学者,理解学习的不同语言之间如何相互作用可能会让人感到困惑。 我认为我们可以将各种语言配对,看看它们在哪里交叉和通信。
HTML 和 CSS
您需要 HTML 才能使用 CSS,因为 HTML 调用 CSS。 在 HTML 文档中,您可能会看到一些类似这样的 HTML
<link rel="stylesheet" href="style.css">
这是一个调用某些 CSS 的 HTML 元素(<link>
),然后这些 CSS 将应用于 HTML。 或者您可能会看到一个这样的“样式块”
<!-- this <style> tag is HTML -->
<style>
/* The stuff in here is CSS */
.message {
padding: 20px;
background: lightyellow;
border: 1px solid yellow;
}
</style>
HTML 和 CSS 之间的典型连接是通过选择器。 HTML 元素可能具有 ID 或类,它本身的作用不大,但 CSS 可以通过它来查找并对其进行样式设置。 比如
<div class="module message">
<h2 class="positive">
Good afternoon!
<h2>
<p>
You look nice today.
</p>
</div>
.module { /* will apply to <div class="module message"> */
padding: 20px;
background: rgba(0, 0, 0, 0.2);
}
.message { /* will apply to <div class="module message"> */
border: 1px solid yellow;
}
.positive { /* will apply to <h2 class="positive"> */
color: lightblue;
font-weight: bold;
}
CSS 甚至可以直接应用于 HTML 中的元素。 在这种情况下,没有选择器,只有属性和值
<div style="padding: 10px; background: red; color: white;">
Emergency!
</div>
通常不建议以这种方式使用 CSS,因为它没有充分利用 HTML 和 CSS 共同发挥出色作用的地方:分离内容和样式。
HTML 和 JavaScript
您需要 HTML 来调用 JavaScript。 在 HTML 文档中,您可能会看到
<script src="script.js"></script>
这是一个调用 JavaScript 文件的 HTML 元素(<script>
),然后该文件将在该文档中运行。 或者您可能会看到一个没有源代码的脚本标签,一个内联脚本块
<!-- the <script> tag is HTML -->
<script>
// The stuff in here is JavaScript
var header = document.getElementById("main-header");
</script>
您还可能会在 HTML 元素上看到直接的 JavaScript,如下所示
<button onclick="doSomething();"></button>
通常不建议这样“内联”使用 JavaScript,因为它效率不高,并且没有分离内容和交互的关注点。
HTML 和 JavaScript 之间的另一种关系是 JavaScript 可以控制 DOM。 DOM 本质上是浏览器读取 HTML 后将其转换为的内容。 您可以在 此处阅读更多相关信息。
JavaScript 可以创建新的 HTML 并将其插入页面
// Create new element
var modal = document.createElement('div');
// Set attributes and content
modal.id = "modal";
modal.innerHTML = "\
<h1>Important Message</h1>\
<p>You're cool.</p>";
// Put in the <body>
document.documentElement.appendChild(modal);
JavaScript 也可以从页面中删除元素
var reference = document.getElementById("goner");
reference.parentNode.removeChild(reference);
JavaScript 还可以更改现有元素的内容
var reference = document.querySelectorAll("#modal > h1");
reference[0].innerHTML = "This title has been changed by JS!";
JavaScript 和 CSS
JavaScript 可以获取有关元素样式的信息
<div style="color: red;" id="test">test</div>
<script>
var div = document.getElementById("test");
console.log(div.style.color);
// red
// and/or *set* it like:
div.style.padding = "10px";
</script>
但这仅适用于元素的内联style
属性(或以这种方式设置的样式)。 JavaScript 还可以获取元素上的所有样式,即使这些样式来自其他地方的 CSS 也是如此
<style>
.test {
margin: 30px;
}
<style>
<div class="test"></div>
<script>
var div = document.querySelectorAll(".test")[0];
var styles = getComputedStyle(div);
console.log(styles.margin);
// 30px
</script>
更常见的是,因为 JavaScript 是我们处理网站交互的主要方式,所以我们使用它来控制其他元素。 这是一个简单的示例,它演示了一个按钮,当单击时,它会切换您是否可以看到另一个元素
<button class="button">Toggle Another Element</button>
<div id="message">Message</div>
var button = document.querySelectorAll(".button")[0];
var message = document.querySelectorAll("#message")[0];
button.addEventListener("click", function() {
if (message.style.display == "block") {
message.style.display = "none";
} else {
message.style.display = "block";
}
});
也许更常见(并且通常被认为是负责任的)是仅操作元素的类名,而不是直接操作样式。 然后让 CSS 处理样式(包括它是否可见)。 无论如何,最终会更容易
#message {
display: none;
}
#message.show {
display: block;
}
var button = document.querySelectorAll(".button")[0];
var message = document.querySelectorAll("#message")[0];
button.addEventListener("click", function() {
message.classList.toggle("show");
}, false);
查看 Chris Coyier 在 CodePen 上创建的笔 qidGm。 (@chriscoyier)
HTML 和 PHP
您使用的 HTML 实际上可能位于 PHP 等后端语言中,并被处理并作为 HTML 传递。 想象一下博客的模板
<h1>
<?php echo $postTitle; ?>
</h1>
<div class="post-content">
<?php echo $postContent; ?>
</div>
在本文中,我们只是使用 PHP 作为后端语言的示例。 但它也可能很容易是 Ruby 或 Python 或类似的语言。
您会在那里识别出 HTML,但 PHP 混合其中。 这只是输出后端语言可能负责的值的通用示例。 Web 浏览器永远不会看到这样的代码。 在它到达浏览器之前,它看起来就像普通的 HTML
<h1>
How To Survive A Flight Delay Without Tweeting About It
</h1>
<div class="post-content">
Step one, grow up.
</div>
作为前端人员,您可能会将 PHP 视为数据库中的信息与 HTML 之间的链接。
另一种可能性是根据您在服务器上知道的信息输出不同的 HTML。
<?php $userLikesCheese = doesUserLikeCheese($user); ?>
<?php if ($userLikesCheese) { ?>
<div class="modal">
Congrats on loving cheese, cheese lover!
</div>
<?php } else { ?>
<div class="modal">
Some other way more boring widget.
</div>
<?php } ?>
PHP 和 JavaScript
说到数据库,您可能需要来自服务器的 JavaScript 信息。
JavaScript 还可以自行向 URL 发出请求。 想象一下,在页面上点击“赞”按钮。 您不会期望这会刷新整个页面。 相反,此操作可能会向服务器上的 PHP 文件发出请求,该文件的工作是保存该信息。
var button = document.querySelectorAll(".button")[0];
button.addEventListener("click", function() {
var xhr = new XMLHttpRequest();
xhr.onload = likeSuccess;
xhr.open("get", "/save_like.php", true);
xhr.send();
});
function likeSuccess() {
button.innerHTML = "You Like Stuff!";
}
查看 Chris Coyier 在 CodePen 上创建的笔 gomvI。 (@chriscoyier)
PHP 和 CSS
就像 PHP 文档可以被处理并作为 HTML 提供服务一样,CSS 也可以这样做。 这意味着您可以执行诸如在 CSS 中利用 PHP 变量的功能。 我之前写过这方面的内容,但我认为今天这不是一个特别好的主意。 我建议改为查看 CSS 预处理。
另一个连接是使用 PHP 更改类名或属性,然后 CSS 据此采取行动。
<body class="<?php echo $bodyClass; ?>">
<header>
Probably a logo and stuff.
</header>
</body>
header {
height: 100px;
}
/* header is bigger on homepage */
body.home header {
height: 200px;
}
当然,事情会变得更加复杂。
这应该是不言而喻的,对吧? 有时候就是这样。 但这些不仅仅是“基础知识”——它们是更复杂事物构建的基础概念。
也许您学习了如何使用 jQuery 发出 Ajax 请求,它看起来与我上面做的不同。 那么,在用 JavaScript 编写的 jQuery 库中的某个地方,它正在执行相同的操作。 它只是在那里添加了一些额外的内容,以确保它在旧版浏览器中也能正常工作,并为您提供便利。
也许您正在使用 Angular,并且您在页面上更改内容的方式是在 HTML 中使用奇怪的{{尖括号}}
。 这很巧妙,但在某个地方 Angular 正在使用“原始”JavaScript 执行某些操作。 正在使用.innerHTML
或替换节点,谁知道呢。 Angular 的开发人员找到了最好的方法,这就是它所做的。
也许您在工作中使用的 CMS 具有不同的模板系统。 那就太酷了。 我敢打赌,在它到达浏览器之前,它会被转换为 HTML,因为这就是这一切的运作方式。
重点:它们都是相关的。
您可能在某些语言方面比其他语言更擅长。 我们所有人都是。 完全没问题。 但了解它们如何组合在一起非常重要。 这就是我们所有人的工作。
我的灵感来自我自己的困惑,当我听到一些初创公司的员工滔滔不绝地谈论他们的“技术栈”时,我根本不理解所有这些东西如何可能组合在一起构建一个东西。 我仍然感到困惑,但这并不重要。 我理解这些部分如何组合在一起,因此我从未听说过的任何部分肯定只是处理我们所有人都在处理的 Web 技术拼图的相同部分的某种新奇方式。
可能值得一提的是,当 JS 在服务器端时,它与 HTML 的关系会发生变化。 也许这超出了本文的范围。 不过我觉得值得一提。
无论如何,文章写得很好。 在我刚开始的时候,如果能把所有这些内容放在一个地方就好了。 特别是 PHP/JS 交互的解释。 我花了太长时间才弄明白。
对于新手来说,这是一个非常好的关于事物如何交互的概述。它提供了更清晰的画面,而理解这些画面原本可能需要几本书才能弄清楚。
就在前几天,我去看了你的“书架”页面。我正从Jen Robbins的书开始学习。感谢你的建议。那真的是一本非常适合初学者的书。它从现代的角度涵盖了一些内容(而且我用Brackets来告诉我哪些内容已经过时,例如)。另外,你觉得关于JavaScript的新书“Speaking JavaScript”怎么样?
感谢你的指导。继续努力。
只想说……很棒的文章……我相信这篇文章对刚进入这个领域的新人会有帮助。
感谢你撰写了一篇可能针对初学者,但经验丰富的网页开发者也能从中获益的文章。
我读这篇文章读得很愉快,直到PHP部分。在这个开发阶段(特别是对于新手来说),任何其他语言都比PHP更适合后端。提到的Python和Ruby是更好的选择(更不用说像AngularJS或Meteor这样的新前端框架,或者超级轰动的NodeJs了)。PHP真是太乱了!
tl:dr PHP是新的Java。不要使用它。
我认为PHP仍然是新手最好的后端语言。它入门门槛很低。在最基本的用法中,它几乎只是扩展了HTML,这可能就是初学者所需要的全部。更不用说所有最突出的CMS都运行在PHP上。
我说从PHP开始,当你的需求变得更复杂时,再转向更适合它的东西。
同意Halley的说法。看看Elance和市场需求。PHP无处不在。
处理这些评论并允许进行此讨论的代码是PHP :)
话题热议
那是你的一大堆个人观点,Cesar。有些人靠PHP开发谋生,更不用说全球最流行的CMS平台都运行在它上面,其中之一是WordPress,如果我没记错的话,它几乎为大约20%的网站提供支持,包括这个网站。
所以,是的,PHP在短期内不会消失。
你提出了一些需要考虑的要点。不过
Halley:使用PHP很容易迷失在错综复杂的代码中,一个错误可能会毁掉很多东西。对于新手来说,这绝对是让人讨厌生活的最可靠方法。在HTML扩展方面,前端框架是最佳选择。
Chris:我认为使用WordPress与完全用PHP编码是完全不同的,因为在使用CMS时你几乎不需要触碰后台的任何东西。这是一个很好的例子,说明PHP是什么(或者应该是什么):一种机器代码,对用户完全不友好。
Gabe:PHP是其时代的产物(更像是流产)。它可能在当时很好,但现在是时候转向更易理解、更连贯的语言了。我的意思是:( . ” ‘, ‘ ” . $password . ” ‘ ) ” ); … 这种反人类的东西是谁想出来的!
Taariqq:Elance是一个“底层平台”,总是降低标准,并且给开发人员的报酬过低……它几乎和PHP一样糟糕。
TL:DR:如果你想要一个更美好的世界,就销毁PHP;
关于Elance。你可能是对的,但它至少让人了解了市场需求。对于新手来说,还有什么比尽快获得工作机会更重要的呢?所以,在HTML、CSS,也许还有JavaScript之后,我应该专注于什么?当然,是PHP。Ruby和Python可能更好,所以我将在用PHP和其他技术赚钱之后再学习它们,愿真主保佑(God willing)。
关于WordPress。如果我没记错的话,有很多工作岗位需要PHP开发人员来调整WP。
无论PHP是不是最好的东西,我都知道如果我懂PHP,就能找到工作。至少对我来说,这就是现在的底线。现在,如果我变得足够优秀,能够向客户建议使用什么技术,我就可以选择我想要用什么语言编程了。在此之前,一切都是由市场驱动的。此外,我之前也用过一些PHP 4和5。而且,从我对C的工作知识出发,我实际上非常喜欢PHP……至少现在是这样 :)
Taariqq,
你提出了一个重要的主题,就业能力。几年来(特别是最近三年),我看到Ruby(on Rails)已经成为新的标准。我认为现在它是就业机会最多,也是对开发新手最有利可图的选择。
在我看来,“PHP骑士©”都是已经非常有经验的人。嘿,这很好,如果你能用它创造出惊人的东西,那就坚持你的选择吧。现状总是会为其持久性找到合理的解释。现在,某个地方一定有COBOL工程师在游说自己的事业。想想看。
TL:DR:如果你刚开始学习网页开发,就对PHP发布限制令吧 :)
Cesar,
感谢你关于Ruby on Rails的提示。我会牢记在心,一旦我对HTML和CSS,也许还有JavaScript感到满意,我就会去研究它。
另一方面,查看TIOBE指数,我仍然觉得先处理PHP会比较舒服。
PHP – https://tiobe.org.cn/index.php/content/paperinfo/tpci/PHP.html
Ruby – https://tiobe.org.cn/index.php/content/paperinfo/tpci/Ruby.html
也许Ruby on Rails是不同的。看起来我需要了解所有这些语言 :)
我的天哪,我们这是怎么了?我特此为喂养喷子道歉。
道歉接受,Gabe。但请不要再犯了。
@Halley – 大多数人使用什么并不重要。重要的是语言的设计是否良好。
PHP万岁!
对于所有那些(包括我)试图连接无数网页技术点的人来说,这是一个不错的入门博客。
谢谢。
创建网站既丑陋又美丽的一点在于,你可以用很多不同的方法来做。
对于相同的解决方案,大约有上百种甚至更多的方法。即使这样——细节也可能有所不同。
参见 https://css-tricks.org.cn/blue-box/
也许这超出了本文的范围,但在我看来,如果你打算实际将这些不同的网页开发组件结合在一起使用,你需要了解角色的划分。虽然文章解释了它们是如何相互作用的,但它有点忽略了哪种语言用于业务逻辑、内容、布局、样式、行为/交互。这在一定程度上是隐含的,但对于初学者来说可能不够清楚。
更详细的解释当然不会有害。当信息像这样以小块的形式出现时,更容易消化,而不是读一本500页的书,至少对我来说是这样。
Cesar,我不确定你是否真的了解PHP。在我看来,你说话的方式就像一个想炫耀自己编程语言知识的人——没有冒犯的意思。
这适用于每种语言。实际上,对于我们最喜欢的JavaScript来说,一个丢失的分号可能会导致整个脚本失效。而且这是好的(每个人都使用严格模式?)
你在说什么框架?像Handlebars、jQuery、Underscore这样的库?还是强大的AngularJS?当然,PHP不是HTML“扩展”的最佳选择,但任何服务器端语言都不是——无论是Python还是Ruby等。
哇……我不认为你用过很多WP。我敢肯定,Chris为了构建这个完整的网站,肯定接触过不少PHP。
如果PHP不友好,我不知道什么才算友好。我同意PHP不是最美丽的语言——Python应该是,但它不友好?甚至都不接近。
Python诞生于1991年。PHP、Ruby和JavaScript诞生于1995年。所以我想可以肯定地说,它们诞生于同一个时代。PHP发展如此之快,成为首选网页语言的原因很简单,因为它是为网页而构建的。其他语言都不是以网页为目的构建的(JavaScript可能稍微是一个例外)。因此,人们自然会选择PHP来满足他们的网页需求。如果你说的是Django、RoR、NodeJS等框架和环境……它们让网页开发变得优雅,请注意,PHP也有很多类似的框架:Zend、Symfony、Cake、CodeIgnier、Falcon、Kohana、Laravel等等。你试过任何一个吗?
那在其他语言中,你是如何进行字符串连接的呢?我上次查看时,JavaScript 甚至没有变量解析功能,这也是我如此喜爱 CoffeeScript 的原因之一!
这非常主观……我只能这么说。
TLDR:如果你想要一个更好的世界,不要盲目地憎恨。我认识的最优秀的程序员,他们根本不讨厌任何语言。当然,他们可能更偏爱其中一种。语言仅仅是工具。大多数时候,你讨厌一种工具仅仅是因为你没有掌握它。
嗨,Phan,
你关于每种语言都会“犯错”的说法是对的。但是 PHP 有问题的语法使得识别这些错误变得非常困难,更不用说它缺乏一致性,有时甚至显得反复无常。
在 WordPress 中,你可以深入使用 PHP,在我看来,这违背了使用 CMS 的初衷。
对于 Web 开发的新手来说,PHP 是通往绝望的道路。在这个阶段,有很多更好的选择,比如 AngularJS、Meteor、Node……将它们与现代 NoSQL 数据库结合起来,你可以用更少的代码和更好的语法做更多的事情。
TLDR:如果你喜欢 PHP,你就会喜欢 Internet Explorer。 :)
Cesar,你为什么不澄清一下你关于 PHP 语法有问题的结论?是的,我同意它缺乏一致性,但框架的作用就在于此。
这不对。你把用户和开发者混淆了。
恰恰相反。AngularJS、Meteor、Node 和 NoSQL 根本不适合“新手”。它们都不能用于日常网站,或者说不是为了这个目的而创建的。更不用说,每种语言、框架或组合都有不同的用途。像你这样有偏见的观点正在把这些很棒的技术变成流行语。
另外我想说,对于新手来说,“用更少的代码做更多的事情”弊大于利,因为它阻止了开发者掌握基础知识。在接触 AngularJS 之前,先成为一名优秀的 JavaScript 开发者。在使用 SASS 之前,先了解 CSS。在深入学习 Django 之前,先学习 Python。
关于你最后一句话……你知道 TLDR(顺便说一下,它后面有个分号)是什么意思吗?因为你的 TLDR 与你的帖子没有任何关系。
Phan,
对于新手来说,我指的是那些已经体验过前端部分(HTML-CSS-JS 三位一体),并决定更进一步的人。我是在按顺序谈论,就像文章中描述的那样。我并不是说一个从未修改过简单 DIV 的人会立即开始使用 JavaScript 框架,哈哈!
用更少的代码做更多的事情,并不意味着你可以通过跳过基础知识来作弊。这意味着某些语言可以用更少的代码做完全相同的事情。如果你需要旅行 1000 英里,你会选择汽车还是独轮车?因为它们都能带你到达目的地。编程语言是手段而不是目的。
(顺便说一句,你提到的那些 PHP 框架,根据你自己的说法,可以被认为是“跳过基础知识”)。
TLDR:TLDR 有时用于幽默,对某些人来说是一种挑战。
Cesar,你对新手的定义正是我脑海中的,但它仍然不适合你之前提到的那些名称。
你关于旅行 1000 英里的例子也不合适,因为我们这里没有人提到项目规模。当然,你不会骑自行车旅行 1000 英里,但你也不会同时开着雪佛兰穿越亚马逊雨林。或者,我可以引用我自己的话:
我建议你回复我的第一条评论,直接切入正题(你自己提出的那些问题)。
看到我们正在走向哪里很有趣,但你真的需要查一下 TLDR 的定义,伙计。
等等,Phan,我对你新手的定义是你脑海中的?那些前端知识丰富的人不能使用 JS 框架?拜托,不要贬低你的同伴!对于一个前端高手来说,这些语言远比 PHP 好。AngularJS 实际上是 HTML 扩展的下一步自然发展。我没有任何一种提到的技术存在可扩展性问题。根据亚马逊的地形,它们就像带有自定义元素的越野摩托车。PHP 更像是,有人给你一辆校车让你穿过雨林,并告诉你“嘿,它有发动机,你自己琢磨吧”。
TLDR:我无法查阅 TLDR 的含义,因为我丢了字典。在有人发明一种更好的获取信息的方法之前,我无法给你启迪。
好吧,既然你似乎选择忽略你最初引发我们争论的观点,让我总结一下(是的,这对这里其他人来说是 TLDR,请停止关于启迪的无意义的讽刺,那很幼稚)。
在你看来,PHP 很糟糕(尽管你没有或无法证明原因),你讨厌 PHP,你想毁掉它,喜欢 PHP 就意味着喜欢 Internet Explorer。
在我看来,语言仅仅是工具,选择适合工作的工具,并且不要去憎恨。
因为我不想成为这个人,所以我们到此为止吧。
我突然顿悟了:你们的话语让我确信应该拥抱 PHP。
等等,让我再检查一下。不,并没有。
既然我的评论很幼稚,请允许我以优雅和成熟的方式离开。
如果你喜欢 PHP,你就会喜欢 Nickelback。
享受你的 PHP 烂摊子吧。
PHP 和 JavaScript 部分正是我想要的。为什么人们对 PHP 抱怨这么多,PHP 最好的替代方案是什么?(可以在共享主机站点上轻松设置)
至于为什么有些人不喜欢 PHP……谁知道呢。
如果你正在为 Web 开发,它是一个合理的语言选择,就像 Python、Ruby、服务器端 JS 等一样。
如果你是一名专业的 Web 开发人员,或者正在接受培训成为一名专业的 Web 开发人员,你几乎肯定会在你的职业生涯中遇到 PHP,所以值得花一些时间学习基础知识。也许可以编写一个 WordPress 模板或插件——这样你就可以用一种友好的方式学习一些非常有价值的技能。
我认为没有“最佳”的替代方案——我认识的所有优秀的开发人员至少对三种或更多语言感到舒适,通常是 js、PHP 和 Python,尽管他们可能更偏爱其中一种。
对于初学者来说,更重要的是要学习你将在每种编程语言中找到的构造的来龙去脉——变量、函数、循环、开关等。
一旦你掌握了编程的基础知识,剩下的就只是语法了。
对于共享主机,只需检查提供商服务器正在运行哪些语言,或者选择一个提供你想要语言的主机。
Cesar,有点跑题了,这个链接可能对你有用。注意诉诸嘲笑部分,那里的例子应该听起来很熟悉。
在应用程序中将 PHP 和 JavaScript 结合使用时,PHP 函数[json_encode](http:/ nction.json-encode.php “json_encode”) 和json_decode 是你的好朋友!
精彩的总结,谢谢。
就我个人而言,我认为 css-tricks 是互联网上最好的通用信息 Web 技术教育资源。它完美地融合了“现在有效的方法”和“未来的趋势”。
我实际上已经停止阅读一些更古怪的网站(比如 html5rocks,它非常没有重点)。
谢谢。
精彩的文章!感觉学到了很多。