Progress Telerik Ultimate Collection 2025 Q2下载地址 https://soft51.cc/software/175792580241152290
Telerik UI提供了完善的主题系统,让开发者能够轻松创建美观、现代化的用户界面。通过丰富的内置主题和灵活的定制选项,可以满足各种设计需求。
Telerik主题架构
├── 基础样式 (Base Styles)
│ ├── 重置样式 (CSS Reset)
│ ├── 字体定义 (Typography)
│ └── 布局网格 (Layout Grid)
├── 组件样式 (Component Styles)
│ ├── 表单控件 (Form Controls)
│ ├── 导航组件 (Navigation)
│ └── 数据展示 (Data Display)
└── 主题变量 (Theme Variables)
├── 颜色系统 (Color Palette)
├── 尺寸规范 (Sizing Scale)
└── 动画效果 (Animations)
经典的Telerik设计风格,适合传统企业应用。
<!-- Default主题引用 -->
<link href="https://kendo.cdn.telerik.com/2023.3.1010/styles/kendo.default-v2.min.css" rel="stylesheet" />
<!-- 示例:Default主题下的按钮组合 -->
<div class="theme-example default-theme">
<h4>Default 主题示例</h4>
<div class="button-group mb-3">
@(Html.Kendo().Button()
.Name("defaultPrimary")
.Content("主要按钮")
.HtmlAttributes(new { @class = "k-button-primary" })
)
@(Html.Kendo().Button()
.Name("defaultSecondary")
.Content("次要按钮")
)
@(Html.Kendo().Button()
.Name("defaultSuccess")
.Content("成功按钮")
.HtmlAttributes(new { @class = "k-button-success" })
)
</div>
<div class="form-example">
@(Html.Kendo().TextBox()
.Name("defaultInput")
.Placeholder("Default主题输入框")
.HtmlAttributes(new { @class = "form-control mb-2" })
)
@(Html.Kendo().DropDownList()
.Name("defaultDropDown")
.BindTo(new[] { "选项1", "选项2", "选项3" })
.OptionLabel("请选择...")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
</div>
与Bootstrap框架完美集成的主题。
<!-- Bootstrap主题引用 -->
<link href="https://kendo.cdn.telerik.com/2023.3.1010/styles/kendo.bootstrap-v4.min.css" rel="stylesheet" />
<div class="theme-example bootstrap-theme">
<h4>Bootstrap 主题示例</h4>
<!-- Bootstrap风格的卡片布局 -->
<div class="card">
<div class="card-header">
<h5 class="card-title">Bootstrap集成示例</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
@(Html.Kendo().DatePicker()
.Name("bootstrapDate")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
<div class="col-md-6">
@(Html.Kendo().NumericTextBox()
.Name("bootstrapNumber")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
</div>
<div class="mt-3">
@(Html.Kendo().Button()
.Name("bootstrapSubmit")
.Content("Bootstrap按钮")
.HtmlAttributes(new { @class = "btn btn-primary" })
)
</div>
</div>
</div>
</div>
Google Material Design风格主题。
<!-- Material主题引用 -->
<link href="https://kendo.cdn.telerik.com/2023.3.1010/styles/kendo.material-v2.min.css" rel="stylesheet" />
<div class="theme-example material-theme">
<h4>Material Design 主题示例</h4>
<!-- Material风格的表单 -->
<div class="material-form">
<div class="form-group mb-3">
@(Html.Kendo().TextBox()
.Name("materialInput")
.Placeholder("Material风格输入")
.HtmlAttributes(new { @class = "k-textbox-material" })
)
</div>
<div class="form-group mb-3">
@(Html.Kendo().Switch()
.Name("materialSwitch")
.Checked(true)
)
<label class="ms-2">启用Material效果</label>
</div>
<!-- Material风格的浮动操作按钮 -->
<div class="fab-container">
@(Html.Kendo().Button()
.Name("materialFab")
.Content("<i class='fa fa-plus'></i>")
.HtmlAttributes(new { @class = "k-button-fab" })
)
</div>
</div>
</div>
<style>
.material-form .k-textbox-material {
border: none;
border-bottom: 2px solid #e0e0e0;
border-radius: 0;
transition: border-color 0.3s ease;
}
.material-form .k-textbox-material:focus {
border-bottom-color: #1976d2;
box-shadow: none;
}
.fab-container {
position: relative;
height: 60px;
}
.k-button-fab {
position: absolute;
right: 20px;
bottom: 20px;
width: 56px;
height: 56px;
border-radius: 50%;
background: #1976d2;
color: white;
border: none;
box-shadow: 0 4px 8px rgba(0,0,0,0.3);
transition: all 0.3s ease;
}
.k-button-fab:hover {
background: #1565c0;
box-shadow: 0 6px 12px rgba(0,0,0,0.4);
}
</style>
Microsoft Fluent Design风格主题。
<!-- Fluent主题引用 -->
<link href="https://kendo.cdn.telerik.com/2023.3.1010/styles/kendo.fluent.min.css" rel="stylesheet" />
<div class="theme-example fluent-theme">
<h4>Fluent Design 主题示例</h4>
<!-- Fluent风格的导航 -->
<div class="fluent-nav mb-3">
@(Html.Kendo().Menu()
.Name("fluentMenu")
.Items(items =>
{
items.Add().Text("首页").SpriteCssClasses("fa fa-home");
items.Add().Text("产品").SpriteCssClasses("fa fa-box");
items.Add().Text("服务").SpriteCssClasses("fa fa-cog");
items.Add().Text("联系").SpriteCssClasses("fa fa-phone");
})
)
</div>
<!-- Fluent风格的数据网格 -->
@(Html.Kendo().Grid<object>()
.Name("fluentGrid")
.Columns(columns =>
{
columns.Bound("Name").Title("名称").Width(150);
columns.Bound("Category").Title("分类").Width(120);
columns.Bound("Price").Title("价格").Format("{0:C}").Width(100);
})
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("GetData", "Home"))
)
.Height(250)
.HtmlAttributes(new { @class = "fluent-grid" })
)
</div>
<style>
.fluent-theme {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
padding: 20px;
border-radius: 8px;
}
.fluent-nav .k-menu {
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(10px);
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.3);
}
.fluent-grid {
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
}
</style>
<div class="theme-selector mb-4">
<h5>主题切换演示</h5>
<div class="btn-group" role="group">
<button type="button" class="btn btn-outline-primary" onclick="switchTheme('default')">
Default
</button>
<button type="button" class="btn btn-outline-primary" onclick="switchTheme('bootstrap')">
Bootstrap
</button>
<button type="button" class="btn btn-outline-primary" onclick="switchTheme('material')">
Material
</button>
<button type="button" class="btn btn-outline-primary" onclick="switchTheme('fluent')">
Fluent
</button>
</div>
</div>
<!-- 主题测试区域 -->
<div id="themeTestArea" class="theme-test-area">
<div class="row">
<div class="col-md-6">
<h6>表单控件</h6>
<div class="form-group mb-2">
@(Html.Kendo().TextBox()
.Name("testInput")
.Placeholder("测试输入框")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
<div class="form-group mb-2">
@(Html.Kendo().DropDownList()
.Name("testDropDown")
.BindTo(new[] { "选项1", "选项2", "选项3" })
.OptionLabel("请选择")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
<div class="form-group mb-2">
@(Html.Kendo().DatePicker()
.Name("testDate")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
</div>
<div class="col-md-6">
<h6>按钮组件</h6>
<div class="button-test-group">
@(Html.Kendo().Button()
.Name("testPrimary")
.Content("主要按钮")
.HtmlAttributes(new { @class = "k-button-primary me-2 mb-2" })
)
@(Html.Kendo().Button()
.Name("testSecondary")
.Content("次要按钮")
.HtmlAttributes(new { @class = "me-2 mb-2" })
)
@(Html.Kendo().Button()
.Name("testSuccess")
.Content("成功按钮")
.HtmlAttributes(new { @class = "k-button-success mb-2" })
)
</div>
</div>
</div>
</div>
<script>
function switchTheme(themeName) {
// 移除现有主题样式
$('link[href*="kendo."]').remove();
// 添加新主题样式
var themeUrl = getThemeUrl(themeName);
$('<link>').attr({
type: 'text/css',
rel: 'stylesheet',
href: themeUrl
}).appendTo('head');
// 更新按钮状态
$('.theme-selector .btn').removeClass('active');
$(`[onclick="switchTheme('${themeName}')"]`).addClass('active');
// 显示切换通知
showNotification(`已切换到 ${getThemeDisplayName(themeName)} 主题`, 'info');
}
function getThemeUrl(themeName) {
var baseUrl = 'https://kendo.cdn.telerik.com/2023.3.1010/styles/';
var themeMap = {
'default': 'kendo.default-v2.min.css',
'bootstrap': 'kendo.bootstrap-v4.min.css',
'material': 'kendo.material-v2.min.css',
'fluent': 'kendo.fluent.min.css'
};
return baseUrl + themeMap[themeName];
}
function getThemeDisplayName(themeName) {
var displayNames = {
'default': 'Default',
'bootstrap': 'Bootstrap',
'material': 'Material Design',
'fluent': 'Fluent Design'
};
return displayNames[themeName] || themeName;
}
// 页面加载时设置默认主题
$(document).ready(function() {
switchTheme('default');
});
</script>
现代Telerik主题支持CSS变量,可以轻松定制颜色和样式。
<div class="custom-theme-demo">
<h5>自定义主题演示</h5>
<!-- 主题定制面板 -->
<div class="theme-customizer mb-4">
<div class="row">
<div class="col-md-3">
<label>主色调</label>
<input type="color" id="primaryColor" value="#007bff" onchange="updateThemeColor('primary', this.value)">
</div>
<div class="col-md-3">
<label>次要颜色</label>
<input type="color" id="secondaryColor" value="#6c757d" onchange="updateThemeColor('secondary', this.value)">
</div>
<div class="col-md-3">
<label>成功颜色</label>
<input type="color" id="successColor" value="#28a745" onchange="updateThemeColor('success', this.value)">
</div>
<div class="col-md-3">
<label>危险颜色</label>
<input type="color" id="dangerColor" value="#dc3545" onchange="updateThemeColor('danger', this.value)">
</div>
</div>
<div class="row mt-3">
<div class="col-md-4">
<label>字体大小</label>
<input type="range" id="fontSize" min="12" max="18" value="14" onchange="updateFontSize(this.value)">
<span id="fontSizeValue">14px</span>
</div>
<div class="col-md-4">
<label>边框圆角</label>
<input type="range" id="borderRadius" min="0" max="20" value="4" onchange="updateBorderRadius(this.value)">
<span id="borderRadiusValue">4px</span>
</div>
<div class="col-md-4">
<label>间距大小</label>
<input type="range" id="spacing" min="8" max="24" value="16" onchange="updateSpacing(this.value)">
<span id="spacingValue">16px</span>
</div>
</div>
</div>
<!-- 预览区域 -->
<div class="custom-preview" id="customPreview">
<div class="preview-buttons mb-3">
@(Html.Kendo().Button()
.Name("customPrimary")
.Content("主要按钮")
.HtmlAttributes(new { @class = "custom-btn-primary me-2" })
)
@(Html.Kendo().Button()
.Name("customSecondary")
.Content("次要按钮")
.HtmlAttributes(new { @class = "custom-btn-secondary me-2" })
)
@(Html.Kendo().Button()
.Name("customSuccess")
.Content("成功按钮")
.HtmlAttributes(new { @class = "custom-btn-success" })
)
</div>
<div class="preview-form">
@(Html.Kendo().TextBox()
.Name("customInput")
.Placeholder("自定义输入框")
.HtmlAttributes(new { @class = "custom-input mb-2" })
)
@(Html.Kendo().DropDownList()
.Name("customDropDown")
.BindTo(new[] { "选项A", "选项B", "选项C" })
.OptionLabel("自定义下拉框")
.HtmlAttributes(new { @class = "custom-dropdown" })
)
</div>
</div>
</div>
<style>
:root {
--custom-primary: #007bff;
--custom-secondary: #6c757d;
--custom-success: #28a745;
--custom-danger: #dc3545;
--custom-font-size: 14px;
--custom-border-radius: 4px;
--custom-spacing: 16px;
}
.custom-theme-demo {
padding: var(--custom-spacing);
border: 1px solid #dee2e6;
border-radius: var(--custom-border-radius);
background: #f8f9fa;
}
.theme-customizer {
background: white;
padding: var(--custom-spacing);
border-radius: var(--custom-border-radius);
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.theme-customizer label {
display: block;
font-size: var(--custom-font-size);
font-weight: 600;
margin-bottom: 8px;
}
.theme-customizer input[type="color"] {
width: 100%;
height: 40px;
border: none;
border-radius: var(--custom-border-radius);
}
.theme-customizer input[type="range"] {
width: calc(100% - 60px);
margin-right: 10px;
}
.custom-preview {
background: white;
padding: var(--custom-spacing);
border-radius: var(--custom-border-radius);
margin-top: var(--custom-spacing);
}
.custom-btn-primary {
background-color: var(--custom-primary) !important;
border-color: var(--custom-primary) !important;
border-radius: var(--custom-border-radius) !important;
font-size: var(--custom-font-size) !important;
}
.custom-btn-secondary {
background-color: var(--custom-secondary) !important;
border-color: var(--custom-secondary) !important;
border-radius: var(--custom-border-radius) !important;
font-size: var(--custom-font-size) !important;
}
.custom-btn-success {
background-color: var(--custom-success) !important;
border-color: var(--custom-success) !important;
border-radius: var(--custom-border-radius) !important;
font-size: var(--custom-font-size) !important;
}
.custom-input,
.custom-dropdown {
border-radius: var(--custom-border-radius) !important;
font-size: var(--custom-font-size) !important;
padding: var(--custom-spacing) !important;
}
</style>
<script>
function updateThemeColor(colorType, value) {
document.documentElement.style.setProperty(`--custom-${colorType}`, value);
}
function updateFontSize(value) {
document.documentElement.style.setProperty('--custom-font-size', value + 'px');
document.getElementById('fontSizeValue').textContent = value + 'px';
}
function updateBorderRadius(value) {
document.documentElement.style.setProperty('--custom-border-radius', value + 'px');
document.getElementById('borderRadiusValue').textContent = value + 'px';
}
function updateSpacing(value) {
document.documentElement.style.setProperty('--custom-spacing', value + 'px');
document.getElementById('spacingValue').textContent = value + 'px';
}
</script>
<div class="responsive-demo">
<h5>响应式设计演示</h5>
<!-- 响应式网格 -->
<div class="responsive-grid mb-4">
@(Html.Kendo().Grid<object>()
.Name("responsiveGrid")
.Columns(columns =>
{
columns.Bound("Name").Title("产品名称").Width(200).Media("(min-width: 768px)");
columns.Bound("Price").Title("价格").Width(120).Format("{0:C}");
columns.Bound("Category").Title("分类").Width(150).Media("(min-width: 992px)");
columns.Bound("Stock").Title("库存").Width(100).Media("(min-width: 576px)");
columns.Command(command => command.Edit()).Width(100);
})
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("GetProducts", "Home"))
)
.Mobile(MobileMode.Auto)
.Height(300)
)
</div>
<!-- 响应式表单 -->
<div class="responsive-form">
<div class="container-fluid">
<div class="row">
<div class="col-lg-4 col-md-6 col-sm-12">
<div class="form-group mb-3">
<label>产品名称</label>
@(Html.Kendo().TextBox()
.Name("responsiveName")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
</div>
<div class="col-lg-4 col-md-6 col-sm-12">
<div class="form-group mb-3">
<label>价格</label>
@(Html.Kendo().NumericTextBox()
.Name("responsivePrice")
.Format("c2")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
</div>
<div class="col-lg-4 col-md-12 col-sm-12">
<div class="form-group mb-3">
<label>分类</label>
@(Html.Kendo().DropDownList()
.Name("responsiveCategory")
.BindTo(new[] { "电子", "服装", "图书" })
.OptionLabel("请选择")
.HtmlAttributes(new { @class = "form-control" })
)
</div>
</div>
</div>
<!-- 响应式按钮组 -->
<div class="responsive-buttons">
<div class="d-flex flex-wrap gap-2">
@(Html.Kendo().Button()
.Name("responsiveSave")
.Content("<i class='fa fa-save d-md-none'></i><span class='d-none d-md-inline'>保存</span>")
.HtmlAttributes(new { @class = "btn-primary" })
)
@(Html.Kendo().Button()
.Name("responsiveCancel")
.Content("<i class='fa fa-times d-md-none'></i><span class='d-none d-md-inline'>取消</span>")
.HtmlAttributes(new { @class = "btn-secondary" })
)
@(Html.Kendo().Button()
.Name("responsiveDelete")
.Content("<i class='fa fa-trash d-md-none'></i><span class='d-none d-md-inline'>删除</span>")
.HtmlAttributes(new { @class = "btn-danger" })
)
</div>
</div>
</div>
</div>
</div>
<style>
/* 响应式样式 */
.responsive-demo {
padding: 16px;
}
/* 小屏幕优化 */
@media (max-width: 576px) {
.responsive-demo {
padding: 8px;
}
.k-grid-header th {
font-size: 12px;
padding: 4px;
}
.k-grid td {
font-size: 12px;
padding: 4px;
}
.responsive-buttons .k-button {
min-width: 44px;
min-height: 44px;
}
}
/* 中等屏幕优化 */
@media (min-width: 577px) and (max-width: 991px) {
.responsive-form .form-group label {
font-size: 14px;
}
.k-button {
padding: 8px 16px;
}
}
/* 大屏幕优化 */
@media (min-width: 992px) {
.responsive-demo {
padding: 24px;
}
.responsive-form .form-group {
margin-bottom: 24px;
}
}
/* 触摸设备优化 */
@media (pointer: coarse) {
.k-button,
.k-textbox,
.k-dropdown {
min-height: 44px;
font-size: 16px;
}
.k-grid .k-command-cell .k-button {
padding: 8px;
margin: 2px;
}
}
/* 深色模式支持 */
@media (prefers-color-scheme: dark) {
.responsive-demo {
background-color: #2d3748;
color: #e2e8f0;
}
.responsive-form {
background-color: #4a5568;
}
}
/* 打印样式 */
@media print {
.responsive-buttons {
display: none;
}
.k-grid .k-command-cell {
display: none;
}
.responsive-demo {
background: white;
color: black;
}
}
</style>
<div class="theme-builder">
<h5>主题构建工具</h5>
<!-- 主题配置面板 -->
<div class="theme-config-panel">
<div class="config-section">
<h6>基础配置</h6>
<div class="row">
<div class="col-md-6">
<div class="form-group mb-3">
<label>主题名称</label>
<input type="text" id="themeName" class="form-control" value="my-custom-theme" />
</div>
</div>
<div class="col-md-6">
<div class="form-group mb-3">
<label>基础主题</label>
<select id="baseTheme" class="form-control">
<option value="default">Default</option>
<option value="bootstrap">Bootstrap</option>
<option value="material">Material</option>
<option value="fluent">Fluent</option>
</select>
</div>
</div>
</div>
</div>
<div class="config-section">
<h6>颜色配置</h6>
<div class="color-config">
<div class="row">
<div class="col-md-3">
<div class="color-item">
<label>主色调</label>
<div class="color-input-group">
<input type="color" id="themeBackground" value="#ffffff" />
<input type="text" value="#ffffff" readonly />
</div>
</div>
</div>
<div class="col-md-3">
<div class="color-item">
<label>文字颜色</label>
<div class="color-input-group">
<input type="color" id="themeText" value="#333333" />
<input type="text" value="#333333" readonly />
</div>
</div>
</div>
<div class="col-md-3">
<div class="color-item">
<label>边框颜色</label>
<div class="color-input-group">
<input type="color" id="themeBorder" value="#dee2e6" />
<input type="text" value="#dee2e6" readonly />
</div>
</div>
</div>
</div>
</div>
</div>
<div class="config-section">
<h6>尺寸配置</h6>
<div class="row">
<div class="col-md-4">
<div class="form-group mb-3">
<label>基础字体大小 <span id="baseFontSizeValue">14px</span></label>
<input type="range" id="baseFontSize" min="12" max="18" value="14" class="form-range" />
</div>
</div>
<div class="col-md-4">
<div class="form-group mb-3">
<label>边框圆角 <span id="borderRadiusValue">4px</span></label>
<input type="range" id="borderRadius" min="0" max="16" value="4" class="form-range" />
</div>
</div>
<div class="col-md-4">
<div class="form-group mb-3">
<label>组件高度 <span id="componentHeightValue">32px</span></label>
<input type="range" id="componentHeight" min="28" max="48" value="32" class="form-range" />
</div>
</div>
</div>
</div>
<!-- 操作按钮 -->
<div class="theme-actions">
<button type="button" class="btn btn-primary" onclick="generateTheme()">
生成主题
</button>
<button type="button" class="btn btn-secondary" onclick="previewTheme()">
预览效果
</button>
<button type="button" class="btn btn-success" onclick="downloadTheme()">
下载CSS
</button>
<button type="button" class="btn btn-info" onclick="resetTheme()">
重置配置
</button>
</div>
</div>
<!-- 生成的CSS预览 -->
<div class="css-preview mt-4" style="display: none;">
<h6>生成的CSS代码</h6>
<pre><code id="generatedCSS" class="language-css"></code></pre>
<button type="button" class="btn btn-outline-primary btn-sm" onclick="copyCSS()">
复制CSS代码
</button>
</div>
</div>
<style>
.theme-builder {
background: #f8f9fa;
padding: 24px;
border-radius: 8px;
border: 1px solid #dee2e6;
}
.theme-config-panel {
background: white;
padding: 20px;
border-radius: 6px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.config-section {
margin-bottom: 24px;
padding-bottom: 20px;
border-bottom: 1px solid #e9ecef;
}
.config-section:last-child {
border-bottom: none;
margin-bottom: 0;
}
.config-section h6 {
color: #495057;
font-weight: 600;
margin-bottom: 16px;
}
.color-item {
text-align: center;
}
.color-item label {
display: block;
font-size: 12px;
font-weight: 600;
color: #6c757d;
margin-bottom: 8px;
}
.color-input-group {
display: flex;
flex-direction: column;
gap: 4px;
}
.color-input-group input[type="color"] {
width: 100%;
height: 40px;
border: 2px solid #dee2e6;
border-radius: 4px;
cursor: pointer;
}
.color-input-group input[type="text"] {
width: 100%;
padding: 4px 8px;
border: 1px solid #ced4da;
border-radius: 3px;
font-size: 11px;
text-align: center;
background: #f8f9fa;
}
.form-range {
width: 100%;
}
.theme-actions {
text-align: center;
padding-top: 20px;
border-top: 1px solid #e9ecef;
}
.theme-actions .btn {
margin: 0 8px 8px 0;
}
.css-preview {
background: white;
padding: 20px;
border-radius: 6px;
border: 1px solid #dee2e6;
}
.css-preview pre {
background: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 4px;
padding: 16px;
max-height: 300px;
overflow-y: auto;
font-size: 12px;
}
.css-preview code {
color: #d63384;
}
</style>
<script>
$(document).ready(function() {
// 初始化颜色选择器事件
$('.color-input-group input[type="color"]').on('change', function() {
$(this).next('input[type="text"]').val($(this).val());
updatePreview();
});
// 初始化范围滑块事件
$('#baseFontSize').on('input', function() {
$('#baseFontSizeValue').text($(this).val() + 'px');
updatePreview();
});
$('#borderRadius').on('input', function() {
$('#borderRadiusValue').text($(this).val() + 'px');
updatePreview();
});
$('#componentHeight').on('input', function() {
$('#componentHeightValue').text($(this).val() + 'px');
updatePreview();
});
});
function generateTheme() {
var themeConfig = collectThemeConfig();
var cssCode = generateThemeCSS(themeConfig);
$('#generatedCSS').text(cssCode);
$('.css-preview').show();
showNotification('主题CSS已生成', 'success');
}
function previewTheme() {
var themeConfig = collectThemeConfig();
applyThemePreview(themeConfig);
showNotification('主题预览已应用', 'info');
}
function downloadTheme() {
var themeConfig = collectThemeConfig();
var cssCode = generateThemeCSS(themeConfig);
var themeName = $('#themeName').val() || 'custom-theme';
downloadFile(cssCode, themeName + '.css', 'text/css');
showNotification('主题文件已下载', 'success');
}
function resetTheme() {
// 重置所有配置到默认值
$('#themeName').val('my-custom-theme');
$('#baseTheme').val('default');
$('#themePrimary').val('#007bff').trigger('change');
$('#themeBackground').val('#ffffff').trigger('change');
$('#themeText').val('#333333').trigger('change');
$('#themeBorder').val('#dee2e6').trigger('change');
$('#baseFontSize').val(14).trigger('input');
$('#borderRadius').val(4).trigger('input');
$('#componentHeight').val(32).trigger('input');
$('.css-preview').hide();
showNotification('配置已重置', 'info');
}
function collectThemeConfig() {
return {
name: $('#themeName').val(),
base: $('#baseTheme').val(),
colors: {
primary: $('#themePrimary').val(),
background: $('#themeBackground').val(),
text: $('#themeText').val(),
border: $('#themeBorder').val()
},
sizes: {
fontSize: $('#baseFontSize').val() + 'px',
borderRadius: $('#borderRadius').val() + 'px',
componentHeight: $('#componentHeight').val() + 'px'
}
};
}
function generateThemeCSS(config) {
return `/* ${config.name} - Custom Telerik Theme */
/* Generated on ${new Date().toISOString()} */
:root {
/* Color Variables */
--theme-primary: ${config.colors.primary};
--theme-background: ${config.colors.background};
--theme-text: ${config.colors.text};
--theme-border: ${config.colors.border};
/* Size Variables */
--theme-font-size: ${config.sizes.fontSize};
--theme-border-radius: ${config.sizes.borderRadius};
--theme-component-height: ${config.sizes.componentHeight};
}
/* Base Styles */
.k-widget,
.k-button,
.k-textbox,
.k-dropdown {
font-size: var(--theme-font-size);
border-radius: var(--theme-border-radius);
min-height: var(--theme-component-height);
}
/* Primary Button */
.k-button-primary,
.k-button.k-primary {
background-color: var(--theme-primary);
border-color: var(--theme-primary);
color: white;
}
.k-button-primary:hover,
.k-button.k-primary:hover {
background-color: color-mix(in srgb, var(--theme-primary) 85%, black);
border-color: color-mix(in srgb, var(--theme-primary) 85%, black);
}
/* Form Controls */
.k-textbox,
.k-dropdown-wrap {
border-color: var(--theme-border);
background-color: var(--theme-background);
color: var(--theme-text);
}
.k-textbox:focus,
.k-dropdown-wrap.k-state-focused {
border-color: var(--theme-primary);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--theme-primary) 25%, transparent);
}
/* Grid Styles */
.k-grid {
border-color: var(--theme-border);
}
.k-grid-header th {
background-color: color-mix(in srgb, var(--theme-primary) 10%, var(--theme-background));
border-color: var(--theme-border);
color: var(--theme-text);
}
.k-grid tbody tr:hover {
background-color: color-mix(in srgb, var(--theme-primary) 5%, var(--theme-background));
}`;
}
function applyThemePreview(config) {
// 创建临时样式标签应用预览
var existingStyle = document.getElementById('theme-preview-style');
if (existingStyle) {
existingStyle.remove();
}
var style = document.createElement('style');
style.id = 'theme-preview-style';
style.textContent = generateThemeCSS(config);
document.head.appendChild(style);
}
function updatePreview() {
// 实时预览功能(可选)
var config = collectThemeConfig();
applyThemePreview(config);
}
function copyCSS() {
var cssCode = $('#generatedCSS').text();
navigator.clipboard.writeText(cssCode).then(function() {
showNotification('CSS代码已复制到剪贴板', 'success');
});
}
function downloadFile(content, filename, contentType) {
var blob = new Blob([content], { type: contentType });
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
}
function showNotification(message, type) {
var alertClass = 'alert-info';
switch(type) {
case 'success': alertClass = 'alert-success'; break;
case 'error': alertClass = 'alert-danger'; break;
case 'warning': alertClass = 'alert-warning'; break;
}
var alert = $(`<div class="alert ${alertClass} alert-dismissible fade show position-fixed" style="top: 20px; right: 20px; z-index: 9999;">
${message}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>`);
$('body').append(alert);
setTimeout(() => alert.alert('close'), 3000);
}
</script>
<!-- 主题加载优化 -->
<link rel="preload" href="path/to/kendo.theme.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="path/to/kendo.theme.css"></noscript>
<!-- 关键CSS内联 -->
<style>
/* 关键样式内联以避免FOUC */
.k-button {
display: inline-block;
padding: 8px 16px;
border: 1px solid transparent;
}
</style>
<!-- CDN优化 -->
<link href="https://kendo.cdn.telerik.com/2023.3.1010/styles/kendo.default-v2.min.css"
rel="stylesheet"
crossorigin="anonymous"
integrity="sha384-example-hash">
/* 高对比度模式支持 */
@media (prefers-contrast: high) {
.k-button {
border-width: 2px;
}
.k-textbox:focus {
outline: 3px solid;
outline-offset: 2px;
}
}
/* 减少动画模式 */
@media (prefers-reduced-motion: reduce) {
.k-animation-container,
.k-widget * {
animation-duration: 0.01ms !important;
animation-delay: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
/* 键盘导航优化 */
.k-button:focus,
.k-textbox:focus,
.k-dropdown:focus {
outline: 2px solid #005fcc;
outline-offset: 2px;
}
// 主题版本管理
const ThemeManager = {
version: '1.0.0',
themes: {
light: 'kendo.default-v2.min.css',
dark: 'kendo.dark-v2.min.css',
custom: 'custom-theme.css'
},
// 加载主题
loadTheme: function(themeName) {
const themeUrl = this.themes[themeName];
if (!themeUrl) return;
// 移除旧主题
this.removeCurrentTheme();
// 加载新主题
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = themeUrl;
link.id = 'current-theme';
document.head.appendChild(link);
// 保存用户偏好
localStorage.setItem('preferred-theme', themeName);
},
// 移除当前主题
removeCurrentTheme: function() {
const currentTheme = document.getElementById('current-theme');
if (currentTheme) {
currentTheme.remove();
}
},
// 初始化主题
init: function() {
const savedTheme = localStorage.getItem('preferred-theme') || 'light';
this.loadTheme(savedTheme);
}
};
// 页面加载时初始化
document.addEventListener('DOMContentLoaded', function() {
ThemeManager.init();
});
本教程全面介绍了Telerik UI的主题与样式定制:
内置主题:
自定义皮肤:
最佳实践:
通过掌握这些主题定制技术,您可以创建符合品牌标识和用户需求的美观界面,提升应用程序的视觉效果和用户体验。Telerik的主题系统为开发者提供了强大的定制能力,既保证了一致性,又具备了充分的灵活性。
Progress Telerik Ultimate Collection 2025 Q2下载地址 https://soft51.cc/software/175792580241152290