在 Kotlin-js 中为 HTML 元素设置样式
Styling HTML elements at Kotlin-js
如何在使用 Kotlinx-html
时设置我的 HTML 元素的样式,我的应用程序运行良好,然后我尝试使用 AZA-Kotlin
添加样式,但是一旦我导入 azadev.kotlin
它给了我错误构建
我的完整代码如下:
Main.kt
:
import azadev.kotlin.css.Stylesheet
import azadev.kotlin.css.color
import azadev.kotlin.css.dimens.px
import azadev.kotlin.css.opacity
import azadev.kotlin.css.width
import kotlinx.html.*
import kotlinx.html.js.*
import kotlinx.html.dom.create
import kotlin.browser.*
import kotlinx.html.dom.append
import org.w3c.dom.HTMLButtonElement
fun main(args: Array<String>) {
println("Hello JavaScript!")
val myDiv = document.create.div("panel") { // class = "panel"
p {
+"Here is "
a("http://kotlinlang.org") { +"official Kotlin site" }
}
}
val button = BUTTON()
button!!.innerText = "Click me"
button!!.onclick = { println("Button clicked!") }
val btn = document.create.button {
text("click me")
onClickFunction = { _ -> window.alert("Kotlin!") }
Stylesheet {
color = 0xffffff
width = 10.px
opacity = .8
hover {
color = 0xf2cacf
}
}
}
document.getElementById("container")!!.appendChild(myDiv)
document.getElementById("container")!!.appendChild(btn)
document.getElementById("container")!!.appendChild(button)
document.getElementById("container")!!.append {
div {
+"added it"
}
}
}
fun BUTTON(): HTMLButtonElement {return document.create.button()}
我的gradle.build
是:
group 'org.example'
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.1.51'
ext.kotlinx_html_version = '0.6.4'
ext.aza_kotlin_css = '1.0'
ext.web_dir = 'web'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin2js'
repositories {
mavenCentral()
jcenter()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
compile "org.jetbrains.kotlinx:kotlinx-html-js:$kotlinx_html_version"
compile "azadev.kotlin:aza-kotlin-css:$aza_kotlin_css"
}
compileKotlin2Js {
kotlinOptions.outputFile = "${projectDir}/web/scripts/main.js"
kotlinOptions.moduleKind = "umd"
kotlinOptions.sourceMap = true
}
clean.doFirst() {
delete("${web_dir}")
}
build.doLast() {
// Copy kotlin.js and kotlin-meta.js from jar into web directory
configurations.compile.each { File file ->
copy {
includeEmptyDirs = false
from zipTree(file.absolutePath)
into "${projectDir}/${web_dir}/lib"
include { fileTreeElement ->
def path = fileTreeElement.path
path.endsWith(".js") && (path.startsWith("META-INF/resources/") || !path.startsWith("META-INF/"))
}
}
}
// Copy scripts to web directory
copy {
includeEmptyDirs = false
from new File("build/classes/main")
into "${web_dir}/lib"
}
// Copy resources to web directory
copy {
includeEmptyDirs = false
from new File("src/main/kotlin/resources")
into "${web_dir}"
}
}
我的index.html
是:
<html>
<head>
<meta charset="UTF-8">
<title>Sample Default</title>
</head>
<body id="BODY">
<h1>Kotlin 1.1 Example</h1>
<div id="container"/>
<input type="text" name="email" id="email"/>
<script type="text/javascript" src="lib/kotlin.js"></script>
<script type="text/javascript" src="lib/kotlinx-html-js.js"></script>
<script type="text/javascript" src="scripts/main.js"></script>
</body>
</html>
我的应用结构:
无论使用 Aza-kotlin
还是任何其他方式,我如何设置我的元素的样式。
我在 kotlinx-html
中找到了解决方案,方法是将 style
用作:
val btn = document.create.button {
text("click me")
onClickFunction = { _ -> window.alert("Kotlin!") }
style = """
color: 0xffffff;
width: 10.px;
opacity: .8;
hover {
color : 0xf2cacf
}
"""
}
另一个已知选项是使用 css
文件,并为元素附加所需的 class(s),例如:
val btn = document.create.button(classes = "container left tree") { ... }
//or
val btn = document.create.button {
classes = setOf("container", "left", "tree")
classes += "siteHeader" //
... }
截至今天,aza_kotlin_css
出现问题,应用程序与我一起使用如下 [Mac 新手的详细步骤 :)]
安装 Homebrew
为:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装 gradle
为:brew install gradle
通过运行ning找到安装路径brew info gradle
将 gradle 手动添加到 `Android Studio/Preferences'
创建投影文件夹,并移入cd myapp
作为 gradle init --type java-library
启动了新的 java gradle 项目
删除了 src/main
和 src/test
文件夹
创建了 src/kotlin
和 src/resources
文件夹
将 build.gradle
文件的内容替换为:
buildscript {
ext.kotlin_version = '1.2.21'
ext.web_dir = 'web'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // for gradle build
}
}
apply plugin: 'kotlin2js'
repositories { jcenter() }
dependencies {
def kotlinx_html_version = "0.6.8"
// for interacting with the DOM
compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
// for DOM creation in the client sie
compile "org.jetbrains.kotlinx:kotlinx-html-js:${kotlinx_html_version}"
// for DOM creation in the server sie
// compile "org.jetbrains.kotlinx:kotlinx-html-jvm:${kotlinx_html_version}"
}
sourceSets.main {
kotlin.srcDirs += 'src/kotlin'
resources.srcDirs += 'src/resources'
}
compileKotlin2Js.kotlinOptions {
outputFile = "${projectDir}/web/scripts/main.js"
moduleKind = "commonjs" // can be other options, commonjs is the one that works with Nodejs
sourceMap = true
}
clean.doFirst() {
delete("${web_dir}")
}
build.doLast() {
// Copy kotlin.js and kotlin-meta.js from jar into web directory
configurations.compile.each { File file ->
copy {
includeEmptyDirs = false
from zipTree(file.absolutePath)
into "${projectDir}/${web_dir}/lib"
include { fileTreeElement ->
def path = fileTreeElement.path
path.endsWith(".js") && (path.startsWith("META-INF/resources/")
|| !path.startsWith("META-INF/"))
}
}
}
// Copy scripts to web directory
copy {
includeEmptyDirs = false
from new File("build/classes/main")
into "${web_dir}/lib"
}
// Copy resources to web directory
copy {
includeEmptyDirs = false
from new File("src/resources")
into "${web_dir}"
}
}
创建了包含以下内容的 src/kotlin/Main.Kt
文件:
import kotlinx.html.*
import kotlinx.html.js.*
import kotlinx.html.dom.create
import kotlin.browser.*
import kotlinx.html.dom.append
import org.w3c.dom.HTMLButtonElement
fun main(args: Array<String>) {
println("Hello JavaScript!, do you know that fib(5) = ${fib(5)}")
val myDiv = document.create.div("panel") { // class = "panel"
p {
+"Here is "
a("http://kotlinlang.org") { +"official Kotlin site" }
}
}
val email = document.getElementById("email") as HTMLInputElement
email.value = "hadi@jetbrains.com"
val button = BUTTON()
button!!.innerText = "Click me"
button!!.onclick = { println("Button clicked!") }
val btn = document.create.button {
text("click me")
onClickFunction = { _ -> window.alert("Kotlin!") }
style = """
color: 0xffffff;
width: 10.px;
opacity: .8;
hover {
color : 0xf2cacf
}
"""
}
/*
// OR use one of the bew to load the style from the .css file
val btn = document.create.button(classes = "container left tree") {
... }
//or
val btn = document.create.button {
classes = setOf("container", "left", "tree")
classes += "siteHeader"
... }
*/
document.getElementById("container")!!.appendChild(myDiv)
document.getElementById("container")!!.appendChild(btn)
document.getElementById("container")!!.appendChild(button)
document.getElementById("container")!!.append {
div {
+"added it"
}
}
}
fun BUTTON(): HTMLButtonElement {return document.create.button()}
创建了另一个文件src/kotlin/Fib.tk
,内容如下,从Main.kt
文件中调用,全部编译为single
JavaScript文件:
fun fib(n: Int):Int {
return when (n) {
0,1 -> 1
else -> fib(n - 1) + fib(n - 2)
}
}
创建了包含以下内容的 src/resources/index.html
文件:
<html>
<head>
<meta charset="UTF-8">
<title>Sample Default</title>
<link rel="stylesheet" href="styles/main.css">
</head>
<body id="BODY">
<h1>Kotlin 1.1 Example</h1>
<div id="container"/>
<input type="text" name="email" id="email"/>
<script type="text/javascript" src="lib/kotlin.js"></script>
<script type="text/javascript" src="lib/kotlinx-html-js.js"></script>
<script type="text/javascript" src="scripts/main.js"></script>
</body>
</html>
创建了包含以下内容的 src/resources/styles/main.css
文件:
#panel {background-color: powderblue;}
h1 {color: blue;}
p {color: red;}
使用 gradle build
构建了项目并且运行完美。
应用结构如下:
我的应用 运行 是:
关于在服务器端工作,我有一个关于创建 jar
文件的问题 and and here,希望您觉得它有用并且对此表示赞赏。
如何在使用 Kotlinx-html
时设置我的 HTML 元素的样式,我的应用程序运行良好,然后我尝试使用 AZA-Kotlin
添加样式,但是一旦我导入 azadev.kotlin
它给了我错误构建
我的完整代码如下:
Main.kt
:
import azadev.kotlin.css.Stylesheet
import azadev.kotlin.css.color
import azadev.kotlin.css.dimens.px
import azadev.kotlin.css.opacity
import azadev.kotlin.css.width
import kotlinx.html.*
import kotlinx.html.js.*
import kotlinx.html.dom.create
import kotlin.browser.*
import kotlinx.html.dom.append
import org.w3c.dom.HTMLButtonElement
fun main(args: Array<String>) {
println("Hello JavaScript!")
val myDiv = document.create.div("panel") { // class = "panel"
p {
+"Here is "
a("http://kotlinlang.org") { +"official Kotlin site" }
}
}
val button = BUTTON()
button!!.innerText = "Click me"
button!!.onclick = { println("Button clicked!") }
val btn = document.create.button {
text("click me")
onClickFunction = { _ -> window.alert("Kotlin!") }
Stylesheet {
color = 0xffffff
width = 10.px
opacity = .8
hover {
color = 0xf2cacf
}
}
}
document.getElementById("container")!!.appendChild(myDiv)
document.getElementById("container")!!.appendChild(btn)
document.getElementById("container")!!.appendChild(button)
document.getElementById("container")!!.append {
div {
+"added it"
}
}
}
fun BUTTON(): HTMLButtonElement {return document.create.button()}
我的gradle.build
是:
group 'org.example'
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.1.51'
ext.kotlinx_html_version = '0.6.4'
ext.aza_kotlin_css = '1.0'
ext.web_dir = 'web'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin2js'
repositories {
mavenCentral()
jcenter()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
compile "org.jetbrains.kotlinx:kotlinx-html-js:$kotlinx_html_version"
compile "azadev.kotlin:aza-kotlin-css:$aza_kotlin_css"
}
compileKotlin2Js {
kotlinOptions.outputFile = "${projectDir}/web/scripts/main.js"
kotlinOptions.moduleKind = "umd"
kotlinOptions.sourceMap = true
}
clean.doFirst() {
delete("${web_dir}")
}
build.doLast() {
// Copy kotlin.js and kotlin-meta.js from jar into web directory
configurations.compile.each { File file ->
copy {
includeEmptyDirs = false
from zipTree(file.absolutePath)
into "${projectDir}/${web_dir}/lib"
include { fileTreeElement ->
def path = fileTreeElement.path
path.endsWith(".js") && (path.startsWith("META-INF/resources/") || !path.startsWith("META-INF/"))
}
}
}
// Copy scripts to web directory
copy {
includeEmptyDirs = false
from new File("build/classes/main")
into "${web_dir}/lib"
}
// Copy resources to web directory
copy {
includeEmptyDirs = false
from new File("src/main/kotlin/resources")
into "${web_dir}"
}
}
我的index.html
是:
<html>
<head>
<meta charset="UTF-8">
<title>Sample Default</title>
</head>
<body id="BODY">
<h1>Kotlin 1.1 Example</h1>
<div id="container"/>
<input type="text" name="email" id="email"/>
<script type="text/javascript" src="lib/kotlin.js"></script>
<script type="text/javascript" src="lib/kotlinx-html-js.js"></script>
<script type="text/javascript" src="scripts/main.js"></script>
</body>
</html>
我的应用结构:
无论使用 Aza-kotlin
还是任何其他方式,我如何设置我的元素的样式。
我在 kotlinx-html
中找到了解决方案,方法是将 style
用作:
val btn = document.create.button {
text("click me")
onClickFunction = { _ -> window.alert("Kotlin!") }
style = """
color: 0xffffff;
width: 10.px;
opacity: .8;
hover {
color : 0xf2cacf
}
"""
}
另一个已知选项是使用 css
文件,并为元素附加所需的 class(s),例如:
val btn = document.create.button(classes = "container left tree") { ... }
//or
val btn = document.create.button {
classes = setOf("container", "left", "tree")
classes += "siteHeader" //
... }
截至今天,aza_kotlin_css
出现问题,应用程序与我一起使用如下 [Mac 新手的详细步骤 :)]
安装 Homebrew
为:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装 gradle
为:brew install gradle
通过运行ning找到安装路径brew info gradle
将 gradle 手动添加到 `Android Studio/Preferences'
创建投影文件夹,并移入cd myapp
作为 gradle init --type java-library
删除了 src/main
和 src/test
文件夹
创建了 src/kotlin
和 src/resources
文件夹
将 build.gradle
文件的内容替换为:
buildscript {
ext.kotlin_version = '1.2.21'
ext.web_dir = 'web'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // for gradle build
}
}
apply plugin: 'kotlin2js'
repositories { jcenter() }
dependencies {
def kotlinx_html_version = "0.6.8"
// for interacting with the DOM
compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
// for DOM creation in the client sie
compile "org.jetbrains.kotlinx:kotlinx-html-js:${kotlinx_html_version}"
// for DOM creation in the server sie
// compile "org.jetbrains.kotlinx:kotlinx-html-jvm:${kotlinx_html_version}"
}
sourceSets.main {
kotlin.srcDirs += 'src/kotlin'
resources.srcDirs += 'src/resources'
}
compileKotlin2Js.kotlinOptions {
outputFile = "${projectDir}/web/scripts/main.js"
moduleKind = "commonjs" // can be other options, commonjs is the one that works with Nodejs
sourceMap = true
}
clean.doFirst() {
delete("${web_dir}")
}
build.doLast() {
// Copy kotlin.js and kotlin-meta.js from jar into web directory
configurations.compile.each { File file ->
copy {
includeEmptyDirs = false
from zipTree(file.absolutePath)
into "${projectDir}/${web_dir}/lib"
include { fileTreeElement ->
def path = fileTreeElement.path
path.endsWith(".js") && (path.startsWith("META-INF/resources/")
|| !path.startsWith("META-INF/"))
}
}
}
// Copy scripts to web directory
copy {
includeEmptyDirs = false
from new File("build/classes/main")
into "${web_dir}/lib"
}
// Copy resources to web directory
copy {
includeEmptyDirs = false
from new File("src/resources")
into "${web_dir}"
}
}
创建了包含以下内容的 src/kotlin/Main.Kt
文件:
import kotlinx.html.*
import kotlinx.html.js.*
import kotlinx.html.dom.create
import kotlin.browser.*
import kotlinx.html.dom.append
import org.w3c.dom.HTMLButtonElement
fun main(args: Array<String>) {
println("Hello JavaScript!, do you know that fib(5) = ${fib(5)}")
val myDiv = document.create.div("panel") { // class = "panel"
p {
+"Here is "
a("http://kotlinlang.org") { +"official Kotlin site" }
}
}
val email = document.getElementById("email") as HTMLInputElement
email.value = "hadi@jetbrains.com"
val button = BUTTON()
button!!.innerText = "Click me"
button!!.onclick = { println("Button clicked!") }
val btn = document.create.button {
text("click me")
onClickFunction = { _ -> window.alert("Kotlin!") }
style = """
color: 0xffffff;
width: 10.px;
opacity: .8;
hover {
color : 0xf2cacf
}
"""
}
/*
// OR use one of the bew to load the style from the .css file
val btn = document.create.button(classes = "container left tree") {
... }
//or
val btn = document.create.button {
classes = setOf("container", "left", "tree")
classes += "siteHeader"
... }
*/
document.getElementById("container")!!.appendChild(myDiv)
document.getElementById("container")!!.appendChild(btn)
document.getElementById("container")!!.appendChild(button)
document.getElementById("container")!!.append {
div {
+"added it"
}
}
}
fun BUTTON(): HTMLButtonElement {return document.create.button()}
创建了另一个文件src/kotlin/Fib.tk
,内容如下,从Main.kt
文件中调用,全部编译为single
JavaScript文件:
fun fib(n: Int):Int {
return when (n) {
0,1 -> 1
else -> fib(n - 1) + fib(n - 2)
}
}
创建了包含以下内容的 src/resources/index.html
文件:
<html>
<head>
<meta charset="UTF-8">
<title>Sample Default</title>
<link rel="stylesheet" href="styles/main.css">
</head>
<body id="BODY">
<h1>Kotlin 1.1 Example</h1>
<div id="container"/>
<input type="text" name="email" id="email"/>
<script type="text/javascript" src="lib/kotlin.js"></script>
<script type="text/javascript" src="lib/kotlinx-html-js.js"></script>
<script type="text/javascript" src="scripts/main.js"></script>
</body>
</html>
创建了包含以下内容的 src/resources/styles/main.css
文件:
#panel {background-color: powderblue;}
h1 {color: blue;}
p {color: red;}
使用 gradle build
构建了项目并且运行完美。
应用结构如下:
我的应用 运行 是:
关于在服务器端工作,我有一个关于创建 jar
文件的问题