使用远程预配和 CSS 自定义 SharePoint 页面

可以使用级联样式表 (CSS) 自定义 SharePoint 格式文本字段和 Web 部件区域。 要自定义格式文本字段,可以在编辑的页面上执行此操作。 对于 Web 部件区域,可以使用脚本编辑器 Web 部件添加 HTML 或脚本或关联 CSS 样式表。

有关与本文相关联的代码示例,请参阅 GitHub 上 Office 365 开发人员模式和做法项目中的 Branding.AlternateCSSAndSiteLogo

重要

此可扩展性选项适用于经典 SharePoint 体验。 不能将此选项用于 SharePoint Online 中的新式体验(如通信网站)。 此外,还请注意,应依赖 html 页面结构或现成的 CSS 样式名称,因为会在不通知的情况下对其进行调整。

自定义格式文本字段

可以直接在页面编辑器中使用 CSS 自定义格式文本字段:

  1. 在 SharePoint 页上,选择“编辑”以打开页面编辑器。

  2. 从功能区中,选择“插入”>“嵌入代码”

现在可以为格式文本字段添加或修改 CSS 元素。

自定义 Web 部件区域

若要使用 CSS 来自定义 Web 部件区域,请使用脚本编辑器 Web 部件。

注意

如果使用的是 SharePoint Online 和 NoScript 功能,将禁用脚本编辑器 Web 部件。

以下代码示例将自定义 CSS 上载到资源库、使用自定义操作将引用应用到 CSS URL,然后创建自定义操作构建指向新 CSS 文件的链接。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.EventReceivers;

namespace AlternateCSSAppAutohostedWeb.Services
{
    public class AppEventReceiver : IRemoteEventService
    {
        public SPRemoteEventResult ProcessEvent(SPRemoteEventProperties properties)
        {
            SPRemoteEventResult result = new SPRemoteEventResult();

            try
            {
                using (ClientContext clientContext = TokenHelper.CreateAppEventClientContext(properties, false))
                {
                    if (clientContext != null)
                    {
                        Web hostWebObj = clientContext.Web;

                        List assetLibrary = hostWebObj.Lists.GetByTitle("Site Assets");
                        clientContext.Load(assetLibrary, l => l.RootFolder);

                        // First, upload the CSS files to the Asset Library.
                        DirectoryInfo themeDir = new DirectoryInfo(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "CSS");
                        foreach (var themeFile in themeDir.EnumerateFiles())
                        {
                            FileCreationInformation newFile = new FileCreationInformation();
                            newFile.Content = System.IO.File.ReadAllBytes(themeFile.FullName);
                            newFile.Url = themeFile.Name;
                            newFile.Overwrite = true;

                            Microsoft.SharePoint.Client.File uploadAsset = assetLibrary.RootFolder.Files.Add(newFile);
                            clientContext.Load(uploadAsset);
                            break;
                        }
                        
                        string actionName = "SampleCSSLink";

                        // Now, apply a reference to the CSS URL via a custom action.
                        
                        // Clean up existing actions that we may have deployed.
                        var existingActions = hostWebObj.UserCustomActions;
                        clientContext.Load(existingActions);

                        // Run uploads and initialize the existing Actions collection.
                        clientContext.ExecuteQuery();

                        // Clean up existing actions.
                        foreach (var existingAction in existingActions)
                        {
                            if(existingAction.Name.Equals(actionName, StringComparison.InvariantCultureIgnoreCase))
                                existingAction.DeleteObject();
                        }
                        clientContext.ExecuteQuery();

                        // Build a custom action to write a link to your new CSS file.
                        UserCustomAction cssAction = hostWebObj.UserCustomActions.Add();
                        cssAction.Location = "ScriptLink";
                        cssAction.Sequence = 100;
                        cssAction.ScriptBlock = @"document.write('<link rel=""stylesheet"" href=""" + assetLibrary.RootFolder.ServerRelativeUrl + @"/cs-style.css"" />');";
                        cssAction.Name = actionName;
                        
                        // Apply.
                        cssAction.Update();
                        clientContext.ExecuteQuery();
                    }
                    result.Status = SPRemoteEventServiceStatus.Continue;
                    return result;
                }
            }
            catch (Exception ex)
            {
                result.Status = SPRemoteEventServiceStatus.CancelWithError;
                result.ErrorMessage = ex.Message;
                return result;
            }
            
        }

        public void ProcessOneWayEvent(SPRemoteEventProperties properties)
        {
            // This method is not used by app events.
        }
    }
}

另请参阅